]> git.openstreetmap.org Git - nominatim.git/commitdiff
Ported createCountryNames() to python and added tests
authorDarkshredder <srivastavayash58@gmail.com>
Fri, 12 Mar 2021 04:58:41 +0000 (10:28 +0530)
committerDarkshredder <srivastavayash58@gmail.com>
Fri, 12 Mar 2021 04:58:41 +0000 (10:28 +0530)
lib-php/setup/SetupClass.php
nominatim/clicmd/setup.py
nominatim/clicmd/transition.py
nominatim/tools/database_import.py
test/python/test_cli.py
test/python/test_tools_database_import.py

index cf2ac6da29ff0749c58f9cb92fa31725ca0e9e83..d07adce73a61992a038ad1bf8eb559fb9797d50d 100755 (executable)
@@ -130,33 +130,6 @@ class SetupFunctions
         $this->db()->exec($sSQL);
     }
 
-    public function createCountryNames()
-    {
-        info('Create search index for default country names');
-
-        $this->pgsqlRunScript("select getorcreate_country(make_standard_name('uk'), 'gb')");
-        $this->pgsqlRunScript("select getorcreate_country(make_standard_name('united states'), 'us')");
-        $this->pgsqlRunScript('select count(*) from (select getorcreate_country(make_standard_name(country_code), country_code) from country_name where country_code is not null) as x');
-        $this->pgsqlRunScript("select count(*) from (select getorcreate_country(make_standard_name(name->'name'), country_code) from country_name where name ? 'name') as x");
-        $sSQL = 'select count(*) from (select getorcreate_country(make_standard_name(v),'
-            .'country_code) from (select country_code, skeys(name) as k, svals(name) as v from country_name) x where k ';
-        $sLanguages = getSetting('LANGUAGES');
-        if ($sLanguages) {
-            $sSQL .= 'in ';
-            $sDelim = '(';
-            foreach (explode(',', $sLanguages) as $sLang) {
-                $sSQL .= $sDelim."'name:$sLang'";
-                $sDelim = ',';
-            }
-            $sSQL .= ')';
-        } else {
-            // all include all simple name tags
-            $sSQL .= "like 'name:%'";
-        }
-        $sSQL .= ') v';
-        $this->pgsqlRunScript($sSQL);
-    }
-
     /**
      * Return the connection to the database.
      *
index 71980739756c2e0f3a885689e3ad547e6ae1e6e7..056643aabfbbcd459bd874a307f0a41029fe8750 100644 (file)
@@ -130,8 +130,8 @@ class SetupAll:
             database_import.create_search_indices(conn, args.config,
                                                   args.sqllib_dir,
                                                   drop=args.no_updates)
-        run_legacy_script('setup.php', '--create-country-names',
-                          nominatim_env=args, throw_on_fail=not args.ignore_errors)
+            LOG.warning('Create search index for default country names.')
+            database_import.create_country_names(conn, args.config)
 
         webdir = args.project_dir / 'website'
         LOG.warning('Setup website at %s', webdir)
index 0a89cb037260dfa7eeb9344d9da68c215a1b2dfa..c9341f496d57efac9fd3527fdfffe3ba73618be1 100644 (file)
@@ -43,6 +43,8 @@ class AdminTransition:
                            help='Index the data')
         group.add_argument('--create-search-indices', action='store_true',
                            help='Create additional indices required for search and update')
+        group.add_argument('--create-country-names', action='store_true',
+                           help='Create search index for default country names.')
         group = parser.add_argument_group('Options')
         group.add_argument('--no-partitions', action='store_true',
                            help='Do not partition search indices')
@@ -62,7 +64,7 @@ class AdminTransition:
                            help='File to import')
 
     @staticmethod
-    def run(args):
+    def run(args): # pylint: disable=too-many-statements
         from ..tools import database_import, tiger_data
         from ..tools import refresh
 
@@ -137,3 +139,8 @@ class AdminTransition:
                                       args.threads or 1,
                                       args.config,
                                       args.sqllib_dir)
+
+        if args.create_country_names:
+            LOG.warning('Create search index for default country names.')
+            with connect(args.config.get_libpq_dsn()) as conn:
+                database_import.create_country_names(conn, args.config)
index 017c74b6186781e6ba49970d3bcfd9ffd65e30ae..9d4cad1693bbc6c089ac930c57add5f3493dc5ce 100644 (file)
@@ -306,3 +306,38 @@ def create_search_indices(conn, config, sqllib_dir, drop=False):
     sql = SQLPreprocessor(conn, config, sqllib_dir)
 
     sql.run_sql_file(conn, 'indices.sql', drop=drop)
+
+def create_country_names(conn, config):
+    """ Create search index for default country names.
+    """
+
+    with conn.cursor() as cur:
+        cur.execute("""select
+                       getorcreate_country(make_standard_name('uk')
+                       , 'gb')""")
+        cur.execute("""select getorcreate_country(make_standard_name('united states'), 'us')""")
+        cur.execute("""select count(*) from
+                       (select getorcreate_country(make_standard_name(country_code),
+                       country_code) from country_name where country_code is not null) as x""")
+        cur.execute("""select count(*) from
+                        (select getorcreate_country(make_standard_name(name->'name'),
+                        country_code) from country_name where name ? 'name') as x""")
+        sql_statement = """select count(*) from (select getorcreate_country(make_standard_name(v)
+                           , country_code) from (select country_code, skeys(name)
+                           as k, svals(name) as v from country_name) x where k """
+
+        languages = config.LANGUAGES
+
+        if languages:
+            sql_statement += 'in '
+            delim = '('
+            for language in languages.split(','):
+                sql_statement += delim + "'name:" + language + "'"
+                delim = ','
+
+            sql_statement += ')'
+        else:
+            sql_statement += "like 'name:%'"
+        sql_statement += ') v'
+        cur.execute(sql_statement)
+    conn.commit()
index 1f9cd06d4be7e0401e6162ac2cc60da2bea49149..918d84993d603270638209aadd37eadd920d8f32 100644 (file)
@@ -95,6 +95,7 @@ def test_import_full(temp_db, mock_func_factory):
         mock_func_factory(nominatim.tools.database_import, 'create_table_triggers'),
         mock_func_factory(nominatim.tools.database_import, 'create_partition_tables'),
         mock_func_factory(nominatim.tools.database_import, 'create_search_indices'),
+        mock_func_factory(nominatim.tools.database_import, 'create_country_names'),
         mock_func_factory(nominatim.tools.refresh, 'load_address_levels_from_file'),
         mock_func_factory(nominatim.indexer.indexer.Indexer, 'index_full'),
         mock_func_factory(nominatim.tools.refresh, 'setup_website'),
index 453248340d9b876132ee21cdee709eef7c860f98..2e76f5c56b14f5ebe084314a54e38ee0e312254f 100644 (file)
@@ -200,3 +200,26 @@ def test_load_data(dsn, src_dir, place_row, placex_table, osmline_table, word_ta
 
     assert temp_db_cursor.table_rows('placex') == 30
     assert temp_db_cursor.table_rows('location_property_osmline') == 1
+
+@pytest.mark.parametrize("languages", (False, True))
+def test_create_country_names(temp_db_conn, temp_db_cursor, def_config,
+                              temp_db_with_extensions, monkeypatch, languages):
+    if languages:
+        monkeypatch.setenv('NOMINATIM_LANGUAGES', 'fr,en')
+    temp_db_cursor.execute("""CREATE FUNCTION make_standard_name (name TEXT)
+                                  RETURNS TEXT AS $$ SELECT 'a'::TEXT $$ LANGUAGE SQL
+                               """)
+    temp_db_cursor.execute("""CREATE OR REPLACE FUNCTION getorcreate_country(lookup_word TEXT,
+                                               lookup_country_code varchar(2))
+                            RETURNS INTEGER
+                            AS $$
+                            BEGIN
+                                INSERT INTO country_name VALUES (5, lookup_word);
+                                RETURN 5;
+                            END;
+                            $$
+                            LANGUAGE plpgsql;
+                               """)
+    temp_db_cursor.execute('CREATE TABLE country_name (id int, country_code varchar(2), name hstore)')
+    database_import.create_country_names(temp_db_conn, def_config)
+    assert temp_db_cursor.table_rows('country_name') == 4