From: Sarah Hoffmann Date: Sun, 14 Apr 2019 10:07:06 +0000 (+0200) Subject: Merge remote-tracking branch 'upstream/master' X-Git-Tag: deploy~288 X-Git-Url: https://git.openstreetmap.org./nominatim.git/commitdiff_plain/d3604b8594ce1c2ec01bac675fc35b49ab8fc7df?ds=sidebyside;hp=-c Merge remote-tracking branch 'upstream/master' --- d3604b8594ce1c2ec01bac675fc35b49ab8fc7df diff --combined lib/Geocode.php index 94816283,9e02150c..e2d67686 --- a/lib/Geocode.php +++ b/lib/Geocode.php @@@ -18,7 -18,7 +18,7 @@@ class Geocod protected $aLangPrefOrder = array(); protected $aExcludePlaceIDs = array(); - protected $bReverseInPlan = false; + protected $bReverseInPlan = true; protected $iLimit = 20; protected $iFinalLimit = 10; @@@ -581,8 -581,9 +581,9 @@@ if ($sSpecialTerm && !$aSearches[0]->hasOperator()) { $sSpecialTerm = pg_escape_string($sSpecialTerm); - $sToken = chksql( - $this->oDB->getOne("SELECT make_standard_name('$sSpecialTerm')"), + $sToken = $this->oDB->getOne( + 'SELECT make_standard_name(:term)', + array(':term' => $sSpecialTerm), 'Cannot decode query. Wrong encoding?' ); $sSQL = 'SELECT class, type FROM word '; @@@ -590,7 -591,7 +591,7 @@@ $sSQL .= ' AND class is not null AND class not in (\'place\')'; Debug::printSQL($sSQL); - $aSearchWords = chksql($this->oDB->getAll($sSQL)); + $aSearchWords = $this->oDB->getAll($sSQL); $aNewSearches = array(); foreach ($aSearches as $oSearch) { foreach ($aSearchWords as $aSearchTerm) { @@@ -628,8 -629,9 +629,9 @@@ $aTokens = array(); $aPhrases = array(); foreach ($aInPhrases as $iPhrase => $sPhrase) { - $sPhrase = chksql( - $this->oDB->getOne('SELECT make_standard_name('.$this->oDB->getDBQuoted($sPhrase).')'), + $sPhrase = $this->oDB->getOne( + 'SELECT make_standard_name(:phrase)', + array(':phrase' => $sPhrase), 'Cannot normalize query string (is it a UTF-8 string?)' ); if (trim($sPhrase)) { @@@ -830,7 -832,7 +832,7 @@@ if ($aFilterSql) { $sSQL = join(' UNION ', $aFilterSql); Debug::printSQL($sSQL); - $aFilteredIDs = chksql($this->oDB->getCol($sSQL)); + $aFilteredIDs = $this->oDB->getCol($sSQL); } $tempIDs = array(); diff --combined sql/functions.sql index 54e2a8d3,8ecb8c2c..d42d9fca --- a/sql/functions.sql +++ b/sql/functions.sql @@@ -2318,6 -2318,7 +2318,7 @@@ DECLAR searchhousename HSTORE; searchrankaddress INTEGER; searchpostcode TEXT; + postcode_isaddress BOOL; searchclass TEXT; searchtype TEXT; countryname HSTORE; @@@ -2325,6 -2326,8 +2326,8 @@@ BEGI -- The place ein question might not have a direct entry in place_addressline. -- Look for the parent of such places then and save if in for_place_id. + postcode_isaddress := true; + -- first query osmline (interpolation lines) IF in_housenumber >= 0 THEN SELECT parent_place_id, country_code, in_housenumber::text, 30, postcode, @@@ -2424,7 -2427,7 +2427,7 @@@ SELECT placex.place_id, osm_type, osm_id, name, CASE WHEN extratags ? 'place' THEN 'place' ELSE class END as class, CASE WHEN extratags ? 'place' THEN extratags->'place' ELSE type END as type, - admin_level, fromarea, isaddress, + admin_level, fromarea, isaddress and linked_place_id is NULL as isaddress, CASE WHEN rank_address = 11 THEN 5 ELSE rank_address END as rank_address, distance, country_code, postcode FROM place_addressline join placex on (address_place_id = placex.place_id) @@@ -2441,7 -2444,10 +2444,10 @@@ searchcountrycode := location.country_code; END IF; IF location.type in ('postcode', 'postal_code') THEN - location.isaddress := FALSE; + postcode_isaddress := false; + IF location.osm_type != 'R' THEN + location.isaddress := FALSE; + END IF; END IF; countrylocation := ROW(location.place_id, location.osm_type, location.osm_id, location.name, location.class, location.type, @@@ -2485,7 -2491,7 +2491,7 @@@ IF searchpostcode IS NOT NULL THEN location := ROW(null, null, null, hstore('ref', searchpostcode), 'place', - 'postcode', null, true, true, 5, 0)::addressline; + 'postcode', null, false, postcode_isaddress, 5, 0)::addressline; RETURN NEXT location; END IF; diff --combined utils/update.php index e52e3b9b,c3620b06..2809a198 --- a/utils/update.php +++ b/utils/update.php @@@ -48,7 -48,6 +48,7 @@@ $aCMDOption getCmdOpt($_SERVER['argv'], $aCMDOptions, $aResult, true, true); if (!isset($aResult['index-instances'])) $aResult['index-instances'] = 1; + if (!isset($aResult['index-rank'])) $aResult['index-rank'] = 0; date_default_timezone_set('Etc/UTC'); @@@ -144,7 -143,7 +144,7 @@@ if ($aResult['init-updates']) } if ($aResult['check-for-updates']) { - $aLastState = chksql($oDB->getRow('SELECT sequence_id FROM import_status')); + $aLastState = $oDB->getRow('SELECT sequence_id FROM import_status'); if (!$aLastState['sequence_id']) { fail('Updates not set up. Please run ./utils/update.php --init-updates.'); @@@ -232,13 -231,13 +232,13 @@@ if ($aResult['deduplicate']) } $sSQL = 'select partition from country_name order by country_code'; - $aPartitions = chksql($oDB->getCol($sSQL)); + $aPartitions = $oDB->getCol($sSQL); $aPartitions[] = 0; // we don't care about empty search_name_* partitions, they can't contain mentions of duplicates foreach ($aPartitions as $i => $sPartition) { $sSQL = 'select count(*) from search_name_'.$sPartition; - $nEntries = chksql($oDB->getOne($sSQL)); + $nEntries = $oDB->getOne($sSQL); if ($nEntries == 0) { unset($aPartitions[$i]); } @@@ -247,7 -246,7 +247,7 @@@ $sSQL = "select word_token,count(*) from word where substr(word_token, 1, 1) = ' '"; $sSQL .= ' and class is null and type is null and country_code is null'; $sSQL .= ' group by word_token having count(*) > 1 order by word_token'; - $aDuplicateTokens = chksql($oDB->getAll($sSQL)); + $aDuplicateTokens = $oDB->getAll($sSQL); foreach ($aDuplicateTokens as $aToken) { if (trim($aToken['word_token']) == '' || trim($aToken['word_token']) == '-') continue; echo 'Deduping '.$aToken['word_token']."\n"; @@@ -255,7 -254,7 +255,7 @@@ $sSQL .= ' (select count(*) from search_name where nameaddress_vector @> ARRAY[word_id]) as num'; $sSQL .= " from word where word_token = '".$aToken['word_token']; $sSQL .= "' and class is null and type is null and country_code is null order by num desc"; - $aTokenSet = chksql($oDB->getAll($sSQL)); + $aTokenSet = $oDB->getAll($sSQL); $aKeep = array_shift($aTokenSet); $iKeepID = $aKeep['word_id']; @@@ -265,32 -264,32 +265,32 @@@ $sSQL .= ' name_vector = array_replace(name_vector,'.$aRemove['word_id'].','.$iKeepID.'),'; $sSQL .= ' nameaddress_vector = array_replace(nameaddress_vector,'.$aRemove['word_id'].','.$iKeepID.')'; $sSQL .= ' where name_vector @> ARRAY['.$aRemove['word_id'].']'; - chksql($oDB->exec($sSQL)); + $oDB->exec($sSQL); $sSQL = 'update search_name set'; $sSQL .= ' nameaddress_vector = array_replace(nameaddress_vector,'.$aRemove['word_id'].','.$iKeepID.')'; $sSQL .= ' where nameaddress_vector @> ARRAY['.$aRemove['word_id'].']'; - chksql($oDB->exec($sSQL)); + $oDB->exec($sSQL); $sSQL = 'update location_area_country set'; $sSQL .= ' keywords = array_replace(keywords,'.$aRemove['word_id'].','.$iKeepID.')'; $sSQL .= ' where keywords @> ARRAY['.$aRemove['word_id'].']'; - chksql($oDB->exec($sSQL)); + $oDB->exec($sSQL); foreach ($aPartitions as $sPartition) { $sSQL = 'update search_name_'.$sPartition.' set'; $sSQL .= ' name_vector = array_replace(name_vector,'.$aRemove['word_id'].','.$iKeepID.')'; $sSQL .= ' where name_vector @> ARRAY['.$aRemove['word_id'].']'; - chksql($oDB->exec($sSQL)); + $oDB->exec($sSQL); $sSQL = 'update location_area_country set'; $sSQL .= ' keywords = array_replace(keywords,'.$aRemove['word_id'].','.$iKeepID.')'; $sSQL .= ' where keywords @> ARRAY['.$aRemove['word_id'].']'; - chksql($oDB->exec($sSQL)); + $oDB->exec($sSQL); } $sSQL = 'delete from word where word_id = '.$aRemove['word_id']; - chksql($oDB->exec($sSQL)); + $oDB->exec($sSQL); } } } @@@ -341,7 -340,7 +341,7 @@@ if ($aResult['import-osmosis'] || $aRes while (true) { $fStartTime = time(); - $aLastState = chksql($oDB->getRow('SELECT *, EXTRACT (EPOCH FROM lastimportdate) as unix_ts FROM import_status')); + $aLastState = $oDB->getRow('SELECT *, EXTRACT (EPOCH FROM lastimportdate) as unix_ts FROM import_status'); if (!$aLastState['sequence_id']) { echo "Updates not set up. Please run ./utils/update.php --init-updates.\n"; @@@ -353,7 -352,7 +353,7 @@@ $sBatchEnd = $aLastState['lastimportdate']; $iEndSequence = $aLastState['sequence_id']; - if ($aLastState['indexed'] == 't') { + if ($aLastState['indexed']) { // Sleep if the update interval has not yet been reached. $fNextUpdate = $aLastState['unix_ts'] + CONST_Replication_Update_Interval; if ($fNextUpdate > $fStartTime) { @@@ -419,12 -418,12 +419,12 @@@ $sSQL .= date('Y-m-d H:i:s', $fCMDStartTime)."','"; $sSQL .= date('Y-m-d H:i:s')."','import')"; var_Dump($sSQL); - chksql($oDB->exec($sSQL)); + $oDB->exec($sSQL); // update the status $sSQL = "UPDATE import_status SET lastimportdate = '$sBatchEnd', indexed=false, sequence_id = $iEndSequence"; var_Dump($sSQL); - chksql($oDB->exec($sSQL)); + $oDB->exec($sSQL); echo date('Y-m-d H:i:s')." Completed download step for $sBatchEnd in ".round((time()-$fCMDStartTime)/60, 2)." minutes\n"; }