2
2
#
3
3
# This file is part of Nominatim. (https://nominatim.org)
4
4
#
5
- # Copyright (C) 2024 by the Nominatim developer community.
5
+ # Copyright (C) 2025 by the Nominatim developer community.
6
6
# For a full list of authors see the git log.
7
7
"""
8
8
Conversion from token assignment to an abstract DB search.
@@ -146,7 +146,7 @@ def build_special_search(self, sdata: dbf.SearchData,
146
146
if address :
147
147
sdata .lookups = [dbf .FieldLookup ('nameaddress_vector' ,
148
148
[t .token for r in address
149
- for t in self .query .get_partials_list (r )],
149
+ for t in self .query .iter_partials (r )],
150
150
lookups .Restrict )]
151
151
yield dbs .PostcodeSearch (penalty , sdata )
152
152
@@ -159,7 +159,7 @@ def build_housenumber_search(self, sdata: dbf.SearchData, hnrs: List[qmod.Token]
159
159
expected_count = sum (t .count for t in hnrs )
160
160
161
161
partials = {t .token : t .addr_count for trange in address
162
- for t in self .query .get_partials_list (trange )}
162
+ for t in self .query .iter_partials (trange )}
163
163
164
164
if not partials :
165
165
# can happen when none of the partials is indexed
@@ -203,9 +203,9 @@ def yield_lookups(self, name: qmod.TokenRange, address: List[qmod.TokenRange]
203
203
are and tries to find a lookup that optimizes index use.
204
204
"""
205
205
penalty = 0.0 # extra penalty
206
- name_partials = {t .token : t for t in self .query .get_partials_list (name )}
206
+ name_partials = {t .token : t for t in self .query .iter_partials (name )}
207
207
208
- addr_partials = [t for r in address for t in self .query .get_partials_list (r )]
208
+ addr_partials = [t for r in address for t in self .query .iter_partials (r )]
209
209
addr_tokens = list ({t .token for t in addr_partials })
210
210
211
211
exp_count = min (t .count for t in name_partials .values ()) / (3 ** (len (name_partials ) - 1 ))
@@ -282,8 +282,7 @@ def get_name_ranking(self, trange: qmod.TokenRange,
282
282
ranks = [dbf .RankedTokens (t .penalty , [t .token ]) for t in name_fulls ]
283
283
ranks .sort (key = lambda r : r .penalty )
284
284
# Fallback, sum of penalty for partials
285
- name_partials = self .query .get_partials_list (trange )
286
- default = sum (t .penalty for t in name_partials ) + 0.2
285
+ default = sum (t .penalty for t in self .query .iter_partials (trange )) + 0.2
287
286
return dbf .FieldRanking (db_field , default , ranks )
288
287
289
288
def get_addr_ranking (self , trange : qmod .TokenRange ) -> dbf .FieldRanking :
@@ -296,35 +295,35 @@ def get_addr_ranking(self, trange: qmod.TokenRange) -> dbf.FieldRanking:
296
295
297
296
while todo :
298
297
neglen , pos , rank = heapq .heappop (todo )
298
+ # partial node
299
+ partial = self .query .nodes [pos ].partial
300
+ if partial is not None :
301
+ if pos + 1 < trange .end :
302
+ penalty = rank .penalty + partial .penalty \
303
+ + PENALTY_WORDCHANGE [self .query .nodes [pos + 1 ].btype ]
304
+ heapq .heappush (todo , (neglen - 1 , pos + 1 ,
305
+ dbf .RankedTokens (penalty , rank .tokens )))
306
+ else :
307
+ ranks .append (dbf .RankedTokens (rank .penalty + partial .penalty ,
308
+ rank .tokens ))
309
+ # full words
299
310
for tlist in self .query .nodes [pos ].starting :
300
- if tlist .ttype in ( qmod .TOKEN_PARTIAL , qmod . TOKEN_WORD ) :
311
+ if tlist .ttype == qmod .TOKEN_WORD :
301
312
if tlist .end < trange .end :
302
313
chgpenalty = PENALTY_WORDCHANGE [self .query .nodes [tlist .end ].btype ]
303
- if tlist .ttype == qmod .TOKEN_PARTIAL :
304
- penalty = rank .penalty + chgpenalty \
305
- + max (t .penalty for t in tlist .tokens )
314
+ for t in tlist .tokens :
306
315
heapq .heappush (todo , (neglen - 1 , tlist .end ,
307
- dbf .RankedTokens (penalty , rank .tokens )))
308
- else :
309
- for t in tlist .tokens :
310
- heapq .heappush (todo , (neglen - 1 , tlist .end ,
311
- rank .with_token (t , chgpenalty )))
316
+ rank .with_token (t , chgpenalty )))
312
317
elif tlist .end == trange .end :
313
- if tlist .ttype == qmod .TOKEN_PARTIAL :
314
- ranks .append (dbf .RankedTokens (rank .penalty
315
- + max (t .penalty for t in tlist .tokens ),
316
- rank .tokens ))
317
- else :
318
- ranks .extend (rank .with_token (t , 0.0 ) for t in tlist .tokens )
319
- if len (ranks ) >= 10 :
320
- # Too many variants, bail out and only add
321
- # Worst-case Fallback: sum of penalty of partials
322
- name_partials = self .query .get_partials_list (trange )
323
- default = sum (t .penalty for t in name_partials ) + 0.2
324
- ranks .append (dbf .RankedTokens (rank .penalty + default , []))
325
- # Bail out of outer loop
326
- todo .clear ()
327
- break
318
+ ranks .extend (rank .with_token (t , 0.0 ) for t in tlist .tokens )
319
+
320
+ if len (ranks ) >= 10 :
321
+ # Too many variants, bail out and only add
322
+ # Worst-case Fallback: sum of penalty of partials
323
+ default = sum (t .penalty for t in self .query .iter_partials (trange )) + 0.2
324
+ ranks .append (dbf .RankedTokens (rank .penalty + default , []))
325
+ # Bail out of outer loop
326
+ break
328
327
329
328
ranks .sort (key = lambda r : len (r .tokens ))
330
329
default = ranks [0 ].penalty + 0.3
0 commit comments