X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/75e35f383224fb8eab3d9a28b111499c0a670eff..4bff2814a9527e4d4f7645e9eedadf6bfeba698e:/lib/SearchDescription.php?ds=sidebyside diff --git a/lib/SearchDescription.php b/lib/SearchDescription.php index d18e7eab..533c0ab4 100644 --- a/lib/SearchDescription.php +++ b/lib/SearchDescription.php @@ -2,24 +2,7 @@ namespace Nominatim; -/** - * Operators describing special searches. - */ -abstract class Operator -{ - /// No operator selected. - const NONE = 0; - /// Search for POI of the given type. - const TYPE = 1; - /// Search for POIs near the given place. - const NEAR = 2; - /// Search for POIS in the given place. - const IN = 3; - /// Search for POIS named as given. - const NAME = 4; - /// Search for postcodes. - const POSTCODE = 5; -} +require_once(CONST_BasePath.'/lib/SpecialSearchOperator.php'); /** * Description of a single interpretation of a search query. @@ -58,6 +41,7 @@ class SearchDescription /// Index of phrase currently processed private $iNamePhrase = -1; + public function getRank() { return $this->iSearchRank; @@ -74,9 +58,6 @@ class SearchDescription return $this->sPostcode; } - /** - * Set the geographic search radius. - */ public function setNear(&$oNearPoint) { $this->oNearPoint = $oNearPoint; @@ -89,26 +70,17 @@ class SearchDescription $this->sType = $sType; } - /** - * Check if name or address for the search are specified. - */ public function isNamedSearch() { return sizeof($this->aName) > 0 || sizeof($this->aAddress) > 0; } - /** - * Check if only a country is requested. - */ public function isCountrySearch() { return $this->sCountryCode && sizeof($this->aName) == 0 && !$this->iOperator && !$this->oNearPoint; } - /** - * Check if a search near a geographic location is requested. - */ public function isNearSearch() { return (bool) $this->oNearPoint; @@ -158,13 +130,6 @@ class SearchDescription return $this->iOperator != Operator::NONE; } - /** - * Extract special terms from the query, amend the search - * and return the shortended query. - * - * Only the first special term found will be used but all will - * be removed from the query. - */ public function extractKeyValuePairs($sQuery) { // Search for terms of kind [=]. @@ -204,6 +169,7 @@ class SearchDescription /////////// Search building functions + public function extendWithFullTerm($aSearchTerm, $bWordInQuery, $bHasPartial, $sPhraseType, $bFirstToken, $bFirstPhrase, $bLastToken, &$iGlobalRank) { $aNewSearches = array(); @@ -301,7 +267,7 @@ class SearchDescription } $oSearch->setPoiSearch($iOp, $aSearchTerm['class'], $aSearchTerm['type']); - $aNewWordsetSearches[] = $oSearch; + $aNewSearches[] = $oSearch; } } elseif (isset($aSearchTerm['word_id']) && $aSearchTerm['word_id']) { $iWordID = $aSearchTerm['word_id']; @@ -314,8 +280,7 @@ class SearchDescription $oSearch->iSearchRank++; $oSearch->aAddress[$iWordID] = $iWordID; $aNewSearches[] = $oSearch; - } - else { + } else { $this->aFullNameAddress[$iWordID] = $iWordID; } } else { @@ -372,7 +337,7 @@ class SearchDescription $aNewSearches[] = $oSearch; } } - } + } } if ((!$this->sPostcode && !$this->aAddress && !$this->aAddressNonSearch) @@ -400,6 +365,7 @@ class SearchDescription /////////// Query functions + public function queryCountry(&$oDB, $sViewboxSQL) { $sSQL = 'SELECT place_id FROM placex '; @@ -469,7 +435,7 @@ class SearchDescription public function queryPostcode(&$oDB, $sCountryList, $iLimit) { - $sSQL = 'SELECT p.place_id FROM location_postcode p '; + $sSQL = 'SELECT p.place_id FROM location_postcode p '; if (sizeof($this->aAddress)) { $sSQL .= ', search_name s '; @@ -480,10 +446,10 @@ class SearchDescription $sSQL .= 'WHERE '; } - $sSQL .= "p.postcode = '".pg_escape_string(reset($this->$aName))."'"; + $sSQL .= "p.postcode = '".pg_escape_string(reset($this->aName))."'"; $sCountryTerm = $this->countryCodeSQL('p.country_code', $sCountryList); if ($sCountryTerm) { - $sSQL .= ' AND '.$sCountyTerm; + $sSQL .= ' AND '.$sCountryTerm; } $sSQL .= " LIMIT $iLimit"; @@ -571,7 +537,7 @@ class SearchDescription } if ($sViewboxSmall) { - $aTerms[] = 'centroid && '.$sViewboxSmall; + $aTerms[] = 'centroid && '.$sViewboxSmall; } if ($this->oNearPoint) { @@ -874,7 +840,8 @@ class SearchDescription /////////// Sort functions - static function bySearchRank($a, $b) + + public static function bySearchRank($a, $b) { if ($a->iSearchRank == $b->iSearchRank) { return $a->iOperator + strlen($a->sHouseNumber) @@ -884,4 +851,36 @@ class SearchDescription return $a->iSearchRank < $b->iSearchRank ? -1 : 1; } -}; + //////////// Debugging functions + + + public function dumpAsHtmlTableRow(&$aWordIDs) + { + $kf = function ($k) use (&$aWordIDs) { + return $aWordIDs[$k]; + }; + + echo ""; + echo "$this->iSearchRank"; + echo "".join(', ', array_map($kf, $this->aName)).""; + echo "".join(', ', array_map($kf, $this->aNameNonSearch)).""; + echo "".join(', ', array_map($kf, $this->aAddress)).""; + echo "".join(', ', array_map($kf, $this->aAddressNonSearch)).""; + echo "".$this->sCountryCode.""; + echo "".Operator::toString($this->iOperator).""; + echo "".$this->sClass.""; + echo "".$this->sType.""; + echo "".$this->sPostcode.""; + echo "".$this->sHouseNumber.""; + + if ($this->oNearPoint) { + echo "".$this->oNearPoint->lat().""; + echo "".$this->oNearPoint->lon().""; + echo "".$this->oNearPoint->radius().""; + } else { + echo ""; + } + + echo ""; + } +}