From 3c68b12176c3b7f00dc4b3f5f00b3f63ba1b4c12 Mon Sep 17 00:00:00 2001 From: Sarah Hoffmann Date: Thu, 28 Apr 2022 21:38:00 +0200 Subject: [PATCH] keep inherited address parts after indexing The inherited housenumber is needed for display output. We can't take the one from the housenumber field because it is already normalized. Remove the inherited address only when reindexing. Fixes #2683. --- lib-sql/functions/placex_triggers.sql | 66 ++++++++++++--------------- test/bdd/db/import/parenting.feature | 4 ++ 2 files changed, 34 insertions(+), 36 deletions(-) diff --git a/lib-sql/functions/placex_triggers.sql b/lib-sql/functions/placex_triggers.sql index 8a65c555..f92b2113 100644 --- a/lib-sql/functions/placex_triggers.sql +++ b/lib-sql/functions/placex_triggers.sql @@ -28,35 +28,38 @@ DECLARE result prepare_update_info; extra_names HSTORE; BEGIN + IF not p.address ? '_inherited' THEN + result.address := p.address; + END IF; + -- For POI nodes, check if the address should be derived from a surrounding -- building. - IF p.rank_search < 30 OR p.osm_type != 'N' THEN - result.address := p.address; - ELSEIF p.address is null THEN - -- The additional && condition works around the misguided query - -- planner of postgis 3.0. - SELECT placex.address || hstore('_inherited', '') INTO result.address - FROM placex - WHERE ST_Covers(geometry, p.centroid) - and geometry && p.centroid - and placex.address is not null - and (placex.address ? 'housenumber' or placex.address ? 'street' or placex.address ? 'place') - and rank_search = 30 AND ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon') - LIMIT 1; - ELSE - result.address := p.address; - -- See if we can inherit addtional address tags from an interpolation. - -- These will become permanent. - FOR location IN - SELECT (address - 'interpolation'::text - 'housenumber'::text) as address - FROM place, planet_osm_ways w - WHERE place.osm_type = 'W' and place.address ? 'interpolation' - and place.geometry && p.geometry - and place.osm_id = w.id - and p.osm_id = any(w.nodes) - LOOP - result.address := location.address || result.address; - END LOOP; + IF p.rank_search = 30 AND p.osm_type = 'N' THEN + IF p.address is null THEN + -- The additional && condition works around the misguided query + -- planner of postgis 3.0. + SELECT placex.address || hstore('_inherited', '') INTO result.address + FROM placex + WHERE ST_Covers(geometry, p.centroid) + and geometry && p.centroid + and placex.address is not null + and (placex.address ? 'housenumber' or placex.address ? 'street' or placex.address ? 'place') + and rank_search = 30 AND ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon') + LIMIT 1; + ELSE + -- See if we can inherit addtional address tags from an interpolation. + -- These will become permanent. + FOR location IN + SELECT (address - 'interpolation'::text - 'housenumber'::text) as address + FROM place, planet_osm_ways w + WHERE place.osm_type = 'W' and place.address ? 'interpolation' + and place.geometry && p.geometry + and place.osm_id = w.id + and p.osm_id = any(w.nodes) + LOOP + result.address := location.address || result.address; + END LOOP; + END IF; END IF; -- remove internal and derived names @@ -984,15 +987,6 @@ BEGIN {% endif %} NEW.token_info := token_strip_info(NEW.token_info); - -- If the address was inherited from a surrounding building, - -- do not add it permanently to the table. - IF NEW.address ? '_inherited' THEN - IF NEW.address ? '_unlisted_place' THEN - NEW.address := hstore('_unlisted_place', NEW.address->'_unlisted_place'); - ELSE - NEW.address := null; - END IF; - END IF; RETURN NEW; END IF; diff --git a/test/bdd/db/import/parenting.feature b/test/bdd/db/import/parenting.feature index ef25b6cc..81a92446 100644 --- a/test/bdd/db/import/parenting.feature +++ b/test/bdd/db/import/parenting.feature @@ -376,6 +376,10 @@ Feature: Parenting of objects | N1 | W3 | 3 | | N2 | W3 | 3 | | N3 | W3 | 3 | + When sending geocodejson search query "3, foo" with address + Then results contain + | housenumber | + | 3 | Scenario: POIs don't inherit from streets Given the scene building-on-street-corner