X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/004883bdb1cfdfea053cb59fe32792c4e368e88c..f335e78d1eb54737202aa7a1bafaece19b6659a6:/nominatim/api/logging.py diff --git a/nominatim/api/logging.py b/nominatim/api/logging.py index fdff73be..351da9a1 100644 --- a/nominatim/api/logging.py +++ b/nominatim/api/logging.py @@ -7,7 +7,7 @@ """ Functions for specialised logging with HTML output. """ -from typing import Any, Iterator, Optional, List, cast +from typing import Any, Iterator, Optional, List, Tuple, cast from contextvars import ContextVar import textwrap import io @@ -24,6 +24,13 @@ except ModuleNotFoundError: CODE_HIGHLIGHT = False +def _debug_name(res: Any) -> str: + if res.names: + return cast(str, res.names.get('name', next(iter(res.names.values())))) + + return f"Hnr {res.housenumber}" if res.housenumber is not None else '[NONE]' + + class BaseLogger: """ Interface for logging function. @@ -61,6 +68,11 @@ class BaseLogger: """ + def result_dump(self, heading: str, results: Iterator[Tuple[Any, Any]]) -> None: + """ Print a list of search results generated by the generator function. + """ + + def sql(self, conn: AsyncConnection, statement: 'sa.Executable') -> None: """ Print the SQL for the given statement. """ @@ -128,6 +140,38 @@ class HTMLLogger(BaseLogger): self._write('') + def result_dump(self, heading: str, results: Iterator[Tuple[Any, Any]]) -> None: + """ Print a list of search results generated by the generator function. + """ + def format_osm(osm_object: Optional[Tuple[str, int]]) -> str: + if not osm_object: + return '-' + + t, i = osm_object + if t == 'N': + fullt = 'node' + elif t == 'W': + fullt = 'way' + elif t == 'R': + fullt = 'relation' + else: + return f'{t}{i}' + + return f'{t}{i}' + + self._write(f'
{heading}

') + total = 0 + for rank, res in results: + self._write(f'
[{rank:.3f}]
{res.source_table.name}(') + self._write(f"{_debug_name(res)}, type=({','.join(res.category)}), ") + self._write(f"rank={res.rank_address}, ") + self._write(f"osm={format_osm(res.osm_object)}, ") + self._write(f'cc={res.country_code}, ') + self._write(f'importance={res.importance or -1:.5f})
') + total += 1 + self._write(f'
TOTAL: {total}

') + + def sql(self, conn: AsyncConnection, statement: 'sa.Executable') -> None: sqlstr = self.format_sql(conn, statement) if CODE_HIGHLIGHT: @@ -206,6 +250,20 @@ class TextLogger(BaseLogger): self._write('-'*tablewidth + '\n') + def result_dump(self, heading: str, results: Iterator[Tuple[Any, Any]]) -> None: + self._write(f'{heading}:\n') + total = 0 + for rank, res in results: + self._write(f'[{rank:.3f}] {res.source_table.name}(') + self._write(f"{_debug_name(res)}, type=({','.join(res.category)}), ") + self._write(f"rank={res.rank_address}, ") + self._write(f"osm={''.join(map(str, res.osm_object or []))}, ") + self._write(f'cc={res.country_code}, ') + self._write(f'importance={res.importance or -1:.5f})\n') + total += 1 + self._write(f'TOTAL: {total}\n\n') + + def sql(self, conn: AsyncConnection, statement: 'sa.Executable') -> None: sqlstr = '\n| '.join(textwrap.wrap(self.format_sql(conn, statement), width=78)) self._write(f"| {sqlstr}\n\n")