From: Sarah Hoffmann Date: Thu, 31 Mar 2022 13:43:46 +0000 (+0200) Subject: add migration to mark internal country names X-Git-Tag: v4.1.0~65^2~1 X-Git-Url: https://git.openstreetmap.org./nominatim.git/commitdiff_plain/36a15601174ab238888fcc19621bb647a94d819c?hp=-c add migration to mark internal country names --- 36a15601174ab238888fcc19621bb647a94d819c diff --git a/nominatim/db/connection.py b/nominatim/db/connection.py index 1c115207..45bc173d 100644 --- a/nominatim/db/connection.py +++ b/nominatim/db/connection.py @@ -90,6 +90,17 @@ class _Connection(psycopg2.extensions.connection): return num == 1 + def table_has_column(self, table, column): + """ Check if the table 'table' exists and has a column with name 'column'. + """ + with self.cursor() as cur: + has_column = cur.scalar("""SELECT count(*) FROM information_schema.columns + WHERE table_name = %s + and column_name = %s""", + (table, column)) + return has_column > 0 + + def index_exists(self, index, table=None): """ Check that an index with the given name exists in the database. If table is not None then the index must relate to the given diff --git a/nominatim/tools/migration.py b/nominatim/tools/migration.py index 997aa044..76726e8c 100644 --- a/nominatim/tools/migration.py +++ b/nominatim/tools/migration.py @@ -236,6 +236,9 @@ def add_step_column_for_interpolation(conn, **_): Also convers the data into the stricter format which requires that startnumbers comply with the odd/even requirements. """ + if conn.table_has_column('location_property_osmline', 'step'): + return + with conn.cursor() as cur: # Mark invalid all interpolations with no intermediate numbers. cur.execute("""UPDATE location_property_osmline SET startnumber = null @@ -265,6 +268,9 @@ def add_step_column_for_interpolation(conn, **_): def add_step_column_for_tiger(conn, **_): """ Add a new column 'step' to the tiger data table. """ + if conn.table_has_column('location_property_tiger', 'step'): + return + with conn.cursor() as cur: cur.execute("ALTER TABLE location_property_tiger ADD COLUMN step SMALLINT") cur.execute("""UPDATE location_property_tiger @@ -278,5 +284,26 @@ def add_derived_name_column_for_country_names(conn, **_): """ Add a new column 'derived_name' which in the future takes the country names as imported from OSM data. """ - with conn.cursor() as cur: - cur.execute("ALTER TABLE country_name ADD COLUMN derived_name public.HSTORE") + if not conn.table_has_column('country_name', 'derived_name'): + with conn.cursor() as cur: + cur.execute("ALTER TABLE country_name ADD COLUMN derived_name public.HSTORE") + + +@_migration(4, 0, 99, 5) +def mark_internal_country_names(conn, config, **_): + """ Names from the country table should be marked as internal to prevent + them from being deleted. Only necessary for ICU tokenizer. + """ + import psycopg2.extras # pylint: disable=import-outside-toplevel + + tokenizer = tokenizer_factory.get_tokenizer_for_db(config) + with tokenizer.name_analyzer() as analyzer: + with conn.cursor() as cur: + psycopg2.extras.register_hstore(cur) + cur.execute("SELECT country_code, name FROM country_name") + + for country_code, names in cur: + if not names: + names = {} + names['countrycode'] = country_code + analyzer.add_country_names(country_code, names) diff --git a/nominatim/version.py b/nominatim/version.py index 232cf6b6..b876002e 100644 --- a/nominatim/version.py +++ b/nominatim/version.py @@ -24,7 +24,7 @@ Version information for Nominatim. # patch level when cherry-picking the commit with the migration. # # Released versions always have a database patch level of 0. -NOMINATIM_VERSION = (4, 0, 99, 5) +NOMINATIM_VERSION = (4, 0, 99, 6) POSTGRESQL_REQUIRED_VERSION = (9, 5) POSTGIS_REQUIRED_VERSION = (2, 2) diff --git a/test/bdd/db/update/country.feature b/test/bdd/db/update/country.feature index 2085e4e5..db68f420 100644 --- a/test/bdd/db/update/country.feature +++ b/test/bdd/db/update/country.feature @@ -53,6 +53,10 @@ Feature: Country handling | N1 | place | town | Wenig | country:de | When importing When sending search query "Wenig, Germany" + Then results contain + | osm | + | N1 | + When sending search query "Wenig, de" Then results contain | osm | | N1 | @@ -65,6 +69,12 @@ Feature: Country handling Then results contain | osm | display_name | | N1 | Wenig, Lilly | + When sending search query "Wenig, de" + | accept-language | + | en,de | + Then results contain + | osm | display_name | + | N1 | Wenig, Lilly | @fail-legacy