]> git.openstreetmap.org Git - nominatim.git/blobdiff - nominatim/tools/country_info.py
modify logic to prepend 'name:' to keys'
[nominatim.git] / nominatim / tools / country_info.py
index 635d15840a84b8197efb9f5cb358344a78a0c2b9..675fac5d2018d74d48179700f927e3d4d2816061 100644 (file)
@@ -1,6 +1,14 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Functions for importing and managing static country information.
 """
 """
 Functions for importing and managing static country information.
 """
+import json
+from io import StringIO
 import psycopg2.extras
 
 from nominatim.db import utils as db_utils
 import psycopg2.extras
 
 from nominatim.db import utils as db_utils
@@ -27,7 +35,8 @@ class _CountryInfo:
                 elif not isinstance(prop['languages'], list):
                     prop['languages'] = [x.strip()
                                          for x in prop['languages'].split(',')]
                 elif not isinstance(prop['languages'], list):
                     prop['languages'] = [x.strip()
                                          for x in prop['languages'].split(',')]
-
+                if 'names' not in prop:
+                    prop['names']['name'] = {}
 
     def items(self):
         """ Return tuples of (country_code, property dict) as iterable.
 
     def items(self):
         """ Return tuples of (country_code, property dict) as iterable.
@@ -55,10 +64,12 @@ def setup_country_tables(dsn, sql_dir, ignore_partitions=False):
     """ Create and populate the tables with basic static data that provides
         the background for geocoding. Data is assumed to not yet exist.
     """
     """ Create and populate the tables with basic static data that provides
         the background for geocoding. Data is assumed to not yet exist.
     """
-    db_utils.execute_file(dsn, sql_dir / 'country_name.sql')
     db_utils.execute_file(dsn, sql_dir / 'country_osm_grid.sql.gz')
 
     db_utils.execute_file(dsn, sql_dir / 'country_osm_grid.sql.gz')
 
-    params = []
+    def prepend_name_to_keys(name):
+        return {'name:'+k: v for k, v in name.items()}
+
+    params, country_names_data = [], ''
     for ccode, props in _COUNTRY_INFO.items():
         if ccode is not None and props is not None:
             if ignore_partitions:
     for ccode, props in _COUNTRY_INFO.items():
         if ccode is not None and props is not None:
             if ignore_partitions:
@@ -68,8 +79,22 @@ def setup_country_tables(dsn, sql_dir, ignore_partitions=False):
             lang = props['languages'][0] if len(props['languages']) == 1 else None
             params.append((ccode, partition, lang))
 
             lang = props['languages'][0] if len(props['languages']) == 1 else None
             params.append((ccode, partition, lang))
 
+            name = prepend_name_to_keys(props.get('names').get('name'))
+            name = json.dumps(name , ensure_ascii=False, separators=(', ', '=>'))
+            country_names_data += ccode + '\t' + name[1:-1] + '\n'
+
     with connect(dsn) as conn:
         with conn.cursor() as cur:
     with connect(dsn) as conn:
         with conn.cursor() as cur:
+            cur.execute(
+                """ CREATE TABLE public.country_name (
+                        country_code character varying(2),
+                        name public.hstore,
+                        derived_name public.hstore,
+                        country_default_language_code text,
+                        partition integer
+                    ); """)
+            data = StringIO(country_names_data)
+            cur.copy_from(data, 'country_name', columns=('country_code', 'name'))
             cur.execute_values(
                 """ UPDATE country_name
                     SET partition = part, country_default_language_code = lang
             cur.execute_values(
                 """ UPDATE country_name
                     SET partition = part, country_default_language_code = lang
@@ -88,8 +113,8 @@ def create_country_names(conn, tokenizer, languages=None):
         languages = languages.split(',')
 
     def _include_key(key):
         languages = languages.split(',')
 
     def _include_key(key):
-        return key == 'name' or \
-               (key.startswith('name:') and (not languages or key[5:] in languages))
+        return key.startswith('name:') and \
+            key[5:] in languages or key[5:] == 'default'
 
     with conn.cursor() as cur:
         psycopg2.extras.register_hstore(cur)
 
     with conn.cursor() as cur:
         psycopg2.extras.register_hstore(cur)