From: Sarah Hoffmann Date: Mon, 27 Sep 2021 09:04:17 +0000 (+0200) Subject: force update on rank30 children when place name changes X-Git-Tag: v4.0.0~26^2 X-Git-Url: https://git.openstreetmap.org./nominatim.git/commitdiff_plain/6d7c0674612356da9ba043dcdc88a5ba0ddc307a force update on rank30 children when place name changes Name changes may have an effect on parenting. Don't update surrounding rank30 objects with addr:place tags as this is potentially too expensive. --- diff --git a/lib-sql/functions/place_triggers.sql b/lib-sql/functions/place_triggers.sql index 219bb6fe..ca16871a 100644 --- a/lib-sql/functions/place_triggers.sql +++ b/lib-sql/functions/place_triggers.sql @@ -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) diff --git a/test/bdd/db/update/parenting.feature b/test/bdd/db/update/parenting.feature index fdf785c2..c962fc7e 100644 --- a/test/bdd/db/update/parenting.feature +++ b/test/bdd/db/update/parenting.feature @@ -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 |