]> git.openstreetmap.org Git - nominatim.git/commitdiff
Merge remote-tracking branch 'upstream/master'
authorSarah Hoffmann <lonvia@denofr.de>
Sun, 6 Aug 2023 19:40:18 +0000 (21:40 +0200)
committerSarah Hoffmann <lonvia@denofr.de>
Sun, 6 Aug 2023 19:40:18 +0000 (21:40 +0200)
nominatim/api/search/db_search_builder.py
nominatim/api/types.py
nominatim/api/v1/server_glue.py
nominatim/server/falcon/server.py
nominatim/server/starlette/server.py
test/python/api/fake_adaptor.py
test/python/api/search/test_db_search_builder.py

index 7c6d13f09dbd9fbeacac4b631f2a04f8be280cfa..8dd435d0b991d20571d7a59bccaefb28d70aa8a0 100644 (file)
@@ -212,13 +212,6 @@ class SearchBuilder:
 
         exp_count = min(exp_count, min(t.count for t in addr_partials)) \
                     if addr_partials else exp_count
-        if exp_count < 1000 and len(addr_tokens) > 3 and partials_indexed:
-            # Lookup by address partials and restrict results through name terms.
-            # Give this a small penalty because lookups in the address index are
-            # more expensive
-            yield penalty + exp_count/5000, exp_count,\
-                  dbf.lookup_by_addr(name_tokens, addr_tokens)
-            return
 
         # Partial term to frequent. Try looking up by rare full names first.
         name_fulls = self.query.get_tokens(name, TokenType.WORD)
index 43e83c1f689dfadda882a85aa79fe496cf0cfecf..a2a265c033e88fec87965b1643d2d42d2a0e1e37 100644 (file)
@@ -247,9 +247,10 @@ class Bbox:
         except ValueError as exc:
             raise UsageError('Bounding box parameter needs to be numbers.') from exc
 
-        if x1 < -180.0 or x1 > 180.0 or y1 < -90.0 or y1 > 90.0 \
-           or x2 < -180.0 or x2 > 180.0 or y2 < -90.0 or y2 > 90.0:
-            raise UsageError('Bounding box coordinates invalid.')
+        x1 = min(180, max(-180, x1))
+        x2 = min(180, max(-180, x2))
+        y1 = min(90, max(-90, y1))
+        y2 = min(90, max(-90, y2))
 
         if x1 == x2 or y1 == y2:
             raise UsageError('Bounding box with invalid parameters.')
index d83adaae646d51f5ca03750e545d91b6eae68db1..d1bcc1dab0d3050bd5ec2a0cad40f1fbad9f0b58 100644 (file)
@@ -69,6 +69,11 @@ class ASGIAdaptor(abc.ABC):
             body of the response to 'output'.
         """
 
+    @abc.abstractmethod
+    def base_uri(self) -> str:
+        """ Return the URI of the original request.
+        """
+
 
     @abc.abstractmethod
     def config(self) -> Configuration:
@@ -481,7 +486,7 @@ async def search_endpoint(api: napi.NominatimAPIAsync, params: ASGIAdaptor) -> A
                                    (str(r.place_id) for r in results if r.place_id))
         queryparts['format'] = fmt
 
-        moreurl = urlencode(queryparts)
+        moreurl = params.base_uri() + '/search?' + urlencode(queryparts)
     else:
         moreurl = ''
 
index 196c519f014212a6a96fe68244d32dada97256c9..e551e54256f531ddc1e101caa2ada639b09b05e4 100644 (file)
@@ -67,6 +67,9 @@ class ParamWrapper(api_impl.ASGIAdaptor):
         self.response.content_type = self.content_type
 
 
+    def base_uri(self) -> str:
+        return cast (str, self.request.forwarded_prefix)
+
     def config(self) -> Configuration:
         return self._config
 
index f89e52a151dac89cf205ce25964f4483cbd5e272..5567ac9c9b9e9986bafdfd4fdb2855c66e7e220b 100644 (file)
@@ -50,6 +50,19 @@ class ParamWrapper(api_impl.ASGIAdaptor):
         return Response(output, status_code=status, media_type=self.content_type)
 
 
+    def base_uri(self) -> str:
+        scheme = self.request.url.scheme
+        host = self.request.url.hostname
+        port = self.request.url.port
+        root = self.request.scope['root_path']
+        if (scheme == 'http' and port == 80) or (scheme == 'https' and port == 443):
+            port = None
+        if port is not None:
+            return f"{scheme}://{host}:{port}{root}"
+
+        return f"{scheme}://{host}{root}"
+
+
     def config(self) -> Configuration:
         return cast(Configuration, self.request.app.state.API.config)
 
index f04381db2ad2683bf7e8dbe41dd28752617b7051..d886d34e20f89057fdcca2b82e263c6e7e1c65fd 100644 (file)
@@ -47,6 +47,9 @@ class FakeAdaptor(glue.ASGIAdaptor):
         return FakeResponse(status, output, self.content_type)
 
 
+    def base_uri(self) -> str:
+        return 'http://test'
+
     def config(self):
         return self._config
 
index 0e5a8bfcd47d0b8ac13fa36a6290d1c383b5b858..d1ad320b137f517b2d06ee74384f70e49944d7f2 100644 (file)
@@ -68,7 +68,7 @@ def test_country_search_with_country_restriction():
     assert set(search.countries.values) == {'en'}
 
 
-def test_country_search_with_confllicting_country_restriction():
+def test_country_search_with_conflicting_country_restriction():
     q = make_query([(1, TokenType.COUNTRY, [(2, 'de'), (3, 'en')])])
     builder = SearchBuilder(q, SearchDetails.from_kwargs({'countries': 'fr'}))
 
@@ -369,20 +369,6 @@ def test_infrequent_partials_in_name():
             {('name_vector', 'lookup_all'), ('nameaddress_vector', 'restrict')}
 
 
-def test_frequent_partials_in_name_but_not_in_address():
-    searches = make_counted_searches(10000, 1, 1, 1, num_address_parts=4)
-
-    assert len(searches) == 1
-    search = searches[0]
-
-    assert isinstance(search, dbs.PlaceSearch)
-    assert len(search.lookups) == 2
-    assert len(search.rankings) == 2
-
-    assert set((l.column, l.lookup_type) for l in search.lookups) == \
-            {('nameaddress_vector', 'lookup_all'), ('name_vector', 'restrict')}
-
-
 def test_frequent_partials_in_name_and_address():
     searches = make_counted_searches(9999, 1, 9999, 1)