move SearchDescription building into tokens

Moving the logic for extending the SearchDescription into the
token classes splits up the code and makes it more readable.
More importantly: it allows tokenizer to define custom token
classes in the future.
This commit is contained in:
Sarah Hoffmann
2021-07-17 20:24:33 +02:00
parent 3cd85eaaf1
commit a48ebd9b47
9 changed files with 464 additions and 270 deletions

View File

@@ -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,55 @@ class Postcode
$this->sCountryCode = empty($sCountryCode) ? '' : $sCountryCode;
}
public function getId()
{
return $this->iId;
}
/**
* 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 ($oSearch->hasPostcode() || !$oPosition->maybePhrase('postalcode')) {
return $aNewSearches;
}
// 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 +78,9 @@ class Postcode
'Info' => $this->sPostcode.'('.$this->sCountryCode.')'
);
}
public function debugCode()
{
return 'P';
}
}