X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/d574ceb59821058267d065862ad941240d0925d3..56201feb28d8393f26d683e65a42b4daaea8f895:/lib-sql/functions/placex_triggers.sql diff --git a/lib-sql/functions/placex_triggers.sql b/lib-sql/functions/placex_triggers.sql index 99d2872f..99eebe12 100644 --- a/lib-sql/functions/placex_triggers.sql +++ b/lib-sql/functions/placex_triggers.sql @@ -2,7 +2,7 @@ -- -- This file is part of Nominatim. (https://nominatim.org) -- --- Copyright (C) 2022 by the Nominatim developer community. +-- Copyright (C) 2024 by the Nominatim developer community. -- For a full list of authors see the git log. -- Trigger functions for the placex table. @@ -88,12 +88,18 @@ BEGIN -- 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 %} + IF result.name is null THEN + SELECT hstore(array_agg('_place_' || key), array_agg(value)) + INTO result.name + FROM each(location.name); + ELSE + 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 %} - IF extra_names is not null THEN - result.name := result.name || extra_names; + IF extra_names is not null THEN + result.name := result.name || extra_names; + END IF; END IF; {% if debug %}RAISE WARNING 'Final names: %', result.name;{% endif %} @@ -672,6 +678,12 @@ BEGIN NEW.country_code := NULL; END IF; + -- Simplify polygons with a very large memory footprint when they + -- do not take part in address computation. + IF NEW.rank_address = 0 THEN + NEW.geometry := simplify_large_polygons(NEW.geometry); + END IF; + END IF; {% if debug %}RAISE WARNING 'placex_insert:END: % % % %',NEW.osm_type,NEW.osm_id,NEW.class,NEW.type;{% endif %} @@ -788,6 +800,9 @@ BEGIN result := deleteLocationArea(NEW.partition, NEW.place_id, NEW.rank_search); NEW.extratags := NEW.extratags - 'linked_place'::TEXT; + IF NEW.extratags = ''::hstore THEN + NEW.extratags := NULL; + END IF; -- NEW.linked_place_id contains the precomputed linkee. Save this and restore -- the previous link status. @@ -996,7 +1011,7 @@ BEGIN {% if debug %}RAISE WARNING 'finding street for % %', NEW.osm_type, NEW.osm_id;{% endif %} NEW.parent_place_id := null; - is_place_address := coalesce(not NEW.address ? 'street' and NEW.address ? 'place', FALSE); + is_place_address := not token_is_street_address(NEW.token_info); -- We have to find our parent road. NEW.parent_place_id := find_parent_for_poi(NEW.osm_type, NEW.osm_id, @@ -1013,7 +1028,7 @@ BEGIN SELECT p.country_code, p.postcode, p.name FROM placex p WHERE p.place_id = NEW.parent_place_id INTO location; - IF is_place_address THEN + IF is_place_address and NEW.address ? 'place' THEN -- Check if the addr:place tag is part of the parent name SELECT count(*) INTO i FROM svals(location.name) AS pname WHERE pname = NEW.address->'place'; @@ -1235,7 +1250,9 @@ BEGIN OR ST_GeometryType(NEW.geometry) not in ('ST_LineString','ST_MultiLineString') OR ST_Length(NEW.geometry) < 0.02) THEN - NEW.postcode := get_nearest_postcode(NEW.country_code, NEW.geometry); + NEW.postcode := get_nearest_postcode(NEW.country_code, + CASE WHEN NEW.rank_address > 25 + THEN NEW.centroid ELSE NEW.geometry END); END IF; {% if debug %}RAISE WARNING 'place update % % finished.', NEW.osm_type, NEW.osm_id;{% endif %}