add type annotations to database check functions

This commit is contained in:
Sarah Hoffmann 2022-07-17 09:59:51 +02:00
parent a21d4d3ac4
commit 459ab3bbdc

View File

@ -7,10 +7,12 @@
""" """
Collection of functions that check if the database is complete and functional. Collection of functions that check if the database is complete and functional.
""" """
from typing import Callable, Optional, Any, Union, Tuple, Mapping, List
from enum import Enum from enum import Enum
from textwrap import dedent from textwrap import dedent
from nominatim.db.connection import connect from nominatim.config import Configuration
from nominatim.db.connection import connect, Connection
from nominatim.errors import UsageError from nominatim.errors import UsageError
from nominatim.tokenizer import factory as tokenizer_factory from nominatim.tokenizer import factory as tokenizer_factory
@ -25,14 +27,17 @@ class CheckState(Enum):
NOT_APPLICABLE = 3 NOT_APPLICABLE = 3
WARN = 4 WARN = 4
def _check(hint=None): CheckResult = Union[CheckState, Tuple[CheckState, Mapping[str, Any]]]
CheckFunc = Callable[[Connection, Configuration], CheckResult]
def _check(hint: Optional[str] = None) -> Callable[[CheckFunc], CheckFunc]:
""" Decorator for checks. It adds the function to the list of """ Decorator for checks. It adds the function to the list of
checks to execute and adds the code for printing progress messages. checks to execute and adds the code for printing progress messages.
""" """
def decorator(func): def decorator(func: CheckFunc) -> CheckFunc:
title = func.__doc__.split('\n', 1)[0].strip() title = (func.__doc__ or '').split('\n', 1)[0].strip()
def run_check(conn, config): def run_check(conn: Connection, config: Configuration) -> CheckState:
print(title, end=' ... ') print(title, end=' ... ')
ret = func(conn, config) ret = func(conn, config)
if isinstance(ret, tuple): if isinstance(ret, tuple):
@ -61,20 +66,20 @@ def _check(hint=None):
class _BadConnection: class _BadConnection:
def __init__(self, msg): def __init__(self, msg: str) -> None:
self.msg = msg self.msg = msg
def close(self): def close(self) -> None:
""" Dummy function to provide the implementation. """ Dummy function to provide the implementation.
""" """
def check_database(config): def check_database(config: Configuration) -> int:
""" Run a number of checks on the database and return the status. """ Run a number of checks on the database and return the status.
""" """
try: try:
conn = connect(config.get_libpq_dsn()).connection conn = connect(config.get_libpq_dsn()).connection
except UsageError as err: except UsageError as err:
conn = _BadConnection(str(err)) conn = _BadConnection(str(err)) # type: ignore[assignment]
overall_result = 0 overall_result = 0
for check in CHECKLIST: for check in CHECKLIST:
@ -89,7 +94,7 @@ def check_database(config):
return overall_result return overall_result
def _get_indexes(conn): def _get_indexes(conn: Connection) -> List[str]:
indexes = ['idx_place_addressline_address_place_id', indexes = ['idx_place_addressline_address_place_id',
'idx_placex_rank_search', 'idx_placex_rank_search',
'idx_placex_rank_address', 'idx_placex_rank_address',
@ -131,7 +136,7 @@ def _get_indexes(conn):
Project directory: {config.project_dir} Project directory: {config.project_dir}
Current setting of NOMINATIM_DATABASE_DSN: {config.DATABASE_DSN} Current setting of NOMINATIM_DATABASE_DSN: {config.DATABASE_DSN}
""") """)
def check_connection(conn, config): def check_connection(conn: Any, config: Configuration) -> CheckResult:
""" Checking database connection """ Checking database connection
""" """
if isinstance(conn, _BadConnection): if isinstance(conn, _BadConnection):
@ -149,7 +154,7 @@ def check_connection(conn, config):
Project directory: {config.project_dir} Project directory: {config.project_dir}
Current setting of NOMINATIM_DATABASE_DSN: {config.DATABASE_DSN} Current setting of NOMINATIM_DATABASE_DSN: {config.DATABASE_DSN}
""") """)
def check_placex_table(conn, config): def check_placex_table(conn: Connection, config: Configuration) -> CheckResult:
""" Checking for placex table """ Checking for placex table
""" """
if conn.table_exists('placex'): if conn.table_exists('placex'):
@ -159,7 +164,7 @@ def check_placex_table(conn, config):
@_check(hint="""placex table has no data. Did the import finish sucessfully?""") @_check(hint="""placex table has no data. Did the import finish sucessfully?""")
def check_placex_size(conn, _): def check_placex_size(conn: Connection, _: Configuration) -> CheckResult:
""" Checking for placex content """ Checking for placex content
""" """
with conn.cursor() as cur: with conn.cursor() as cur:
@ -169,7 +174,7 @@ def check_placex_size(conn, _):
@_check(hint="""{msg}""") @_check(hint="""{msg}""")
def check_tokenizer(_, config): def check_tokenizer(_: Connection, config: Configuration) -> CheckResult:
""" Checking that tokenizer works """ Checking that tokenizer works
""" """
try: try:
@ -191,7 +196,7 @@ def check_tokenizer(_, config):
Quality of search results may be degraded. Reverse geocoding is unaffected. Quality of search results may be degraded. Reverse geocoding is unaffected.
See https://nominatim.org/release-docs/latest/admin/Import/#wikipediawikidata-rankings See https://nominatim.org/release-docs/latest/admin/Import/#wikipediawikidata-rankings
""") """)
def check_existance_wikipedia(conn, _): def check_existance_wikipedia(conn: Connection, _: Configuration) -> CheckResult:
""" Checking for wikipedia/wikidata data """ Checking for wikipedia/wikidata data
""" """
if not conn.table_exists('search_name'): if not conn.table_exists('search_name'):
@ -208,7 +213,7 @@ def check_existance_wikipedia(conn, _):
To index the remaining entries, run: {index_cmd} To index the remaining entries, run: {index_cmd}
""") """)
def check_indexing(conn, _): def check_indexing(conn: Connection, _: Configuration) -> CheckResult:
""" Checking indexing status """ Checking indexing status
""" """
with conn.cursor() as cur: with conn.cursor() as cur:
@ -233,7 +238,7 @@ def check_indexing(conn, _):
Rerun the index creation with: nominatim import --continue db-postprocess Rerun the index creation with: nominatim import --continue db-postprocess
""") """)
def check_database_indexes(conn, _): def check_database_indexes(conn: Connection, _: Configuration) -> CheckResult:
""" Checking that database indexes are complete """ Checking that database indexes are complete
""" """
missing = [] missing = []
@ -255,7 +260,7 @@ def check_database_indexes(conn, _):
Invalid indexes: Invalid indexes:
{indexes} {indexes}
""") """)
def check_database_index_valid(conn, _): def check_database_index_valid(conn: Connection, _: Configuration) -> CheckResult:
""" Checking that all database indexes are valid """ Checking that all database indexes are valid
""" """
with conn.cursor() as cur: with conn.cursor() as cur:
@ -275,7 +280,7 @@ def check_database_index_valid(conn, _):
{error} {error}
Run TIGER import again: nominatim add-data --tiger-data <DIR> Run TIGER import again: nominatim add-data --tiger-data <DIR>
""") """)
def check_tiger_table(conn, config): def check_tiger_table(conn: Connection, config: Configuration) -> CheckResult:
""" Checking TIGER external data table. """ Checking TIGER external data table.
""" """
if not config.get_bool('USE_US_TIGER_DATA'): if not config.get_bool('USE_US_TIGER_DATA'):