From 907133a38c7cba6868f8d0bf7222f7fd57698c31 Mon Sep 17 00:00:00 2001 From: Sarah Hoffmann Date: Sun, 8 Oct 2017 23:15:06 +0200 Subject: [PATCH] move excluded place list to SearchContext --- lib/Geocode.php | 7 +++---- lib/SearchContext.php | 15 ++++++++++++++ lib/SearchDescription.php | 43 ++++++++++++++------------------------- 3 files changed, 33 insertions(+), 32 deletions(-) diff --git a/lib/Geocode.php b/lib/Geocode.php index 1138824c..b978a72c 100644 --- a/lib/Geocode.php +++ b/lib/Geocode.php @@ -849,6 +849,9 @@ class Geocode } else if ($this->aViewBox) { $oCtx->setViewboxFromBox($this->aViewBox, $this->bBoundedSearch); } + if ($this->aExcludePlaceIDs) { + $oCtx->setExcludeList($this->aExcludePlaceIDs); + } $sNormQuery = $this->normTerm($this->sQuery); $sLanguagePrefArraySQL = getArraySQL( @@ -1108,7 +1111,6 @@ class Geocode $aPlaceIDs = $oSearch->queryNearbyPoi( $this->oDB, $sCountryCodesSQL, - $this->aExcludePlaceIDs ? join(',', $this->aExcludePlaceIDs) : '', $this->iLimit ); } elseif ($oSearch->isOperator(Operator::POSTCODE)) { @@ -1126,7 +1128,6 @@ class Geocode $sCountryCodesSQL, $this->iMinAddressRank, $this->iMaxAddressRank, - $this->aExcludePlaceIDs ? join(',', $this->aExcludePlaceIDs) : '', $this->iLimit ); @@ -1142,7 +1143,6 @@ class Geocode $aResult = $oSearch->queryHouseNumber( $this->oDB, $aPlaceIDs, - $this->aExcludePlaceIDs ? join(',', $this->aExcludePlaceIDs) : '', $this->iLimit ); @@ -1159,7 +1159,6 @@ class Geocode $aPlaceIDs = $oSearch->queryPoiByOperator( $this->oDB, $aPlaceIDs, - $this->aExcludePlaceIDs ? join(',', $this->aExcludePlaceIDs) : '', $this->iLimit ); } diff --git a/lib/SearchContext.php b/lib/SearchContext.php index 7552ae99..1b48fd84 100644 --- a/lib/SearchContext.php +++ b/lib/SearchContext.php @@ -22,6 +22,7 @@ class SearchContext public $sqlViewboxSmall = ''; public $sqlViewboxLarge = ''; public $sqlViewboxCentre = ''; + private $sqlExcludeList = ''; public function hasNearPoint() { @@ -91,6 +92,11 @@ class SearchContext $this->sqlViewboxLarge = "'".$sGeom."'::geometry"; } + public function setExcludeList($aExcluded) + { + $this->sqlExcludeList = ' not in ('.join(',', $aExcluded).')'; + } + /** * Extract a coordinate point from a query string. * @@ -138,4 +144,13 @@ class SearchContext return $sSQL; } + + public function excludeSQL($sVariable) + { + if ($this->sqlExcludeList) { + return $sVariable.$this->sqlExcludeList; + } + + return ''; + } } diff --git a/lib/SearchDescription.php b/lib/SearchDescription.php index e6cdca63..0a1959fd 100644 --- a/lib/SearchDescription.php +++ b/lib/SearchDescription.php @@ -382,7 +382,7 @@ class SearchDescription return chksql($oDB->getCol($sSQL)); } - public function queryNearbyPoi(&$oDB, $sCountryList, $sExcludeSQL, $iLimit) + public function queryNearbyPoi(&$oDB, $sCountryList, $iLimit) { if (!$this->sClass) { return array(); @@ -404,9 +404,7 @@ class SearchDescription if ($sCountryList) { $sSQL .= " AND country_code in ($sCountryList)"; } - if ($sExcludeSQL) { - $sSQL .= ' AND place_id not in ('.$sExcludeSQL.')'; - } + $sSQL .= $this->oContext->excludeSQL(' AND place_id'); if ($this->oContext->sqlViewboxCentre) { $sSQL .= ' ORDER BY ST_Distance('; $sSQL .= $this->oContext->sqlViewboxCentre.', ct.centroid) ASC'; @@ -453,6 +451,7 @@ class SearchDescription if ($sCountryTerm) { $sSQL .= ' AND '.$sCountryTerm; } + $sSQL .= $this->oContext->excludeSQL(' AND p.place_id'); $sSQL .= " LIMIT $iLimit"; if (CONST_Debug) var_dump($sSQL); @@ -460,7 +459,7 @@ class SearchDescription return chksql($oDB->getCol($sSQL)); } - public function queryNamedPlace(&$oDB, $aWordFrequencyScores, $sCountryList, $iMinAddressRank, $iMaxAddressRank, $sExcludeSQL, $iLimit) + public function queryNamedPlace(&$oDB, $aWordFrequencyScores, $sCountryList, $iMinAddressRank, $iMaxAddressRank, $iLimit) { $aTerms = array(); $aOrder = array(); @@ -534,8 +533,9 @@ class SearchDescription } } + $sExcludeSQL = $this->oContext->excludeSQL('place_id'); if ($sExcludeSQL) { - $aTerms[] = 'place_id not in ('.$sExcludeSQL.')'; + $aTerms[] = $sExcludeSQL; } if ($this->oContext->bViewboxBounded) { @@ -590,7 +590,7 @@ class SearchDescription } - public function queryHouseNumber(&$oDB, $aRoadPlaceIDs, $sExcludeSQL, $iLimit) + public function queryHouseNumber(&$oDB, $aRoadPlaceIDs, $iLimit) { $sPlaceIDs = join(',', $aRoadPlaceIDs); @@ -598,9 +598,7 @@ class SearchDescription $sSQL = 'SELECT place_id FROM placex '; $sSQL .= 'WHERE parent_place_id in ('.$sPlaceIDs.')'; $sSQL .= " AND transliteration(housenumber) ~* E'".$sHouseNumberRegex."'"; - if ($sExcludeSQL) { - $sSQL .= ' AND place_id not in ('.$sExcludeSQL.')'; - } + $sSQL .= $this->oContext->excludeSQL(' AND place_id'); $sSQL .= " LIMIT $iLimit"; if (CONST_Debug) var_dump($sSQL); @@ -629,10 +627,7 @@ class SearchDescription $sSQL .= " or interpolationtype='all') and "; $sSQL .= $iHousenumber.">=startnumber and "; $sSQL .= $iHousenumber."<=endnumber"; - - if ($sExcludeSQL) { - $sSQL .= ' AND place_id not in ('.$sExcludeSQL.')'; - } + $sSQL .= $this->oContext->excludeSQL(' AND place_id'); $sSQL .= " limit $iLimit"; if (CONST_Debug) var_dump($sSQL); @@ -649,9 +644,7 @@ class SearchDescription $sSQL = 'SELECT place_id FROM location_property_aux'; $sSQL .= ' WHERE parent_place_id in ('.$sPlaceIDs.')'; $sSQL .= " AND housenumber = '".$this->sHouseNumber."'"; - if ($sExcludeSQL) { - $sSQL .= " AND place_id not in ($sExcludeSQL)"; - } + $sSQL .= $this->oContext->excludeSQL(' AND place_id'); $sSQL .= " limit $iLimit"; if (CONST_Debug) var_dump($sSQL); @@ -675,10 +668,7 @@ class SearchDescription $sSQL .= " or interpolationtype='all') and "; $sSQL .= $iHousenumber.">=startnumber and "; $sSQL .= $iHousenumber."<=endnumber"; - - if ($sExcludeSQL) { - $sSQL .= ' AND place_id not in ('.$sExcludeSQL.')'; - } + $sSQL .= $this->oContext->excludeSQL(' AND place_id'); $sSQL .= " limit $iLimit"; if (CONST_Debug) var_dump($sSQL); @@ -694,7 +684,7 @@ class SearchDescription } - public function queryPoiByOperator(&$oDB, $aParentIDs, $sExcludeSQL, $iLimit) + public function queryPoiByOperator(&$oDB, $aParentIDs, $iLimit) { $sPlaceIDs = join(',', $aParentIDs); $aClassPlaceIDs = array(); @@ -707,6 +697,7 @@ class SearchDescription $sSQL .= " AND class='".$this->sClass."' "; $sSQL .= " AND type='".$this->sType."'"; $sSQL .= " AND linked_place_id is null"; + $sSQL .= $this->oContext->excludeSQL(' AND place_id'); $sSQL .= " ORDER BY rank_search ASC "; $sSQL .= " LIMIT $iLimit"; @@ -783,9 +774,7 @@ class SearchDescription $sSQL .= " WHERE ST_Contains('$sPlaceGeom', l.centroid)"; } - if ($sExcludeSQL) { - $sSQL .= ' AND l.place_id not in ('.$sExcludeSQL.')'; - } + $sSQL .= $this->oContext->excludeSQL(' AND l.place_id'); $sSQL .= 'limit 300) i '; if ($sOrderBySQL) { $sSQL .= 'order by order_term asc'; @@ -816,9 +805,7 @@ class SearchDescription $sSQL .= " AND ST_DWithin(l.geometry, f.centroid, $fRange)"; $sSQL .= " AND l.class='".$this->sClass."'"; $sSQL .= " AND l.type='".$this->sType."'"; - if ($sExcludeSQL) { - $sSQL .= " AND l.place_id not in (".$sExcludeSQL.")"; - } + $sSQL .= $this->oContext->excludeSQL(' AND l.place_id'); if ($sOrderBySQL) { $sSQL .= "ORDER BY orderterm ASC"; } -- 2.45.1