]> git.openstreetmap.org Git - nominatim.git/commitdiff
force update on rank30 children when place name changes
authorSarah Hoffmann <lonvia@denofr.de>
Mon, 27 Sep 2021 09:04:17 +0000 (11:04 +0200)
committerSarah Hoffmann <lonvia@denofr.de>
Mon, 27 Sep 2021 09:04:17 +0000 (11:04 +0200)
Name changes may have an effect on parenting. Don't update
surrounding rank30 objects with addr:place tags as this is
potentially too expensive.

lib-sql/functions/place_triggers.sql
test/bdd/db/update/parenting.feature

index 219bb6fec3b03c6729c7e9d6b66e0d73a7e51122..ca16871a89fa4d4acb41fb67d9abd61ea6a2602c 100644 (file)
@@ -271,18 +271,26 @@ BEGIN
               and x.class = p.class;
       END IF;
 
-      -- When streets change their name, the parenting of rank30 objects may change.
-      IF existingplacex.rank_address between 26 and 27
-         and coalesce(existing.name::text, '') != coalesce(NEW.name::text, '')
+      IF coalesce(existing.name::text, '') != coalesce(NEW.name::text, '')
       THEN
-        UPDATE placex SET indexed_status = 2
-        WHERE indexed_status = 0 and address ? 'street'
-              and parent_place_id = existingplacex.place_id;
-        UPDATE placex SET indexed_status = 2
-        WHERE indexed_status = 0 and rank_search = 30 and address ? 'street'
-              and ST_DWithin(NEW.geometry, geometry, 0.002);
+        IF existingplacex.rank_address between 26 and 27 THEN
+          -- When streets change their name, this may have an effect on POI objects
+          -- with addr:street tags.
+          UPDATE placex SET indexed_status = 2
+          WHERE indexed_status = 0 and address ? 'street'
+                and parent_place_id = existingplacex.place_id;
+          UPDATE placex SET indexed_status = 2
+          WHERE indexed_status = 0 and rank_search = 30 and address ? 'street'
+                and ST_DWithin(NEW.geometry, geometry, 0.002);
+        ELSEIF existingplacex.rank_address between 16 and 25 THEN
+          -- When places change their name, this may have an effect on POI objects
+          -- with addr:place tags.
+          UPDATE placex SET indexed_status = 2
+          WHERE indexed_status = 0 and address ? 'place' and rank_search = 30
+                and parent_place_id = existingplacex.place_id;
+          -- No update of surrounding objects, potentially too expensive.
+        END IF;
       END IF;
-
     END IF;
 
     -- Abort the add (we modified the existing place instead)
index fdf785c23be86d775b920882c6cb133555397402..c962fc7e3fcb085b25b34b10683c1f5849c361bd 100644 (file)
@@ -35,6 +35,57 @@ Feature: Update parenting of objects
          | N2     | W3              | 3 |
          | N3     | W3              | 3 |
 
+
+    Scenario: Housenumber is reparented when street gets name matching addr:street
+        Given the grid
+         | 1 |    |   | 2 |
+         |   | 10 |   |   |
+         |   |    |   |   |
+         | 3 |    |   | 4 |
+        And the places
+         | osm | class   | type        | name     | geometry |
+         | W1  | highway | residential | A street | 1,2      |
+         | W2  | highway | residential | B street | 3,4      |
+        And the places
+         | osm | class    | type | housenr | street   | geometry |
+         | N1  | building | yes  | 3       | X street | 10       |
+        When importing
+        Then placex contains
+         | object | parent_place_id |
+         | N1     | W1              |
+        When updating places
+         | osm | class   | type        | name     | geometry |
+         | W2  | highway | residential | X street | 3,4      |
+        Then placex contains
+         | object | parent_place_id |
+         | N1     | W2              |
+
+
+    Scenario: Housenumber is reparented when street looses name matching addr:street
+        Given the grid
+         | 1 |    |   | 2 |
+         |   | 10 |   |   |
+         |   |    |   |   |
+         | 3 |    |   | 4 |
+        And the places
+         | osm | class   | type        | name     | geometry |
+         | W1  | highway | residential | A street | 1,2      |
+         | W2  | highway | residential | X street | 3,4      |
+        And the places
+         | osm | class    | type | housenr | street   | geometry |
+         | N1  | building | yes  | 3       | X street | 10       |
+        When importing
+        Then placex contains
+         | object | parent_place_id |
+         | N1     | W2              |
+        When updating places
+         | osm | class   | type        | name     | geometry |
+         | W2  | highway | residential | B street | 3,4      |
+        Then placex contains
+         | object | parent_place_id |
+         | N1     | W1              |
+
+
     Scenario: Housenumber is reparented when street gets name matching addr:street
         Given the grid
          | 1 |    |   | 2 |
@@ -58,3 +109,57 @@ Feature: Update parenting of objects
         Then placex contains
          | object | parent_place_id |
          | N1     | W2              |
+
+
+    # Invalidation of geometries currently disabled for addr:place matches.
+    @Fail
+    Scenario: Housenumber is reparented when place is renamed to matching addr:place
+        Given the grid
+         | 1 |    |   | 2 |
+         |   | 10 | 4 |   |
+         |   |    |   |   |
+         |   |    | 5 |   |
+        And the places
+         | osm | class   | type        | name     | geometry |
+         | W1  | highway | residential | A street | 1,2      |
+         | N5  | place   | village     | Bdorf    | 5        |
+         | N4  | place   | village     | Other    | 4        |
+        And the places
+         | osm | class    | type | housenr | addr_place | geometry |
+         | N1  | building | yes  | 3       | Cdorf      | 10       |
+        When importing
+        Then placex contains
+         | object | parent_place_id |
+         | N1     | N4              |
+        When updating places
+         | osm | class   | type        | name     | geometry |
+         | N5  | place   | village     | Cdorf    | 5        |
+        Then placex contains
+         | object | parent_place_id |
+         | N1     | N5              |
+
+
+    Scenario: Housenumber is reparented when it looses a matching addr:place
+        Given the grid
+         | 1 |    |   | 2 |
+         |   | 10 | 4 |   |
+         |   |    |   |   |
+         |   |    | 5 |   |
+        And the places
+         | osm | class   | type        | name     | geometry |
+         | W1  | highway | residential | A street | 1,2      |
+         | N5  | place   | village     | Bdorf    | 5        |
+         | N4  | place   | village     | Other    | 4        |
+        And the places
+         | osm | class    | type | housenr | addr_place | geometry |
+         | N1  | building | yes  | 3       | Bdorf      | 10       |
+        When importing
+        Then placex contains
+         | object | parent_place_id |
+         | N1     | N5              |
+        When updating places
+         | osm | class   | type        | name     | geometry |
+         | N5  | place   | village     | Cdorf    | 5        |
+        Then placex contains
+         | object | parent_place_id |
+         | N1     | N4              |