X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/db3ced17bbfff00411f506d8c84419c875959d5e..e2d2571ad03030382e8bec1f6af153074a4feb27:/lib-php/TokenWord.php diff --git a/lib-php/TokenWord.php b/lib-php/TokenWord.php index fc28535d..59456e35 100644 --- a/lib-php/TokenWord.php +++ b/lib-php/TokenWord.php @@ -8,31 +8,95 @@ namespace Nominatim\Token; class Word { /// Database word id, if applicable. - public $iId; - /// If true, the word may represent only part of a place name. - public $bPartial; + private $iId; /// Number of appearances in the database. - public $iSearchNameCount; + private $iSearchNameCount; /// Number of terms in the word. - public $iTermCount; + private $iTermCount; - public function __construct($iId, $bPartial, $iSearchNameCount, $iTermCount) + public function __construct($iId, $iSearchNameCount, $iTermCount) { $this->iId = $iId; - $this->bPartial = $bPartial; $this->iSearchNameCount = $iSearchNameCount; $this->iTermCount = $iTermCount; } + 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) + { + // Full words can only be a name if they appear at the beginning + // of the phrase. In structured search the name must forcably in + // the first phrase. In unstructured search it may be in a later + // phrase when the first phrase is a house number. + if ($oSearch->hasName() + || !($oPosition->isFirstPhrase() || $oPosition->isPhrase('')) + ) { + if ($this->iTermCount > 1 + && ($oPosition->isPhrase('') || !$oPosition->isFirstPhrase()) + ) { + $oNewSearch = $oSearch->clone(1); + $oNewSearch->addAddressToken($this->iId); + + return array($oNewSearch); + } + } elseif (!$oSearch->hasName(true)) { + $oNewSearch = $oSearch->clone(1); + $oNewSearch->addNameToken( + $this->iId, + CONST_Search_NameOnlySearchFrequencyThreshold + && $this->iSearchNameCount + < CONST_Search_NameOnlySearchFrequencyThreshold + ); + + return array($oNewSearch); + } + + return array(); + } + public function debugInfo() { return array( 'ID' => $this->iId, 'Type' => 'word', 'Info' => array( - 'partial' => $this->bPartial, - 'count' => $this->iSearchNameCount + 'count' => $this->iSearchNameCount, + 'terms' => $this->iTermCount ) ); } + + public function debugCode() + { + return 'W'; + } }