X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/6070c3d1d58fb8737b387e8a3ef1f17fb1eb5d54..b14ce959d9532f192b748b12f6c71f23a9c1a60b:/lib-php/TokenPartial.php diff --git a/lib-php/TokenPartial.php b/lib-php/TokenPartial.php index 477ef9c5..131bb2a3 100644 --- a/lib-php/TokenPartial.php +++ b/lib-php/TokenPartial.php @@ -8,16 +8,98 @@ namespace Nominatim\Token; class Partial { /// Database word id, if applicable. - public $iId; + private $iId; /// Number of appearances in the database. - public $iSearchNameCount; + private $iSearchNameCount; + /// True, if the token consists exclusively of digits and spaces. + private $bNumberToken; - public function __construct($iId, $iSearchNameCount) + public function __construct($iId, $sToken, $iSearchNameCount) { $this->iId = $iId; + $this->bNumberToken = (bool) preg_match('#^[0-9 ]+$#', $sToken); $this->iSearchNameCount = $iSearchNameCount; } + 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 !$oPosition->isPhrase('country'); + } + + /** + * 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(); + + // Partial token in Address. + if (($oPosition->isPhrase('') || !$oPosition->isFirstPhrase()) + && $oSearch->hasName() + ) { + $iSearchCost = $this->bNumberToken ? 2 : 1; + if ($this->iSearchNameCount >= CONST_Max_Word_Frequency) { + $iSearchCost += 1; + } + + $oNewSearch = $oSearch->clone($iSearchCost); + $oNewSearch->addAddressToken( + $this->iId, + $this->iSearchNameCount < CONST_Max_Word_Frequency + ); + + $aNewSearches[] = $oNewSearch; + } + + // Partial token in Name. + if ((!$oSearch->hasPostcode() && !$oSearch->hasAddress()) + && (!$oSearch->hasName(true) + || $oSearch->getNamePhrase() == $oPosition->getPhrase()) + ) { + $iSearchCost = 1; + if (!$oSearch->hasName(true)) { + $iSearchCost += 1; + } + if ($this->bNumberToken) { + $iSearchCost += 1; + } + + $oNewSearch = $oSearch->clone($iSearchCost); + $oNewSearch->addPartialNameToken( + $this->iId, + $this->iSearchNameCount < CONST_Max_Word_Frequency, + $oPosition->getPhrase() + ); + + $aNewSearches[] = $oNewSearch; + } + + return $aNewSearches; + } + + public function debugInfo() { return array( @@ -28,4 +110,9 @@ class Partial ) ); } + + public function debugCode() + { + return 'w'; + } }