From: Sarah Hoffmann Date: Sun, 8 Oct 2017 21:33:54 +0000 (+0200) Subject: move country list to SearchContext X-Git-Tag: v3.1.0~47^2~4 X-Git-Url: https://git.openstreetmap.org./nominatim.git/commitdiff_plain/55629a48913d6e091247105cf52d6492574691f7?hp=907133a38c7cba6868f8d0bf7222f7fd57698c31 move country list to SearchContext --- diff --git a/lib/Geocode.php b/lib/Geocode.php index b978a72c..b27f69e8 100644 --- a/lib/Geocode.php +++ b/lib/Geocode.php @@ -852,15 +852,14 @@ class Geocode if ($this->aExcludePlaceIDs) { $oCtx->setExcludeList($this->aExcludePlaceIDs); } + if ($this->aCountryCodes) { + $oCtx->setCountryList($this->aCountryCodes); + } $sNormQuery = $this->normTerm($this->sQuery); $sLanguagePrefArraySQL = getArraySQL( array_map("getDBQuoted", $this->aLangPrefOrder) ); - $sCountryCodesSQL = false; - if ($this->aCountryCodes) { - $sCountryCodesSQL = join(',', array_map('addQuotes', $this->aCountryCodes)); - } $sQuery = $this->sQuery; if (!preg_match('//u', $sQuery)) { @@ -1107,25 +1106,16 @@ class Geocode if (!$oCtx->isBoundedSearch()) { continue; } - - $aPlaceIDs = $oSearch->queryNearbyPoi( - $this->oDB, - $sCountryCodesSQL, - $this->iLimit - ); + $aPlaceIDs = $oSearch->queryNearbyPoi($this->oDB, $this->iLimit); } elseif ($oSearch->isOperator(Operator::POSTCODE)) { - $aPlaceIDs = $oSearch->queryPostcode( - $this->oDB, - $sCountryCodesSQL, - $this->iLimit - ); + // looking for postcode + $aPlaceIDs = $oSearch->queryPostcode($this->oDB, $this->iLimit); } else { // Ordinary search: // First search for places according to name and address. $aNamedPlaceIDs = $oSearch->queryNamedPlace( $this->oDB, $aWordFrequencyScores, - $sCountryCodesSQL, $this->iMinAddressRank, $this->iMaxAddressRank, $this->iLimit diff --git a/lib/SearchContext.php b/lib/SearchContext.php index 1b48fd84..f5eab95a 100644 --- a/lib/SearchContext.php +++ b/lib/SearchContext.php @@ -22,6 +22,7 @@ class SearchContext public $sqlViewboxSmall = ''; public $sqlViewboxLarge = ''; public $sqlViewboxCentre = ''; + public $sqlCountryList = ''; private $sqlExcludeList = ''; public function hasNearPoint() @@ -97,6 +98,11 @@ class SearchContext $this->sqlExcludeList = ' not in ('.join(',', $aExcluded).')'; } + public function setCountryList($aCountries) + { + $this->sqlCountryList = '('.join(',', array_map('addQuotes', $aCountries)).')'; + } + /** * Extract a coordinate point from a query string. * diff --git a/lib/SearchDescription.php b/lib/SearchDescription.php index 0a1959fd..39f7ffca 100644 --- a/lib/SearchDescription.php +++ b/lib/SearchDescription.php @@ -109,13 +109,13 @@ class SearchDescription return 'place_classtype_'.$this->sClass.'_'.$this->sType; } - public function countryCodeSQL($sVar, $sCountryList) + public function countryCodeSQL($sVar) { if ($this->sCountryCode) { return $sVar.' = \''.$this->sCountryCode."'"; } - if ($sCountryList) { - return $sVar.' in ('.$sCountryList.')'; + if ($this->oContext->sqlCountryList) { + return $sVar.' in '.$this->oContext->sqlCountryList; } return ''; @@ -382,7 +382,7 @@ class SearchDescription return chksql($oDB->getCol($sSQL)); } - public function queryNearbyPoi(&$oDB, $sCountryList, $iLimit) + public function queryNearbyPoi(&$oDB, $iLimit) { if (!$this->sClass) { return array(); @@ -393,7 +393,7 @@ class SearchDescription $sSQL = 'SELECT count(*) FROM pg_tables WHERE tablename = \''.$sPoiTable."'"; if (chksql($oDB->getOne($sSQL))) { $sSQL = 'SELECT place_id FROM '.$sPoiTable.' ct'; - if ($sCountryList) { + if ($this->oContext->sqlCountryList) { $sSQL .= ' JOIN placex USING (place_id)'; } if ($this->oContext->hasNearPoint()) { @@ -401,8 +401,8 @@ class SearchDescription } else if ($this->oContext->bViewboxBounded) { $sSQL .= ' WHERE ST_Contains('.$this->oContext->sqlViewboxSmall.', ct.centroid)'; } - if ($sCountryList) { - $sSQL .= " AND country_code in ($sCountryList)"; + if ($this->oContext->sqlCountryList) { + $sSQL .= ' AND country_code in '.$this->oContext->sqlCountryList; } $sSQL .= $this->oContext->excludeSQL(' AND place_id'); if ($this->oContext->sqlViewboxCentre) { @@ -421,8 +421,8 @@ class SearchDescription $sSQL .= 'class=\''.$this->sClass."' and type='".$this->sType."'"; $sSQL .= ' AND '.$this->oContext->withinSQL('geometry'); $sSQL .= ' AND linked_place_id is null'; - if ($sCountryList) { - $sSQL .= " AND country_code in ($sCountryList)"; + if ($this->oContext->sqlCountryList) { + $sSQL .= ' AND country_code in '.$this->oContext->sqlCountryList; } $sSQL .= ' ORDER BY '.$this->oContext->distanceSQL('centroid')." ASC"; $sSQL .= " LIMIT $iLimit"; @@ -433,7 +433,7 @@ class SearchDescription return array(); } - public function queryPostcode(&$oDB, $sCountryList, $iLimit) + public function queryPostcode(&$oDB, $iLimit) { $sSQL = 'SELECT p.place_id FROM location_postcode p '; @@ -447,10 +447,7 @@ class SearchDescription } $sSQL .= "p.postcode = '".reset($this->aName)."'"; - $sCountryTerm = $this->countryCodeSQL('p.country_code', $sCountryList); - if ($sCountryTerm) { - $sSQL .= ' AND '.$sCountryTerm; - } + $sSQL .= $this->countryCodeSQL(' AND p.country_code'); $sSQL .= $this->oContext->excludeSQL(' AND p.place_id'); $sSQL .= " LIMIT $iLimit"; @@ -459,7 +456,7 @@ class SearchDescription return chksql($oDB->getCol($sSQL)); } - public function queryNamedPlace(&$oDB, $aWordFrequencyScores, $sCountryList, $iMinAddressRank, $iMaxAddressRank, $iLimit) + public function queryNamedPlace(&$oDB, $aWordFrequencyScores, $iMinAddressRank, $iMaxAddressRank, $iLimit) { $aTerms = array(); $aOrder = array(); @@ -506,7 +503,7 @@ class SearchDescription } } - $sCountryTerm = $this->countryCodeSQL('country_code', $sCountryList); + $sCountryTerm = $this->countryCodeSQL('country_code'); if ($sCountryTerm) { $aTerms[] = $sCountryTerm; } @@ -589,7 +586,6 @@ class SearchDescription return array(); } - public function queryHouseNumber(&$oDB, $aRoadPlaceIDs, $iLimit) { $sPlaceIDs = join(',', $aRoadPlaceIDs);