X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/6a7e0d652b1d40a397e1c1386d500101796676c4..86eeb4d2eddaa6c409f542169780f59dc31ffc1b:/lib-php/TokenPostcode.php diff --git a/lib-php/TokenPostcode.php b/lib-php/TokenPostcode.php index 8fa2ae80..c0b42fad 100644 --- a/lib-php/TokenPostcode.php +++ b/lib-php/TokenPostcode.php @@ -8,11 +8,11 @@ namespace Nominatim\Token; class Postcode { /// Database word id, if available. - public $iId; + private $iId; /// Full nomralized postcode (upper cased). - public $sPostcode; + private $sPostcode; // Optional country code the postcode belongs to (currently unused). - public $sCountryCode; + private $sCountryCode; public function __construct($iId, $sPostcode, $sCountryCode = '') { @@ -21,6 +21,67 @@ class Postcode $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 +90,9 @@ class Postcode 'Info' => $this->sPostcode.'('.$this->sCountryCode.')' ); } + + public function debugCode() + { + return 'P'; + } }