]> git.openstreetmap.org Git - nominatim.git/commitdiff
save differing linked polace names in extra fields
authorSarah Hoffmann <lonvia@denofr.de>
Wed, 16 Mar 2022 15:38:52 +0000 (16:38 +0100)
committerSarah Hoffmann <lonvia@denofr.de>
Wed, 16 Mar 2022 15:38:52 +0000 (16:38 +0100)
This keeps the names tracable and ensures that all names are searchable
when they differ. Do not keep names when they are exactly the same
to save some space. Linked names are cleaned out before relinking.

lib-sql/functions/placex_triggers.sql
test/bdd/db/query/linking.feature
test/bdd/steps/steps_db_ops.py

index 1eae353e1a0332c5e2297e3bd1e53a578e1f4e95..e6f083c894aa1d3d517f4eddd96551eaec4de9dc 100644 (file)
@@ -26,6 +26,7 @@ CREATE OR REPLACE FUNCTION placex_indexing_prepare(p placex)
 DECLARE
   location RECORD;
   result prepare_update_info;
+  extra_names HSTORE;
 BEGIN
   -- For POI nodes, check if the address should be derived from a surrounding
   -- building.
@@ -58,8 +59,11 @@ BEGIN
     END LOOP;
   END IF;
 
+  -- remove internal and derived names
   result.address := result.address - '_unlisted_place'::TEXT;
-  result.name := p.name;
+  SELECT hstore(array_agg(key), array_agg(value)) INTO result.name
+    FROM each(p.name) WHERE key not like '\_%';
+
   result.class := p.class;
   result.type := p.type;
   result.country_code := p.country_code;
@@ -72,8 +76,17 @@ BEGIN
   IF location.place_id is not NULL THEN
     result.linked_place_id := location.place_id;
 
-    IF NOT location.name IS NULL THEN
-      result.name := location.name || result.name;
+    IF location.name is not NULL THEN
+      {% if debug %}RAISE WARNING 'Names original: %, location: %', result.name, location.name;{% endif %}
+      -- Add all names from the place nodes that deviate from the name
+      -- in the relation with the prefix '_place_'. Deviation means that
+      -- either the value is different or a given key is missing completely
+      SELECT hstore(array_agg('_place_' || key), array_agg(value)) INTO extra_names
+        FROM each(location.name - result.name);
+      {% if debug %}RAISE WARNING 'Extra names: %', extra_names;{% endif %}
+
+      result.name := location.name || result.name || extra_names;
+      {% if debug %}RAISE WARNING 'Final names: %', result.name;{% endif %}
     END IF;
   END IF;
 
index 4e6c47d88e77056ccf13acdc514a0334f0afd917..d11ba31f8aa168e0eb1eb565c74bb2ff76da99b3 100644 (file)
@@ -20,3 +20,23 @@ Feature: Searching linked places
         Then results contain
          | osm |
          | R13 |
+
+
+    Scenario: Differing names from linked places are searchable
+        Given the places
+         | osm  | class    | type           | admin | name  | geometry |
+         | R13  | boundary | administrative | 6     | Garbo | poly-area:0.1 |
+        Given the places
+         | osm  | class    | type           | admin | name  | geometry |
+         | N2   | place    | hamlet         | 15    | Vario | 0.006 0.00001 |
+        And the relations
+         | id | members       | tags+type |
+         | 13 | N2:label      | boundary |
+        When importing
+        Then placex contains
+         | object  | linked_place_id |
+         | N2      | R13 |
+        When sending search query "Vario"
+        Then results contain
+         | osm |
+         | R13 |
index 8df5d6170e741e4807b8ddfac541c72d6437b89e..e02cad8f4ac92c46d17ab4a4e7c74c1a3016cefc 100644 (file)
@@ -93,6 +93,7 @@ def add_data_to_planet_ways(context):
 def import_and_index_data_from_place_table(context):
     """ Import data previously set up in the place table.
     """
+    context.nominatim.run_nominatim('refresh', '--functions')
     context.nominatim.run_nominatim('import', '--continue', 'load-data',
                                               '--index-noanalyse', '-q')