]> git.openstreetmap.org Git - nominatim.git/blobdiff - lib-php/TokenSpecialTerm.php
Merge pull request #2484 from lonvia/fix-index-use
[nominatim.git] / lib-php / TokenSpecialTerm.php
index 89dfa02619447f78106eb16eb2139e8557c8ab4b..6eb2ede341a21b2a51da6646431a8c5fd41c16f1 100644 (file)
@@ -10,13 +10,13 @@ require_once(CONST_LibDir.'/SpecialSearchOperator.php');
 class SpecialTerm
 {
     /// Database word id, if applicable.
-    public $iId;
+    private $iId;
     /// Class (or OSM tag key) of the place to look for.
-    public $sClass;
+    private $sClass;
     /// Type (or OSM tag value) of the place to look for.
-    public $sType;
+    private $sType;
     /// Relationship of the operator to the object (see Operator class).
-    public $iOperator;
+    private $iOperator;
 
     public function __construct($iID, $sClass, $sType, $iOperator)
     {
@@ -31,6 +31,25 @@ class SpecialTerm
         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->hasOperator()
+               && $oPosition->isPhrase('')
+               && ($this->iOperator != \Nominatim\Operator::NONE
+                  || (!$oSearch->hasAddress() && !$oSearch->hasHousenumber() && !$oSearch->hasCountry()));
+    }
+
     /**
      * Derive new searches by adding this token to an existing search.
      *
@@ -42,10 +61,6 @@ class SpecialTerm
      */
     public function extendSearch($oSearch, $oPosition)
     {
-        if ($oSearch->hasOperator() || !$oPosition->isPhrase('')) {
-            return array();
-        }
-
         $iSearchCost = 2;
 
         $iOp = $this->iOperator;
@@ -54,8 +69,8 @@ class SpecialTerm
                 $iOp = \Nominatim\Operator::NAME;
             } else {
                 $iOp = \Nominatim\Operator::NEAR;
+                $iSearchCost += 2;
             }
-            $iSearchCost += 2;
         } elseif (!$oPosition->isFirstToken() && !$oPosition->isLastToken()) {
             $iSearchCost += 2;
         }