forked from hans/Nominatim
add type annotations for migrations
This commit is contained in:
@@ -7,13 +7,14 @@
|
|||||||
"""
|
"""
|
||||||
Functions for database migration to newer software versions.
|
Functions for database migration to newer software versions.
|
||||||
"""
|
"""
|
||||||
from typing import List, Tuple, Callable
|
from typing import List, Tuple, Callable, Any
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from psycopg2 import sql as pysql
|
from psycopg2 import sql as pysql
|
||||||
|
|
||||||
|
from nominatim.config import Configuration
|
||||||
from nominatim.db import properties
|
from nominatim.db import properties
|
||||||
from nominatim.db.connection import connect
|
from nominatim.db.connection import connect, Connection
|
||||||
from nominatim.version import NOMINATIM_VERSION, version_str
|
from nominatim.version import NOMINATIM_VERSION, version_str
|
||||||
from nominatim.tools import refresh
|
from nominatim.tools import refresh
|
||||||
from nominatim.tokenizer import factory as tokenizer_factory
|
from nominatim.tokenizer import factory as tokenizer_factory
|
||||||
@@ -21,9 +22,11 @@ from nominatim.errors import UsageError
|
|||||||
|
|
||||||
LOG = logging.getLogger()
|
LOG = logging.getLogger()
|
||||||
|
|
||||||
_MIGRATION_FUNCTIONS : List[Tuple[str, Callable]] = []
|
VersionTuple = Tuple[int, int, int, int]
|
||||||
|
|
||||||
def migrate(config, paths):
|
_MIGRATION_FUNCTIONS : List[Tuple[VersionTuple, Callable[..., None]]] = []
|
||||||
|
|
||||||
|
def migrate(config: Configuration, paths: Any) -> int:
|
||||||
""" Check for the current database version and execute migrations,
|
""" Check for the current database version and execute migrations,
|
||||||
if necesssary.
|
if necesssary.
|
||||||
"""
|
"""
|
||||||
@@ -49,7 +52,8 @@ def migrate(config, paths):
|
|||||||
has_run_migration = False
|
has_run_migration = False
|
||||||
for version, func in _MIGRATION_FUNCTIONS:
|
for version, func in _MIGRATION_FUNCTIONS:
|
||||||
if db_version <= version:
|
if db_version <= version:
|
||||||
LOG.warning("Runnning: %s (%s)", func.__doc__.split('\n', 1)[0],
|
title = func.__doc__ or ''
|
||||||
|
LOG.warning("Runnning: %s (%s)", title.split('\n', 1)[0],
|
||||||
version_str(version))
|
version_str(version))
|
||||||
kwargs = dict(conn=conn, config=config, paths=paths)
|
kwargs = dict(conn=conn, config=config, paths=paths)
|
||||||
func(**kwargs)
|
func(**kwargs)
|
||||||
@@ -69,7 +73,7 @@ def migrate(config, paths):
|
|||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
|
||||||
def _guess_version(conn):
|
def _guess_version(conn: Connection) -> VersionTuple:
|
||||||
""" Guess a database version when there is no property table yet.
|
""" Guess a database version when there is no property table yet.
|
||||||
Only migrations for 3.6 and later are supported, so bail out
|
Only migrations for 3.6 and later are supported, so bail out
|
||||||
when the version seems older.
|
when the version seems older.
|
||||||
@@ -89,7 +93,8 @@ def _guess_version(conn):
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
def _migration(major, minor, patch=0, dbpatch=0):
|
def _migration(major: int, minor: int, patch: int = 0,
|
||||||
|
dbpatch: int = 0) -> Callable[[Callable[..., None]], Callable[..., None]]:
|
||||||
""" Decorator for a single migration step. The parameters describe the
|
""" Decorator for a single migration step. The parameters describe the
|
||||||
version after which the migration is applicable, i.e before changing
|
version after which the migration is applicable, i.e before changing
|
||||||
from the given version to the next, the migration is required.
|
from the given version to the next, the migration is required.
|
||||||
@@ -102,7 +107,7 @@ def _migration(major, minor, patch=0, dbpatch=0):
|
|||||||
process, so the migration functions may leave a temporary state behind
|
process, so the migration functions may leave a temporary state behind
|
||||||
there.
|
there.
|
||||||
"""
|
"""
|
||||||
def decorator(func):
|
def decorator(func: Callable[..., None]) -> Callable[..., None]:
|
||||||
_MIGRATION_FUNCTIONS.append(((major, minor, patch, dbpatch), func))
|
_MIGRATION_FUNCTIONS.append(((major, minor, patch, dbpatch), func))
|
||||||
return func
|
return func
|
||||||
|
|
||||||
@@ -110,7 +115,7 @@ def _migration(major, minor, patch=0, dbpatch=0):
|
|||||||
|
|
||||||
|
|
||||||
@_migration(3, 5, 0, 99)
|
@_migration(3, 5, 0, 99)
|
||||||
def import_status_timestamp_change(conn, **_):
|
def import_status_timestamp_change(conn: Connection, **_: Any) -> None:
|
||||||
""" Add timezone to timestamp in status table.
|
""" Add timezone to timestamp in status table.
|
||||||
|
|
||||||
The import_status table has been changed to include timezone information
|
The import_status table has been changed to include timezone information
|
||||||
@@ -122,7 +127,7 @@ def import_status_timestamp_change(conn, **_):
|
|||||||
|
|
||||||
|
|
||||||
@_migration(3, 5, 0, 99)
|
@_migration(3, 5, 0, 99)
|
||||||
def add_nominatim_property_table(conn, config, **_):
|
def add_nominatim_property_table(conn: Connection, config: Configuration, **_: Any) -> None:
|
||||||
""" Add nominatim_property table.
|
""" Add nominatim_property table.
|
||||||
"""
|
"""
|
||||||
if not conn.table_exists('nominatim_properties'):
|
if not conn.table_exists('nominatim_properties'):
|
||||||
@@ -134,7 +139,7 @@ def add_nominatim_property_table(conn, config, **_):
|
|||||||
""").format(pysql.Identifier(config.DATABASE_WEBUSER)))
|
""").format(pysql.Identifier(config.DATABASE_WEBUSER)))
|
||||||
|
|
||||||
@_migration(3, 6, 0, 0)
|
@_migration(3, 6, 0, 0)
|
||||||
def change_housenumber_transliteration(conn, **_):
|
def change_housenumber_transliteration(conn: Connection, **_: Any) -> None:
|
||||||
""" Transliterate housenumbers.
|
""" Transliterate housenumbers.
|
||||||
|
|
||||||
The database schema switched from saving raw housenumbers in
|
The database schema switched from saving raw housenumbers in
|
||||||
@@ -165,7 +170,7 @@ def change_housenumber_transliteration(conn, **_):
|
|||||||
|
|
||||||
|
|
||||||
@_migration(3, 7, 0, 0)
|
@_migration(3, 7, 0, 0)
|
||||||
def switch_placenode_geometry_index(conn, **_):
|
def switch_placenode_geometry_index(conn: Connection, **_: Any) -> None:
|
||||||
""" Replace idx_placex_geometry_reverse_placeNode index.
|
""" Replace idx_placex_geometry_reverse_placeNode index.
|
||||||
|
|
||||||
Make the index slightly more permissive, so that it can also be used
|
Make the index slightly more permissive, so that it can also be used
|
||||||
@@ -182,7 +187,7 @@ def switch_placenode_geometry_index(conn, **_):
|
|||||||
|
|
||||||
|
|
||||||
@_migration(3, 7, 0, 1)
|
@_migration(3, 7, 0, 1)
|
||||||
def install_legacy_tokenizer(conn, config, **_):
|
def install_legacy_tokenizer(conn: Connection, config: Configuration, **_: Any) -> None:
|
||||||
""" Setup legacy tokenizer.
|
""" Setup legacy tokenizer.
|
||||||
|
|
||||||
If no other tokenizer has been configured yet, then create the
|
If no other tokenizer has been configured yet, then create the
|
||||||
@@ -201,11 +206,11 @@ def install_legacy_tokenizer(conn, config, **_):
|
|||||||
tokenizer = tokenizer_factory.create_tokenizer(config, init_db=False,
|
tokenizer = tokenizer_factory.create_tokenizer(config, init_db=False,
|
||||||
module_name='legacy')
|
module_name='legacy')
|
||||||
|
|
||||||
tokenizer.migrate_database(config)
|
tokenizer.migrate_database(config) # type: ignore[attr-defined]
|
||||||
|
|
||||||
|
|
||||||
@_migration(4, 0, 99, 0)
|
@_migration(4, 0, 99, 0)
|
||||||
def create_tiger_housenumber_index(conn, **_):
|
def create_tiger_housenumber_index(conn: Connection, **_: Any) -> None:
|
||||||
""" Create idx_location_property_tiger_parent_place_id with included
|
""" Create idx_location_property_tiger_parent_place_id with included
|
||||||
house number.
|
house number.
|
||||||
|
|
||||||
@@ -222,7 +227,7 @@ def create_tiger_housenumber_index(conn, **_):
|
|||||||
|
|
||||||
|
|
||||||
@_migration(4, 0, 99, 1)
|
@_migration(4, 0, 99, 1)
|
||||||
def create_interpolation_index_on_place(conn, **_):
|
def create_interpolation_index_on_place(conn: Connection, **_: Any) -> None:
|
||||||
""" Create idx_place_interpolations for lookup of interpolation lines
|
""" Create idx_place_interpolations for lookup of interpolation lines
|
||||||
on updates.
|
on updates.
|
||||||
"""
|
"""
|
||||||
@@ -233,7 +238,7 @@ def create_interpolation_index_on_place(conn, **_):
|
|||||||
|
|
||||||
|
|
||||||
@_migration(4, 0, 99, 2)
|
@_migration(4, 0, 99, 2)
|
||||||
def add_step_column_for_interpolation(conn, **_):
|
def add_step_column_for_interpolation(conn: Connection, **_: Any) -> None:
|
||||||
""" Add a new column 'step' to the interpolations table.
|
""" Add a new column 'step' to the interpolations table.
|
||||||
|
|
||||||
Also convers the data into the stricter format which requires that
|
Also convers the data into the stricter format which requires that
|
||||||
@@ -268,7 +273,7 @@ def add_step_column_for_interpolation(conn, **_):
|
|||||||
|
|
||||||
|
|
||||||
@_migration(4, 0, 99, 3)
|
@_migration(4, 0, 99, 3)
|
||||||
def add_step_column_for_tiger(conn, **_):
|
def add_step_column_for_tiger(conn: Connection, **_: Any) -> None:
|
||||||
""" Add a new column 'step' to the tiger data table.
|
""" Add a new column 'step' to the tiger data table.
|
||||||
"""
|
"""
|
||||||
if conn.table_has_column('location_property_tiger', 'step'):
|
if conn.table_has_column('location_property_tiger', 'step'):
|
||||||
@@ -283,7 +288,7 @@ def add_step_column_for_tiger(conn, **_):
|
|||||||
|
|
||||||
|
|
||||||
@_migration(4, 0, 99, 4)
|
@_migration(4, 0, 99, 4)
|
||||||
def add_derived_name_column_for_country_names(conn, **_):
|
def add_derived_name_column_for_country_names(conn: Connection, **_: Any) -> None:
|
||||||
""" Add a new column 'derived_name' which in the future takes the
|
""" Add a new column 'derived_name' which in the future takes the
|
||||||
country names as imported from OSM data.
|
country names as imported from OSM data.
|
||||||
"""
|
"""
|
||||||
@@ -293,7 +298,7 @@ def add_derived_name_column_for_country_names(conn, **_):
|
|||||||
|
|
||||||
|
|
||||||
@_migration(4, 0, 99, 5)
|
@_migration(4, 0, 99, 5)
|
||||||
def mark_internal_country_names(conn, config, **_):
|
def mark_internal_country_names(conn: Connection, config: Configuration, **_: Any) -> None:
|
||||||
""" Names from the country table should be marked as internal to prevent
|
""" Names from the country table should be marked as internal to prevent
|
||||||
them from being deleted. Only necessary for ICU tokenizer.
|
them from being deleted. Only necessary for ICU tokenizer.
|
||||||
"""
|
"""
|
||||||
|
|||||||
Reference in New Issue
Block a user