X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/db3ced17bbfff00411f506d8c84419c875959d5e..330b8d2fdfdd935da123abf9ecf96b3bc7a12be5:/lib-php/TokenPostcode.php diff --git a/lib-php/TokenPostcode.php b/lib-php/TokenPostcode.php index 8fa2ae80..0ff92929 100644 --- a/lib-php/TokenPostcode.php +++ b/lib-php/TokenPostcode.php @@ -1,4 +1,12 @@ iId = $iId; - $this->sPostcode = $sPostcode; + $iSplitPos = strpos($sPostcode, '@'); + if ($iSplitPos === false) { + $this->sPostcode = $sPostcode; + } else { + $this->sPostcode = substr($sPostcode, 0, $iSplitPos); + } $this->sCountryCode = empty($sCountryCode) ? '' : $sCountryCode; } + public function getId() + { + return $this->iId; + } + + /** + * Check if the token can be added to the given search. + * Derive new searches by adding this token to an existing search. + * + * @param object $oSearch Partial search description derived so far. + * @param object $oPosition Description of the token position within + the query. + * + * @return True if the token is compatible with the search configuration + * given the position. + */ + public function isExtendable($oSearch, $oPosition) + { + return !$oSearch->hasPostcode() && $oPosition->maybePhrase('postalcode'); + } + + /** + * Derive new searches by adding this token to an existing search. + * + * @param object $oSearch Partial search description derived so far. + * @param object $oPosition Description of the token position within + the query. + * + * @return SearchDescription[] List of derived search descriptions. + */ + public function extendSearch($oSearch, $oPosition) + { + $aNewSearches = array(); + + // If we have structured search or this is the first term, + // make the postcode the primary search element. + if ($oSearch->hasOperator(\Nominatim\Operator::NONE) && $oPosition->isFirstToken()) { + $oNewSearch = $oSearch->clone(1); + $oNewSearch->setPostcodeAsName($this->iId, $this->sPostcode); + + $aNewSearches[] = $oNewSearch; + } + + // If we have a structured search or this is not the first term, + // add the postcode as an addendum. + if (!$oSearch->hasOperator(\Nominatim\Operator::POSTCODE) + && ($oPosition->isPhrase('postalcode') || $oSearch->hasName()) + ) { + $iPenalty = 1; + if (strlen($this->sPostcode) < 4) { + $iPenalty += 4 - strlen($this->sPostcode); + } + $oNewSearch = $oSearch->clone($iPenalty); + $oNewSearch->setPostcode($this->sPostcode); + + $aNewSearches[] = $oNewSearch; + } + + return $aNewSearches; + } + public function debugInfo() { return array( @@ -29,4 +103,9 @@ class Postcode 'Info' => $this->sPostcode.'('.$this->sCountryCode.')' ); } + + public function debugCode() + { + return 'P'; + } }