]> git.openstreetmap.org Git - nominatim.git/commitdiff
Merge remote-tracking branch 'upstream/master'
authorSarah Hoffmann <lonvia@denofr.de>
Mon, 2 Oct 2017 21:10:21 +0000 (23:10 +0200)
committerSarah Hoffmann <lonvia@denofr.de>
Mon, 2 Oct 2017 21:10:21 +0000 (23:10 +0200)
1  2 
lib/Geocode.php

diff --combined lib/Geocode.php
index cff70efc4832794ee0229fc9ff356516aa8e1888,80a959c28709299b901f3f29daf73a985ed4910d..3c53777735039137771024752caa0d7454c43481
@@@ -25,7 -25,7 +25,7 @@@ class Geocod
  
      protected $aExcludePlaceIDs = array();
      protected $bDeDupe = true;
 -    protected $bReverseInPlan = false;
 +    protected $bReverseInPlan = true;
  
      protected $iLimit = 20;
      protected $iFinalLimit = 10;
                  if (count($aViewbox) != 4) {
                      userError("Bad parmater 'viewbox'. Expected 4 coordinates.");
                  }
-                 $this->setViewBox(array(
-                                    $aViewbox[0],
-                                    $aViewbox[3],
-                                    $aViewbox[2],
-                                    $aViewbox[1]
-                                   ));
+                 $this->setViewBox($aViewbox);
              } else {
                  $aRoute = $oParams->getStringList('route');
                  $fRouteWidth = $oParams->getFloat('routewidth');
  
              //if (CONST_Debug) _debugDumpGroupedSearches($aGroupedSearches, $aValidTokens);
          }
+         // Revisit searches, giving penalty to unlikely combinations
+         $aGroupedSearches = array();
+         foreach ($aSearches as $aSearch) {
+             if (!$aSearch['aName']) {
+                 if ($aSearch['sHouseNumber']) {
+                     continue;
+                 }
+             }
+             $aGroupedSearches[$aSearch['iSearchRank']][] = $aSearch;
+         }
+         ksort($aGroupedSearches);
          return $aGroupedSearches;
      }
  
                  if (CONST_Debug) var_Dump($sSQL);
  
                  $aValidTokens = array();
-                 if (sizeof($aTokens)) {
-                     $aDatabaseWords = chksql(
-                         $this->oDB->getAll($sSQL),
-                         "Could not get word tokens."
-                     );
-                 } else {
-                     $aDatabaseWords = array();
-                 }
+                 $aDatabaseWords = chksql(
+                     $this->oDB->getAll($sSQL),
+                     "Could not get word tokens."
+                 );
                  $aPossibleMainWordIDs = array();
                  $aWordFrequencyScores = array();
                  foreach ($aDatabaseWords as $aToken) {
                          // TODO: filter out the pointless search terms (2 letter name tokens and less)
                          // they might be right - but they are just too darned expensive to run
                          if (sizeof($aSearch['aName'])) $aTerms[] = "name_vector @> ARRAY[".join($aSearch['aName'], ",")."]";
 -                        if (sizeof($aSearch['aNameNonSearch'])) $aTerms[] = "array_cat(name_vector,ARRAY[]::integer[]) @> ARRAY[".join($aSearch['aNameNonSearch'], ",")."]";
 +                        //if (sizeof($aSearch['aNameNonSearch'])) $aTerms[] = "array_cat(name_vector,ARRAY[]::integer[]) @> ARRAY[".join($aSearch['aNameNonSearch'], ",")."]";
                          if (sizeof($aSearch['aAddress']) && $aSearch['aName'] != $aSearch['aAddress']) {
                              // For infrequent name terms disable index usage for address
                              if (CONST_Search_NameOnlySearchFrequencyThreshold
                                  && sizeof($aSearch['aName']) == 1
                                  && $aWordFrequencyScores[$aSearch['aName'][reset($aSearch['aName'])]] < CONST_Search_NameOnlySearchFrequencyThreshold
                              ) {
 -                                $aTerms[] = "array_cat(nameaddress_vector,ARRAY[]::integer[]) @> ARRAY[".join(array_merge($aSearch['aAddress'], $aSearch['aAddressNonSearch']), ",")."]";
 +                                //$aTerms[] = "array_cat(nameaddress_vector,ARRAY[]::integer[]) @> ARRAY[".join(array_merge($aSearch['aAddress'], $aSearch['aAddressNonSearch']), ",")."]";
 +                                $aTerms[] = "array_cat(nameaddress_vector,ARRAY[]::integer[]) @> ARRAY[".join($aSearch['aAddress'],",")."]";
                              } else {
                                  $aTerms[] = "nameaddress_vector @> ARRAY[".join($aSearch['aAddress'], ",")."]";
 -                                if (sizeof($aSearch['aAddressNonSearch'])) {
 +                                /*if (sizeof($aSearch['aAddressNonSearch'])) {
                                      $aTerms[] = "array_cat(nameaddress_vector,ARRAY[]::integer[]) @> ARRAY[".join($aSearch['aAddressNonSearch'], ",")."]";
 -                                }
 +                                }*/
                              }
                          }
                          if ($aSearch['sCountryCode']) $aTerms[] = "country_code = '".pg_escape_string($aSearch['sCountryCode'])."'";
                              }
  
                              // Fallback to the road (if no housenumber was found)
-                             if (!sizeof($aPlaceIDs) && preg_match('/[0-9]+/', $aSearch['sHouseNumber'])) {
+                             if (!sizeof($aPlaceIDs) && preg_match('/[0-9]+/', $aSearch['sHouseNumber'])
+                                 && ($aSearch['aAddress'] || $aSearch['sCountryCode'])) {
                                  $aPlaceIDs = $aRoadPlaceIDs;
                                  //set to -1, if no housenumbers were found
                                  $searchedHousenumber = -1;
                      if ($this->aAddressRankList) {
                          $sSQL .= "     OR placex.rank_address in (".join(',', $this->aAddressRankList).")";
                      }
-                     if (CONST_Use_US_Tiger_Data) {
-                         $sSQL .= "  ) ";
+                     $sSQL .= "  ) ";
+                     if (CONST_Use_US_Tiger_Data && $this->iMaxAddressRank == 30) {
                          $sSQL .= "UNION ";
                          $sSQL .= "  SELECT place_id ";
                          $sSQL .= "  FROM location_property_tiger ";
                          $sSQL .= "  WHERE place_id in (".join(',', array_keys($aResultPlaceIDs)).") ";
-                         $sSQL .= "    AND (30 between $this->iMinAddressRank and $this->iMaxAddressRank ";
-                         if ($this->aAddressRankList) $sSQL .= " OR 30 in (".join(',', $this->aAddressRankList).")";
                      }
-                     $sSQL .= ") UNION ";
-                     $sSQL .= "  SELECT place_id ";
-                     $sSQL .= "  FROM location_property_osmline ";
-                     $sSQL .= "  WHERE place_id in (".join(',', array_keys($aResultPlaceIDs)).")";
-                     $sSQL .= "    AND startnumber is not NULL AND (30 between $this->iMinAddressRank and $this->iMaxAddressRank)";
+                     if ($this->iMaxAddressRank == 30) {
+                         $sSQL .= "UNION ";
+                         $sSQL .= "  SELECT place_id ";
+                         $sSQL .= "  FROM location_property_osmline ";
+                         $sSQL .= "  WHERE place_id in (".join(',', array_keys($aResultPlaceIDs)).")";
+                     }
                      if (CONST_Debug) var_dump($sSQL);
                      $aFilteredPlaceIDs = chksql($this->oDB->getCol($sSQL));
                      $tempIDs = array();