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.
This commit is contained in:
Sarah Hoffmann
2022-04-28 21:38:00 +02:00
parent de828b723e
commit 3c68b12176
2 changed files with 34 additions and 36 deletions

View File

@@ -28,35 +28,38 @@ DECLARE
result prepare_update_info; result prepare_update_info;
extra_names HSTORE; extra_names HSTORE;
BEGIN 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 -- For POI nodes, check if the address should be derived from a surrounding
-- building. -- building.
IF p.rank_search < 30 OR p.osm_type != 'N' THEN IF p.rank_search = 30 AND p.osm_type = 'N' THEN
result.address := p.address; IF p.address is null THEN
ELSEIF p.address is null THEN -- The additional && condition works around the misguided query
-- The additional && condition works around the misguided query -- planner of postgis 3.0.
-- planner of postgis 3.0. SELECT placex.address || hstore('_inherited', '') INTO result.address
SELECT placex.address || hstore('_inherited', '') INTO result.address FROM placex
FROM placex WHERE ST_Covers(geometry, p.centroid)
WHERE ST_Covers(geometry, p.centroid) and geometry && p.centroid
and geometry && p.centroid and placex.address is not null
and placex.address is not null and (placex.address ? 'housenumber' or placex.address ? 'street' or placex.address ? 'place')
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')
and rank_search = 30 AND ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon') LIMIT 1;
LIMIT 1; ELSE
ELSE -- See if we can inherit addtional address tags from an interpolation.
result.address := p.address; -- These will become permanent.
-- See if we can inherit addtional address tags from an interpolation. FOR location IN
-- These will become permanent. SELECT (address - 'interpolation'::text - 'housenumber'::text) as address
FOR location IN FROM place, planet_osm_ways w
SELECT (address - 'interpolation'::text - 'housenumber'::text) as address WHERE place.osm_type = 'W' and place.address ? 'interpolation'
FROM place, planet_osm_ways w and place.geometry && p.geometry
WHERE place.osm_type = 'W' and place.address ? 'interpolation' and place.osm_id = w.id
and place.geometry && p.geometry and p.osm_id = any(w.nodes)
and place.osm_id = w.id LOOP
and p.osm_id = any(w.nodes) result.address := location.address || result.address;
LOOP END LOOP;
result.address := location.address || result.address; END IF;
END LOOP;
END IF; END IF;
-- remove internal and derived names -- remove internal and derived names
@@ -984,15 +987,6 @@ BEGIN
{% endif %} {% endif %}
NEW.token_info := token_strip_info(NEW.token_info); 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; RETURN NEW;
END IF; END IF;

View File

@@ -376,6 +376,10 @@ Feature: Parenting of objects
| N1 | W3 | 3 | | N1 | W3 | 3 |
| N2 | W3 | 3 | | N2 | W3 | 3 |
| N3 | 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 Scenario: POIs don't inherit from streets
Given the scene building-on-street-corner Given the scene building-on-street-corner