]> git.openstreetmap.org Git - nominatim.git/blob - lib/SearchDescription.php
move initial search setup to new class type
[nominatim.git] / lib / SearchDescription.php
1 <?php
2
3 namespace Nominatim;
4
5 /**
6  * Operators describing special searches.
7  */
8 abstract final class Operator
9 {
10     /// No operator selected.
11     const NONE = 0;
12     /// Search for POI of the given type.
13     const TYPE = 1;
14     /// Search for POIs near the given place.
15     const NEAR = 2;
16     /// Search for POIS in the given place.
17     const IN = 3;
18     /// Search for POIS named as given.
19     const NAME = 4;
20     /// Search for postcodes.
21     const POSTCODE = 5;
22 }
23
24 /**
25  * Description of a single interpretation of a search query.
26  */
27 class SearchDescription
28 {
29     /// Ranking how well the description fits the query.
30     private $iSearchRank = 0;
31     /// Country code of country the result must belong to.
32     private $sCountryCode = '';
33     /// List of word ids making up the name of the object.
34     private $aName = array();
35     /// List of word ids making up the address of the object.
36     private $aAddress = array();
37     /// Subset of word ids of full words making up the address.
38     private $aFullNameAddress = array();
39     /// List of word ids that appear in the name but should be ignored.
40     private $aNameNonSearch = array();
41     /// List of word ids that appear in the address but should be ignored.
42     private $aAddressNonSearch = array();
43     /// Kind of search for special searches, see Nominatim::Operator.
44     private $iOperator = Operator::NONE;
45     /// Class of special feature to search for.
46     private $sClass = '';
47     /// Type of special feature to search for.
48     private $sType = '';
49     /// Housenumber of the object.
50     private $sHouseNumber = '';
51     /// Postcode for the object.
52     private $sPostcode = '';
53     /// Geographic search area.
54     private $oNearPoint = false;
55
56     // Temporary values used while creating the search description.
57
58     /// Index of phrase currently processed
59     private $iNamePhrase = -1;
60
61     public getRank()
62     {
63         return $this->iSearchRank;
64     }
65
66     /**
67      * Set the geographic search radius.
68      */
69     public setNear(&$oNearPoint)
70     {
71         $this->oNearPoint = $oNearPoint;
72     }
73
74     public setPoiSearch($iOperator, $sClass, $sType)
75     {
76         $this->iOperator = $iOperator;
77         $this->sClass = $sClass;
78         $this->sType = $sType;
79     }
80
81     public hasOperator()
82     {
83         return $this->iOperator != Operator::NONE;
84     }
85
86     /**
87      * Extract special terms from the query, amend the search
88      * and return the shortended query.
89      *
90      * Only the first special term found will be used but all will
91      * be removed from the query.
92      */
93     public extractKeyValuePairs(&$oDB, $sQuery)
94     {
95         // Search for terms of kind [<key>=<value>].
96         preg_match_all(
97             '/\\[([\\w_]*)=([\\w_]*)\\]/',
98             $sQuery,
99             $aSpecialTermsRaw,
100             PREG_SET_ORDER
101         );
102
103         foreach ($aSpecialTermsRaw as $aTerm) {
104             $sQuery = str_replace($aTerm[0], ' ', $sQuery);
105             if (!$this->hasOperator()) {
106                 $this->setPoiSearch(Operator::TYPE, $aTerm[1], $aTerm[2]);
107             }
108         }
109
110         return $sQuery;
111     }
112 };