X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/70f6f9a711727150532a9b958f279435901d4805..46a10cf8146e16d9da7bb21e5976d9c62b69fdd1:/nominatim/api/results.py diff --git a/nominatim/api/results.py b/nominatim/api/results.py index 7839859f..10f03393 100644 --- a/nominatim/api/results.py +++ b/nominatim/api/results.py @@ -21,6 +21,7 @@ import sqlalchemy as sa from nominatim.typing import SaSelect, SaRow from nominatim.api.types import Point, LookupDetails from nominatim.api.connection import SearchConnection +from nominatim.api.logging import log # This file defines complex result data classes. # pylint: disable=too-many-instance-attributes @@ -105,6 +106,9 @@ class SearchResult: geometry: Dict[str, str] = dataclasses.field(default_factory=dict) + def __post_init__(self) -> None: + if self.indexed_date is not None and self.indexed_date.tzinfo is None: + self.indexed_date = self.indexed_date.replace(tzinfo=dt.timezone.utc) @property def lat(self) -> float: @@ -128,13 +132,6 @@ class SearchResult: return self.importance or (0.7500001 - (self.rank_search/40.0)) - # pylint: disable=consider-using-f-string - def centroid_as_geojson(self) -> str: - """ Get the centroid in GeoJSON format. - """ - return '{"type": "Point","coordinates": [%f, %f]}' % self.centroid - - def _filter_geometries(row: SaRow) -> Dict[str, str]: return {k[9:]: v for k, v in row._mapping.items() # pylint: disable=W0212 if k.startswith('geometry_')} @@ -162,7 +159,7 @@ def create_from_placex_row(row: SaRow) -> SearchResult: importance=row.importance, country_code=row.country_code, indexed_date=getattr(row, 'indexed_date'), - centroid=Point(row.x, row.y), + centroid=Point.from_wkb(row.centroid.data), geometry=_filter_geometries(row)) @@ -182,7 +179,7 @@ def create_from_osmline_row(row: SaRow) -> SearchResult: 'step': str(row.step)}, country_code=row.country_code, indexed_date=getattr(row, 'indexed_date'), - centroid=Point(row.x, row.y), + centroid=Point.from_wkb(row.centroid.data), geometry=_filter_geometries(row)) @@ -199,7 +196,24 @@ def create_from_tiger_row(row: SaRow) -> SearchResult: 'endnumber': str(row.endnumber), 'step': str(row.step)}, country_code='us', - centroid=Point(row.x, row.y), + centroid=Point.from_wkb(row.centroid.data), + geometry=_filter_geometries(row)) + + +def create_from_postcode_row(row: SaRow) -> SearchResult: + """ Construct a new SearchResult and add the data from the result row + from the postcode centroid table. + """ + return SearchResult(source_table=SourceTable.POSTCODE, + place_id=row.place_id, + parent_place_id=row.parent_place_id, + category=('place', 'postcode'), + names={'ref': row.postcode}, + rank_search=row.rank_search, + rank_address=row.rank_address, + country_code=row.country_code, + centroid=Point.from_wkb(row.centroid.data), + indexed_date=row.indexed_date, geometry=_filter_geometries(row)) @@ -208,13 +222,18 @@ async def add_result_details(conn: SearchConnection, result: SearchResult, """ Retrieve more details from the database according to the parameters specified in 'details'. """ + log().section('Query details for result') if details.address_details: + log().comment('Query address details') await complete_address_details(conn, result) if details.linked_places: + log().comment('Query linked places') await complete_linked_places(conn, result) if details.parented_places: + log().comment('Query parent places') await complete_parented_places(conn, result) if details.keywords: + log().comment('Query keywords') await complete_keywords(conn, result)