]> git.openstreetmap.org Git - nominatim.git/commitdiff
Merge remote-tracking branch 'upstream/master'
authorSarah Hoffmann <lonvia@denofr.de>
Sun, 14 Apr 2019 10:07:06 +0000 (12:07 +0200)
committerSarah Hoffmann <lonvia@denofr.de>
Sun, 14 Apr 2019 10:07:06 +0000 (12:07 +0200)
1  2 
lib/Geocode.php
sql/functions.sql
utils/update.php

diff --combined lib/Geocode.php
index 94816283c2f1281241db1b54fc17deda152ad131,9e02150c7fca51c30689e5d7b2dd6f62bc19db2c..e2d676862a5f6a3c74cd002d4818e211c0ee9567
@@@ -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;
  
              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 ';
                  $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) {
              $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)) {
                      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 54e2a8d36d25ab3015cd2cbe4c296359f958676a,8ecb8c2c1aa1da18a20d31afae360534127476c2..d42d9fca36a9e9030856340df0655798c8981490
@@@ -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,
      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)
        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,
  
    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 e52e3b9bd294fae37a417b18544138a0922f6d2e,c3620b063c80fa06101626691a4dd6dc55770b98..2809a198c874b8c9b0a52c6f4758e275a1ecf50d
@@@ -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]);
          }
      $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";
          $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'];
              $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";
          $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) {
              $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";
          }