]> git.openstreetmap.org Git - nominatim.git/blob - test/bdd/db/import/rank_computation.feature
improve address ordering with mixes of place and admin areas
[nominatim.git] / test / bdd / db / import / rank_computation.feature
1 @DB
2 Feature: Rank assignment
3     Tests for assignment of search and address ranks.
4
5     Scenario: Ranks for place nodes are assigned according to their type
6         Given the named places
7           | osm  | class     | type      | geometry |
8           | N1   | foo       | bar       | 0 0 |
9           | N11  | place     | Continent | 0 0 |
10           | N12  | place     | continent | 0 0 |
11           | N13  | place     | sea       | 0 0 |
12           | N14  | place     | country   | 0 0 |
13           | N15  | place     | state     | 0 0 |
14           | N16  | place     | region    | 0 0 |
15           | N17  | place     | county    | 0 0 |
16           | N18  | place     | city      | 0 0 |
17           | N19  | place     | island    | 0 0 |
18           | N36  | place     | house     | 0 0 |
19         And the named places
20           | osm  | class     | type      | extra+capital | geometry |
21           | N101 | place     | city      | yes           | 0 0 |
22         When importing
23         Then placex contains
24           | object | rank_search | rank_address |
25           | N1     | 30          | 30 |
26           | N11    | 22          | 0 |
27           | N12    | 2           | 0 |
28           | N13    | 2           | 0 |
29           | N14    | 4           | 0 |
30           | N15    | 8           | 0 |
31           | N16    | 18          | 0 |
32           | N17    | 12          | 12 |
33           | N18    | 16          | 16 |
34           | N19    | 17          | 0 |
35           | N101   | 15          | 16 |
36           | N36    | 30          | 30 |
37
38     Scenario: Ranks for boundaries are assigned according to admin level
39         Given the named places
40           | osm | class    | type           | admin | geometry |
41           | R20 | boundary | administrative | 2     | (1 1, 2 2, 1 2, 1 1) |
42           | R21 | boundary | administrative | 32    | (3 3, 4 4, 3 4, 3 3) |
43           | R22 | boundary | administrative | 6     | (0 0, 1 0, 0 1, 0 0) |
44           | R23 | boundary | administrative | 10    | (0 0, 1 1, 1 0, 0 0) |
45         When importing
46         Then placex contains
47           | object | rank_search | rank_address |
48           | R20    | 4           | 4 |
49           | R21    | 25          | 0 |
50           | R22    | 12          | 12 |
51           | R23    | 20          | 20 |
52
53     Scenario: Ranks for addressable boundaries with place assignment go with place address ranks if available
54         Given the named places
55           | osm | class    | type           | admin | extra+place | geometry |
56           | R20 | boundary | administrative | 3     | state       | (1 1, 2 2, 1 2, 1 1) |
57           | R21 | boundary | administrative | 32    | suburb      | (3 3, 4 4, 3 4, 3 3) |
58           | R22 | boundary | administrative | 6     | town        | (0 0, 1 0, 0 1, 0 0) |
59           | R23 | boundary | administrative | 10    | village     | (0 0, 1 1, 1 0, 0 0) |
60         When importing
61         Then placex contains
62           | object | rank_search | rank_address |
63           | R20    | 6           | 6  |
64           | R21    | 25          | 0  |
65           | R22    | 12          | 16 |
66           | R23    | 20          | 16 |
67
68     Scenario: Place address ranks cannot overtake a parent address rank
69         Given the named places
70           | osm | class    | type           | admin | extra+place  | geometry |
71           | R20 | boundary | administrative | 8     | town         | (0 0, 0 2, 2 2, 2 0, 0 0) |
72           | R21 | boundary | administrative | 9     | municipality | (0 0, 0 1, 1 1, 1 0, 0 0) |
73           | R22 | boundary | administrative | 9     | suburb       | (0 0, 0 1, 1 1, 1 0, 0 0) |
74         When importing
75         Then placex contains
76           | object | rank_search | rank_address |
77           | R20    | 16          | 16 |
78           | R21    | 18          | 18 |
79           | R22    | 18          | 20 |
80         Then place_addressline contains
81             | object | address | cached_rank_address |
82             | R21    | R20     | 16                  |
83             | R22    | R20     | 16                  |
84
85     Scenario: Admin levels cannot overtake each other due to place address ranks
86         Given the named places
87           | osm | class    | type           | admin | extra+place  | geometry |
88           | R20 | boundary | administrative | 6     | town         | (0 0, 0 2, 2 2, 2 0, 0 0) |
89           | R21 | boundary | administrative | 8     |              | (0 0, 0 1, 1 1, 1 0, 0 0) |
90           | R22 | boundary | administrative | 8     | suburb       | (0 0, 0 1, 1 1, 1 0, 0 0) |
91         When importing
92         Then placex contains
93           | object | rank_search | rank_address |
94           | R20    | 12          | 16 |
95           | R21    | 16          | 18 |
96           | R22    | 16          | 20 |
97         Then place_addressline contains
98             | object | address | cached_rank_address |
99             | R21    | R20     | 16                  |
100             | R22    | R20     | 16                  |
101
102     Scenario: Admin levels cannot overtake each other due to place address ranks even when slightly misaligned
103         Given the named places
104           | osm | class    | type           | admin | extra+place  | geometry |
105           | R20 | boundary | administrative | 6     | town         | (0 0, 0 2, 2 2, 2 0, 0 0) |
106           | R21 | boundary | administrative | 8     |              | (0 0, -0.0001 1, 1 1, 1 0, 0 0) |
107         When importing
108         Then placex contains
109           | object | rank_search | rank_address |
110           | R20    | 12          | 16 |
111           | R21    | 16          | 18 |
112         Then place_addressline contains
113             | object | address | cached_rank_address |
114             | R21    | R20     | 16                  |
115
116     Scenario: Admin levels must not be larger than 25
117         Given the named places
118           | osm | class    | type           | admin | extra+place   | geometry |
119           | R20 | boundary | administrative | 6     | neighbourhood | (0 0, 0 2, 2 2, 2 0, 0 0) |
120           | R21 | boundary | administrative | 7     |               | (0 0, 0 1, 1 1, 1 0, 0 0) |
121           | R22 | boundary | administrative | 8     |               | (0 0, 0 0.5, 0.5 0.5, 0.5 0, 0 0) |
122         When importing
123         Then placex contains
124           | object | rank_search | rank_address |
125           | R20    | 12          | 22 |
126           | R21    | 14          | 24 |
127           | R22    | 16          | 25 |
128
129     Scenario: admin levels contained in a place area must not overtake address ranks
130         Given the named places
131             | osm | class    | type           | admin | geometry |
132             | R10 | place    | city           | 15    | (0 0, 0 2, 2 0, 0 0) |
133             | R20 | boundary | administrative | 6     | (0 0, 0 1, 1 0, 0 0) |
134         When importing
135         Then placex contains
136             | object | rank_search | rank_address |
137             | R10    | 16          | 16           |
138             | R20    | 12          | 18           |
139
140     Scenario: admin levels overlapping a place area are not demoted
141         Given the named places
142             | osm | class    | type           | admin | geometry |
143             | R10 | place    | city           | 15    | (0 0, 0 2, 2 0, 0 0) |
144             | R20 | boundary | administrative | 6     | (-1 0, 0 1, 1 0, -1 0) |
145         When importing
146         Then placex contains
147             | object | rank_search | rank_address |
148             | R10    | 16          | 16           |
149             | R20    | 12          | 12           |
150
151     Scenario: admin levels with equal area as a place area are not demoted
152         Given the named places
153             | osm | class    | type           | admin | geometry |
154             | R10 | place    | city           | 15    | (0 0, 0 2, 2 0, 0 0) |
155             | R20 | boundary | administrative | 6     | (0 0, 0 2, 2 0, 0 0) |
156         When importing
157         Then placex contains
158             | object | rank_search | rank_address |
159             | R10    | 16          | 16           |
160             | R20    | 12          | 12           |
161
162
163     Scenario: adjacent admin_levels are considered the same object when they have the same wikidata
164         Given the named places
165           | osm | class    | type           | admin | extra+wikidata | geometry |
166           | N20 | place    | square         | 15    | Q123           | 0.1 0.1  |
167           | R23 | boundary | administrative | 10    | Q444           | (0 0, 0 1, 1 1, 1 0, 0 0) |
168           | R21 | boundary | administrative | 9     | Q444           | (0 0, 0 1, 1 1, 1 0, 0 0) |
169           | R22 | boundary | administrative | 8     | Q444           | (0 0, 0 1, 1 1, 1 0, 0 0) |
170         When importing
171         Then placex contains
172           | object | rank_search | rank_address |
173           | R23    | 20          | 0  |
174           | R21    | 18          | 0  |
175           | R22    | 16          | 16 |
176         Then place_addressline contains
177             | object | address | cached_rank_address |
178             | N20    | R22     | 16                  |
179         Then place_addressline doesn't contain
180             | object | address |
181             | N20    | R21     |
182             | N20    | R23     |
183
184     Scenario: adjacent admin_levels are considered different objects when they have different wikidata
185         Given the named places
186           | osm | class    | type           | admin | extra+wikidata | geometry |
187           | N20 | place    | square         | 15    | Q123           | 0.1 0.1  |
188           | R21 | boundary | administrative | 9     | Q4441          | (0 0, 0 1, 1 1, 1 0, 0 0) |
189           | R22 | boundary | administrative | 8     | Q444           | (0 0, 0 1, 1 1, 1 0, 0 0) |
190         When importing
191         Then placex contains
192           | object | rank_search | rank_address |
193           | R21    | 18          | 18 |
194           | R22    | 16          | 16 |
195         Then place_addressline contains
196             | object | address | cached_rank_address |
197             | N20    | R22     | 16                  |
198             | N20    | R21     | 18                  |
199
200     Scenario: Mixes of admin boundaries and place areas I
201         Given the grid
202           | 1 |   | 10 |  |  | 2 |
203           |   | 9 |    |  |  |   |
204           | 20|   | 21 |  |  |   |
205           | 4 |   | 11 |  |  | 3 |
206         And the places
207           | osm | class    | type           | admin | name           | geometry      |
208           | R1  | boundary | administrative | 5     | Greater London | (1,2,3,4,1)   |
209           | R2  | boundary | administrative | 8     | Kensington     | (1,10,11,4,1) |
210         And the places
211           | osm | class    | type           | name           | geometry    |
212           | R10 | place    | city           | London         | (1,2,3,4,1) |
213           | N9  | place    | town           | Fulham         | 9           |
214           | W1  | highway  | residential    | Lots Grove     | 20,21       |
215         When importing
216         Then placex contains
217          | object | rank_search | rank_address |
218          | R1     | 10          | 10           |
219          | R10    | 16          | 16           |
220          | R2     | 16          | 18           |
221          | N9     | 18          | 18           |
222         And place_addressline contains
223          | object | address | isaddress | cached_rank_address |
224          | W1     | R1      | True      | 10                  |
225          | W1     | R10     | True      | 16                  |
226          | W1     | R2      | True      | 18                  |
227          | W1     | N9      | False     | 18                  |
228
229
230     Scenario: Mixes of admin boundaries and place areas II
231         Given the grid
232           | 1 |   | 10 |  | 5 | 2 |
233           |   | 9 |    |  |   |   |
234           | 20|   | 21 |  |   |   |
235           | 4 |   | 11 |  | 6 | 3 |
236         And the places
237           | osm | class    | type           | admin | name           | geometry    |
238           | R1  | boundary | administrative | 5     | Greater London | (1,2,3,4,1) |
239           | R2  | boundary | administrative | 8     | London         | (1,5,6,4,1) |
240         And the places
241           | osm | class    | type           | name           | geometry      |
242           | R10 | place    | city           | Westminster    | (1,10,11,4,1) |
243           | N9  | place    | town           | Fulham         | 9             |
244           | W1  | highway  | residential    | Lots Grove     | 20,21         |
245         When importing
246         Then placex contains
247          | object | rank_search | rank_address |
248          | R1     | 10          | 10           |
249          | R2     | 16          | 16           |
250          | R10    | 16          | 18           |
251          | N9     | 18          | 18           |
252         And place_addressline contains
253          | object | address | isaddress | cached_rank_address |
254          | W1     | R1      | True      | 10                  |
255          | W1     | R10     | True      | 18                  |
256          | W1     | R2      | True      | 16                  |
257          | W1     | N9      | False     | 18                  |