From: Sarah Hoffmann Date: Wed, 12 Jul 2023 12:04:30 +0000 (+0200) Subject: avoid forwarding variables via SQL X-Git-Tag: v4.3.0~53^2~2 X-Git-Url: https://git.openstreetmap.org./nominatim.git/commitdiff_plain/d42e2e391f1e0ac252f8251561d984a72bd3b1ff?hp=f264eaeda292fc93f446c35a1cc828cab01917d1 avoid forwarding variables via SQL --- diff --git a/nominatim/api/results.py b/nominatim/api/results.py index 2fe54711..d425ff6c 100644 --- a/nominatim/api/results.py +++ b/nominatim/api/results.py @@ -302,7 +302,9 @@ def create_from_osmline_row(row: Optional[SaRow], def create_from_tiger_row(row: Optional[SaRow], - class_type: Type[BaseResultT]) -> Optional[BaseResultT]: + class_type: Type[BaseResultT], + osm_type: Optional[str] = None, + osm_id: Optional[int] = None) -> Optional[BaseResultT]: """ Construct a new result and add the data from the result row from the Tiger data interpolation table. 'class_type' defines the type of result to return. Returns None if the row is None. @@ -317,7 +319,7 @@ def create_from_tiger_row(row: Optional[SaRow], res = class_type(source_table=SourceTable.TIGER, place_id=row.place_id, - osm_object=(row.osm_type, row.osm_id), + osm_object=(osm_type or row.osm_type, osm_id or row.osm_id), category=('place', 'houses' if hnr is None else 'house'), postcode=row.postcode, country_code='us', diff --git a/nominatim/api/reverse.py b/nominatim/api/reverse.py index 38f993be..6a76becd 100644 --- a/nominatim/api/reverse.py +++ b/nominatim/api/reverse.py @@ -7,7 +7,8 @@ """ Implementation of reverse geocoding. """ -from typing import Optional, List, Callable, Type, Tuple, Dict, Any +from typing import Optional, List, Callable, Type, Tuple, Dict, Any, cast +import functools import sqlalchemy as sa @@ -270,9 +271,7 @@ class ReverseGeocoder: return (await self.conn.execute(sql, self.bind_params)).one_or_none() - async def _find_tiger_number_for_street(self, parent_place_id: int, - parent_type: str, - parent_id: int) -> Optional[SaRow]: + async def _find_tiger_number_for_street(self, parent_place_id: int) -> Optional[SaRow]: t = self.conn.t.tiger def _base_query() -> SaSelect: @@ -287,8 +286,6 @@ class ReverseGeocoder: return sa.select(inner.c.place_id, inner.c.parent_place_id, - sa.sql.expression.label('osm_type', parent_type), - sa.sql.expression.label('osm_id', parent_id), _interpolated_housenumber(inner), _interpolated_position(inner), inner.c.postcode, @@ -332,14 +329,15 @@ class ReverseGeocoder: distance = addr_row.distance elif row.country_code == 'us' and parent_place_id is not None: log().comment('Find TIGER housenumber for street') - addr_row = await self._find_tiger_number_for_street(parent_place_id, - row.osm_type, - row.osm_id) + addr_row = await self._find_tiger_number_for_street(parent_place_id) log().var_dump('Result (street Tiger housenumber)', addr_row) if addr_row is not None: + row_func = cast(RowFunc, + functools.partial(nres.create_from_tiger_row, + osm_type=row.osm_type, + osm_id=row.osm_id)) row = addr_row - row_func = nres.create_from_tiger_row else: distance = row.distance