Skip to content

Commit bfc7acb

Browse files
authored
Merge pull request #3301 from lonvia/fix-class-search-regression
Interpret stand-alone special terms always as near term
2 parents b969c5a + e0ca2ce commit bfc7acb

File tree

3 files changed

+26
-1
lines changed

3 files changed

+26
-1
lines changed

nominatim/api/search/icu_tokenizer.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,10 @@ async def analyze_query(self, phrases: List[qmod.Phrase]) -> qmod.QueryStruct:
186186
if trange.start == 0:
187187
query.add_token(trange, qmod.TokenType.NEAR_ITEM, token)
188188
else:
189-
query.add_token(trange, qmod.TokenType.QUALIFIER, token)
189+
if trange.start == 0 and trange.end == query.num_token_slots():
190+
query.add_token(trange, qmod.TokenType.NEAR_ITEM, token)
191+
else:
192+
query.add_token(trange, qmod.TokenType.QUALIFIER, token)
190193
else:
191194
query.add_token(trange, DB_TO_TOKEN_TYPE[row.type], token)
192195

test/bdd/api/search/queries.feature

+9
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,15 @@ Feature: Search queries
136136
| class | type |
137137
| leisure | firepit |
138138

139+
140+
Scenario: POI search in a bounded viewbox
141+
When sending json search query "restaurants"
142+
| viewbox | bounded |
143+
| 9.50830,47.15253,9.52043,47.14866 | 1 |
144+
Then results contain
145+
| class | type |
146+
| amenity | restaurant |
147+
139148
Scenario Outline: Key/value search near given coordinate can be restricted to country
140149
When sending json search query "[natural=peak] 47.06512,9.53965" with address
141150
| countrycodes |

test/python/api/search/test_icu_query_analyzer.py

+13
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,19 @@ async def test_category_words_only_at_beginning(conn):
138138
assert not query.nodes[2].starting
139139

140140

141+
@pytest.mark.asyncio
142+
async def test_freestanding_qualifier_words_become_category(conn):
143+
ana = await tok.create_query_analyzer(conn)
144+
145+
await add_word(conn, 1, 'foo', 'S', 'FOO', {'op': '-'})
146+
147+
query = await ana.analyze_query(make_phrase('foo'))
148+
149+
assert query.num_token_slots() == 1
150+
assert len(query.nodes[0].starting) == 1
151+
assert query.nodes[0].starting[0].ttype == TokenType.NEAR_ITEM
152+
153+
141154
@pytest.mark.asyncio
142155
async def test_qualifier_words(conn):
143156
ana = await tok.create_query_analyzer(conn)

0 commit comments

Comments
 (0)