X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/db3ced17bbfff00411f506d8c84419c875959d5e..f3c4196c758a7720aefc26a7043bf1c6553028e2:/lib-php/TokenHousenumber.php?ds=sidebyside diff --git a/lib-php/TokenHousenumber.php b/lib-php/TokenHousenumber.php index 5c7c6e9b..cd60d3ca 100644 --- a/lib-php/TokenHousenumber.php +++ b/lib-php/TokenHousenumber.php @@ -8,9 +8,9 @@ namespace Nominatim\Token; class HouseNumber { /// Database word id, if available. - public $iId; + private $iId; /// Normalized house number. - public $sToken; + private $sToken; public function __construct($iId, $sToken) { @@ -18,6 +18,80 @@ class HouseNumber $this->sToken = $sToken; } + 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->hasHousenumber() + && !$oSearch->hasOperator(\Nominatim\Operator::POSTCODE) + && $oPosition->maybePhrase('street'); + } + + /** + * 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(); + + // sanity check: if the housenumber is not mainly made + // up of numbers, add a penalty + $iSearchCost = 1; + if (preg_match('/\\d/', $this->sToken) === 0 + || preg_match_all('/[^0-9]/', $this->sToken, $aMatches) > 2) { + $iSearchCost++; + } + if (!$oSearch->hasOperator(\Nominatim\Operator::NONE)) { + $iSearchCost++; + } + if (empty($this->iId)) { + $iSearchCost++; + } + // also must not appear in the middle of the address + if ($oSearch->hasAddress() || $oSearch->hasPostcode()) { + $iSearchCost++; + } + + $oNewSearch = $oSearch->clone($iSearchCost); + $oNewSearch->setHousenumber($this->sToken); + $aNewSearches[] = $oNewSearch; + + // Housenumbers may appear in the name when the place has its own + // address terms. + if ($this->iId !== null + && ($oSearch->getNamePhrase() >= 0 || !$oSearch->hasName()) + && !$oSearch->hasAddress() + ) { + $oNewSearch = $oSearch->clone($iSearchCost); + $oNewSearch->setHousenumberAsName($this->iId); + + $aNewSearches[] = $oNewSearch; + } + + return $aNewSearches; + } + + public function debugInfo() { return array( @@ -26,4 +100,9 @@ class HouseNumber 'Info' => array('nr' => $this->sToken) ); } + + public function debugCode() + { + return 'H'; + } }