X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/614a6ab861fc991da390cdeca137e96ee4dcde2c..30511fd3ab9d731b0afec202386fc2425a0b1b9f:/lib/SearchDescription.php diff --git a/lib/SearchDescription.php b/lib/SearchDescription.php index 42e5af30..7073186b 100644 --- a/lib/SearchDescription.php +++ b/lib/SearchDescription.php @@ -3,6 +3,7 @@ namespace Nominatim; require_once(CONST_BasePath.'/lib/SpecialSearchOperator.php'); +require_once(CONST_BasePath.'/lib/SearchContext.php'); /** * Description of a single interpretation of a search query. @@ -33,15 +34,20 @@ class SearchDescription private $sHouseNumber = ''; /// Postcode for the object. private $sPostcode = ''; - /// Geographic search area. - private $oNearPoint = false; + /// Global search constraints. + private $oContext; // Temporary values used while creating the search description. - /// Index of phrase currently processed + /// Index of phrase currently processed. private $iNamePhrase = -1; + public function __construct($oContext) + { + $this->oContext = $oContext; + } + public function getRank() { return $this->iSearchRank; @@ -58,11 +64,6 @@ class SearchDescription return $this->sPostcode; } - public function setNear(&$oNearPoint) - { - $this->oNearPoint = $oNearPoint; - } - public function setPoiSearch($iOperator, $sClass, $sType) { $this->iOperator = $iOperator; @@ -78,12 +79,7 @@ class SearchDescription public function isCountrySearch() { return $this->sCountryCode && sizeof($this->aName) == 0 - && !$this->iOperator && !$this->oNearPoint; - } - - public function isNearSearch() - { - return (bool) $this->oNearPoint; + && !$this->iOperator && !$this->oContext->hasNearPoint(); } public function isPoiSearch() @@ -400,8 +396,8 @@ class SearchDescription if ($sCountryList) { $sSQL .= ' JOIN placex USING (place_id)'; } - if ($this->oNearPoint) { - $sSQL .= ' WHERE '.$this->oNearPoint->withinSQL('ct.centroid'); + if ($this->oContext->hasNearPoint()) { + $sSQL .= ' WHERE '.$this->oContext->withinSQL('ct.centroid'); } else { $sSQL .= " WHERE ST_Contains($sViewboxSQL, ct.centroid)"; } @@ -413,23 +409,23 @@ class SearchDescription } if ($sViewboxCentreSQL) { $sSQL .= " ORDER BY ST_Distance($sViewboxCentreSQL, ct.centroid) ASC"; - } elseif ($this->oNearPoint) { - $sSQL .= ' ORDER BY '.$this->oNearPoint->distanceSQL('ct.centroid').' ASC'; + } elseif ($this->oContext->hasNearPoint()) { + $sSQL .= ' ORDER BY '.$this->oContext->distanceSQL('ct.centroid').' ASC'; } $sSQL .= " limit $iLimit"; if (CONST_Debug) var_dump($sSQL); return chksql($oDB->getCol($sSQL)); } - if ($this->oNearPoint) { + if ($this->oContext->hasNearPoint()) { $sSQL = 'SELECT place_id FROM placex WHERE '; $sSQL .= 'class=\''.$this->sClass."' and type='".$this->sType."'"; - $sSQL .= ' AND '.$this->oNearPoint->withinSQL('geometry'); + $sSQL .= ' AND '.$this->oContext->withinSQL('geometry'); $sSQL .= ' AND linked_place_id is null'; if ($sCountryList) { $sSQL .= " AND country_code in ($sCountryList)"; } - $sSQL .= ' ORDER BY '.$this->oNearPoint->distanceSQL('centroid')." ASC"; + $sSQL .= ' ORDER BY '.$this->oContext->distanceSQL('centroid')." ASC"; $sSQL .= " LIMIT $iLimit"; if (CONST_Debug) var_dump($sSQL); return chksql($oDB->getCol($sSQL)); @@ -526,9 +522,9 @@ class SearchDescription } } - if ($this->oNearPoint) { - $aTerms[] = $this->oNearPoint->withinSQL('centroid'); - $aOrder[] = $this->oNearPoint->distanceSQL('centroid'); + if ($this->oContext->hasNearPoint()) { + $aTerms[] = $this->oContext->withinSQL('centroid'); + $aOrder[] = $this->oContext->distanceSQL('centroid'); } elseif ($this->sPostcode) { if (!sizeof($this->aAddress)) { $aTerms[] = "EXISTS(SELECT place_id FROM location_postcode p WHERE p.postcode = '".$this->sPostcode."' AND ST_DWithin(search_name.centroid, p.geometry, 0.1))"; @@ -545,8 +541,8 @@ class SearchDescription $aTerms[] = 'centroid && '.$sViewboxSmall; } - if ($this->oNearPoint) { - $aOrder[] = $this->oNearPoint->distanceSQL('centroid'); + if ($this->oContext->hasNearPoint()) { + $aOrder[] = $this->oContext->distanceSQL('centroid'); } if ($this->sHouseNumber) { @@ -765,8 +761,8 @@ class SearchDescription $fRange = 0.05; $sOrderBySQL = ''; - if ($this->oNearPoint) { - $sOrderBySQL = $this->oNearPoint->distanceSQL('l.centroid'); + if ($this->oContext->hasNearPoint()) { + $sOrderBySQL = $this->oContext->distanceSQL('l.centroid'); } elseif ($sPlaceIDs) { $sOrderBySQL = "ST_Distance(l.centroid, f.geometry)"; } elseif ($sPlaceGeom) { @@ -804,13 +800,13 @@ class SearchDescription $aClassPlaceIDs = array_merge($aClassPlaceIDs, chksql($oDB->getCol($sSQL))); } else { - if ($this->oNearPoint) { - $fRange = $this->oNearPoint->radius(); + if ($this->oContext->hasNearPoint()) { + $fRange = $this->oContext->nearRadius(); } $sOrderBySQL = ''; - if ($this->oNearPoint) { - $sOrderBySQL = $this->oNearPoint->distanceSQL('l.geometry'); + if ($this->oContext->hasNearPoint()) { + $sOrderBySQL = $this->oContext->distanceSQL('l.geometry'); } else { $sOrderBySQL = "ST_Distance(l.geometry, f.geometry)"; } @@ -878,14 +874,6 @@ class SearchDescription echo "".$this->sPostcode.""; echo "".$this->sHouseNumber.""; - if ($this->oNearPoint) { - echo "".$this->oNearPoint->lat().""; - echo "".$this->oNearPoint->lon().""; - echo "".$this->oNearPoint->radius().""; - } else { - echo ""; - } - echo ""; } }