]> git.openstreetmap.org Git - nominatim.git/blob - lib-php/TokenList.php
lift restrictions on search with frequent terms slightly
[nominatim.git] / lib-php / TokenList.php
1 <?php
2 /**
3  * SPDX-License-Identifier: GPL-2.0-only
4  *
5  * This file is part of Nominatim. (https://nominatim.org)
6  *
7  * Copyright (C) 2022 by the Nominatim developer community.
8  * For a full list of authors see the git log.
9  */
10
11 namespace Nominatim;
12
13 require_once(CONST_LibDir.'/TokenCountry.php');
14 require_once(CONST_LibDir.'/TokenHousenumber.php');
15 require_once(CONST_LibDir.'/TokenPostcode.php');
16 require_once(CONST_LibDir.'/TokenSpecialTerm.php');
17 require_once(CONST_LibDir.'/TokenWord.php');
18 require_once(CONST_LibDir.'/TokenPartial.php');
19 require_once(CONST_LibDir.'/SpecialSearchOperator.php');
20
21 /**
22  * Saves information about the tokens that appear in a search query.
23  *
24  * Tokens are sorted by their normalized form, the token word. There are different
25  * kinds of tokens, represented by different Token* classes. Note that
26  * tokens do not have a common base class. All tokens need to have a field
27  * with the word id that points to an entry in the `word` database table
28  * but otherwise the information saved about a token can be very different.
29  */
30 class TokenList
31 {
32     // List of list of tokens indexed by their word_token.
33     private $aTokens = array();
34
35
36     /**
37      * Return total number of tokens.
38      *
39      * @return Integer
40      */
41     public function count()
42     {
43         return count($this->aTokens);
44     }
45
46     /**
47      * Check if there are tokens for the given token word.
48      *
49      * @param string $sWord Token word to look for.
50      *
51      * @return bool True if there is one or more token for the token word.
52      */
53     public function contains($sWord)
54     {
55         return isset($this->aTokens[$sWord]);
56     }
57
58     /**
59      * Check if there are partial or full tokens for the given word.
60      *
61      * @param string $sWord Token word to look for.
62      *
63      * @return bool True if there is one or more token for the token word.
64      */
65     public function containsAny($sWord)
66     {
67         return isset($this->aTokens[$sWord]);
68     }
69
70     /**
71      * Get the list of tokens for the given token word.
72      *
73      * @param string $sWord Token word to look for.
74      *
75      * @return object[] Array of tokens for the given token word or an
76      *                  empty array if no tokens could be found.
77      */
78     public function get($sWord)
79     {
80         return isset($this->aTokens[$sWord]) ? $this->aTokens[$sWord] : array();
81     }
82
83     public function getFullWordIDs()
84     {
85         $ids = array();
86
87         foreach ($this->aTokens as $aTokenList) {
88             foreach ($aTokenList as $oToken) {
89                 if (is_a($oToken, '\Nominatim\Token\Word')) {
90                     $ids[$oToken->getId()] = $oToken->getId();
91                 }
92             }
93         }
94
95         return $ids;
96     }
97
98     /**
99      * Add a new token for the given word.
100      *
101      * @param string $sWord  Word the token describes.
102      * @param object $oToken Token object to add.
103      *
104      * @return void
105      */
106     public function addToken($sWord, $oToken)
107     {
108         if (isset($this->aTokens[$sWord])) {
109             $this->aTokens[$sWord][] = $oToken;
110         } else {
111             $this->aTokens[$sWord] = array($oToken);
112         }
113     }
114
115     public function debugTokenByWordIdList()
116     {
117         $aWordsIDs = array();
118         foreach ($this->aTokens as $sToken => $aWords) {
119             foreach ($aWords as $aToken) {
120                 $iId = $aToken->getId();
121                 if ($iId !== null) {
122                     $aWordsIDs[$iId] = '#'.$sToken.'('.$aToken->debugCode().' '.$iId.')#';
123                 }
124             }
125         }
126
127         return $aWordsIDs;
128     }
129
130     public function debugInfo()
131     {
132         return $this->aTokens;
133     }
134 }