$iPlaceID = $aPlace['place_id'];
$oResult = new Result($iPlaceID);
$iRankAddress = $aPlace['rank_address'];
- $iParentPlaceID = $aPlace['parent_place_id'];
- }
-
- if ($bDoInterpolation && $iMaxRank >= 30) {
- $fDistance = $fSearchDiam;
- if ($aPlace) {
- // We can't reliably go from the closest street to an
- // interpolation line because the closest interpolation
- // may have a different street segments as a parent.
- // Therefore allow an interpolation line to take precendence
- // even when the street is closer.
- $fDistance = $iRankAddress < 28 ? 0.001 : $aPlace['distance'];
- }
-
- $aHouse = $this->lookupInterpolation($sPointSQL, $fDistance);
- Debug::printVar('Interpolation result', $aPlace);
-
- if ($aHouse) {
- $oResult = new Result($aHouse['place_id'], Result::TABLE_OSMLINE);
- $oResult->iHouseNumber = closestHouseNumber($aHouse);
- $aPlace = $aHouse;
- $iRankAddress = 30;
- }
}
if ($aPlace) {
Debug::printVar('Closest POI result', $aStreet);
if ($aStreet) {
+ $aPlace = $aStreet;
$oResult = new Result($aStreet['place_id']);
+ $iRankAddress = 30;
}
}
Debug::printVar('Tiger house number result', $aPlaceTiger);
if ($aPlaceTiger) {
+ $aPlace = $aPlaceTiger;
$oResult = new Result($aPlaceTiger['place_id'], Result::TABLE_TIGER);
$oResult->iHouseNumber = closestHouseNumber($aPlaceTiger);
+ $iRankAddress = 30;
}
}
- } else {
+ }
+
+ if ($bDoInterpolation && $iMaxRank >= 30) {
+ $fDistance = $fSearchDiam;
+ if ($aPlace) {
+ // We can't reliably go from the closest street to an
+ // interpolation line because the closest interpolation
+ // may have a different street segments as a parent.
+ // Therefore allow an interpolation line to take precendence
+ // even when the street is closer.
+ $fDistance = $iRankAddress < 28 ? 0.001 : $aPlace['distance'];
+ }
+
+ $aHouse = $this->lookupInterpolation($sPointSQL, $fDistance);
+ Debug::printVar('Interpolation result', $aPlace);
+
+ if ($aHouse) {
+ $oResult = new Result($aHouse['place_id'], Result::TABLE_OSMLINE);
+ $oResult->iHouseNumber = closestHouseNumber($aHouse);
+ $aPlace = $aHouse;
+ $iRankAddress = 30;
+ }
+ }
+
+ if (!$aPlace) {
// if no POI or street is found ...
$oResult = $this->lookupLargeArea($sPointSQL, 25);
}
if ($aCMDResult['create-country-names'] || $aCMDResult['all']) {
$bDidSomething = true;
- $oSetup->createCountryNames($aCMDResult);
+ run(clone($oNominatimCmd))->addParams('transition', '--create-country-names');
}
if ($aCMDResult['setup-website'] || $aCMDResult['all']) {
$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.
*
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)
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')
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
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)
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 (".format(sql_statement)
+ delim = ''
+ for language in languages.split(','):
+ sql_statement = "{}{}'name:{}'".format(sql_statement, delim, language)
+ delim = ', '
+ sql_statement = '{})'.format(sql_statement)
+ else:
+ sql_statement = "{} LIKE 'name:%'".format(sql_statement)
+ sql_statement = "{}) v".format(sql_statement)
+ cur.execute(sql_statement)
+ conn.commit()
sql = SQLPreprocessor(conn, config, sqllib_dir)
sql.run_sql_file(conn, 'functions.sql',
- disable_diff_update=not enable_diff_updates,
+ disable_diff_updates=not enable_diff_updates,
debug=enable_debug)
| display_name |
| 1021, Grosssteg, Sücka, Triesenberg, Oberland, 9497, Liechtenstein |
+ # github 2214
+ Scenario: Interpolations do not override house numbers when they are closer
+ When sending jsonv2 reverse coordinates 47.11778,9.57255
+ | zoom |
+ | 18 |
+ Then results contain
+ | display_name |
+ | 5, Grosssteg, Steg, Triesenberg, Oberland, 9497, Liechtenstein |
+
+ Scenario: Interpolations do not override house numbers when they are closer (2)
+ When sending jsonv2 reverse coordinates 47.11834,9.57167
+ | zoom |
+ | 18 |
+ Then results contain
+ | display_name |
+ | 3, Grosssteg, Sücka, Triesenberg, Oberland, 9497, Liechtenstein |
+
Scenario: When on a street with zoom 18, the closest housenumber is returned
When sending jsonv2 reverse coordinates 47.11755503977281,9.572722250405036
| zoom |
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'),
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 TABLE country_name (country_code varchar(2), name hstore)')
+ temp_db_cursor.execute('CREATE TABLE word (code varchar(2))')
+ temp_db_cursor.execute("""INSERT INTO country_name VALUES ('us',
+ '"name"=>"us","name:af"=>"us"')""")
+ temp_db_cursor.execute("""CREATE OR REPLACE FUNCTION getorcreate_country(lookup_word TEXT,
+ lookup_country_code varchar(2))
+ RETURNS INTEGER
+ AS $$
+ BEGIN
+ INSERT INTO word VALUES (lookup_country_code);
+ RETURN 5;
+ END;
+ $$
+ LANGUAGE plpgsql;
+ """)
+ database_import.create_country_names(temp_db_conn, def_config)
+ if languages:
+ assert temp_db_cursor.table_rows('word') == 4
+ else:
+ assert temp_db_cursor.table_rows('word') == 5