X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/c42273a4db2d7b4fe05a0be9210901d35e038887..964bc7fbe01bbd9c102d1c553b8f87cce3ab7a2c:/nominatim/api/search/db_search_builder.py diff --git a/nominatim/api/search/db_search_builder.py b/nominatim/api/search/db_search_builder.py index c0c55a18..9d89736c 100644 --- a/nominatim/api/search/db_search_builder.py +++ b/nominatim/api/search/db_search_builder.py @@ -17,6 +17,36 @@ import nominatim.api.search.db_search_fields as dbf import nominatim.api.search.db_searches as dbs from nominatim.api.logging import log + +def wrap_near_search(categories: List[Tuple[str, str]], + search: dbs.AbstractSearch) -> dbs.NearSearch: + """ Create a new search that wraps the given search in a search + for near places of the given category. + """ + return dbs.NearSearch(penalty=search.penalty, + categories=dbf.WeightedCategories(categories, + [0.0] * len(categories)), + search=search) + + +def build_poi_search(category: List[Tuple[str, str]], + countries: Optional[List[str]]) -> dbs.PoiSearch: + """ Create a new search for places by the given category, possibly + constraint to the given countries. + """ + if countries: + ccs = dbf.WeightedStrings(countries, [0.0] * len(countries)) + else: + ccs = dbf.WeightedStrings([], []) + + class _PoiData(dbf.SearchData): + penalty = 0.0 + qualifiers = dbf.WeightedCategories(category, [0.0] * len(category)) + countries=ccs + + return dbs.PoiSearch(_PoiData()) + + class SearchBuilder: """ Build the abstract search queries from token assignments. """ @@ -121,8 +151,10 @@ class SearchBuilder: """ Build abstract search queries for simple name or address searches. """ if is_category or not sdata.housenumbers or self.configured_for_housenumbers: - sdata.rankings.append(self.get_name_ranking(name)) - name_penalty = sdata.rankings[-1].normalize_penalty() + ranking = self.get_name_ranking(name) + name_penalty = ranking.normalize_penalty() + if ranking.rankings: + sdata.rankings.append(ranking) for penalty, count, lookup in self.yield_lookups(name, address): sdata.lookups = lookup yield dbs.PlaceSearch(penalty + name_penalty, sdata, count)