X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/5567bda5f0724d4af8ff050bf46372e1c694ae45..c4f22a42eba499ed1854c5967b2e3932fe9b3896:/lib-sql/functions/place_triggers.sql diff --git a/lib-sql/functions/place_triggers.sql b/lib-sql/functions/place_triggers.sql index 15389215..08331f32 100644 --- a/lib-sql/functions/place_triggers.sql +++ b/lib-sql/functions/place_triggers.sql @@ -1,3 +1,10 @@ +-- SPDX-License-Identifier: GPL-2.0-only +-- +-- This file is part of Nominatim. (https://nominatim.org) +-- +-- Copyright (C) 2022 by the Nominatim developer community. +-- For a full list of authors see the git log. + CREATE OR REPLACE FUNCTION place_insert() RETURNS TRIGGER AS $$ @@ -92,6 +99,13 @@ BEGIN -- Get the existing place_id select * from placex where osm_type = NEW.osm_type and osm_id = NEW.osm_id and class = NEW.class and type = NEW.type INTO existingplacex; + -- Handle a place changing type by removing the old data + -- My generated 'place' types are causing havok because they overlap with real keys + -- TODO: move them to their own special purpose key/class to avoid collisions + IF existing.osm_type IS NULL THEN + DELETE FROM place where osm_type = NEW.osm_type and osm_id = NEW.osm_id and class = NEW.class; + END IF; + -- Pure postcodes are never queried from placex so we don't add them. -- location_postcodes is filled from the place table directly. IF NEW.class = 'place' AND NEW.type = 'postcode' THEN @@ -113,13 +127,6 @@ BEGIN RETURN NEW; END IF; - -- Handle a place changing type by removing the old data - -- My generated 'place' types are causing havok because they overlap with real keys - -- TODO: move them to their own special purpose key/class to avoid collisions - IF existing.osm_type IS NULL THEN - DELETE FROM place where osm_type = NEW.osm_type and osm_id = NEW.osm_id and class = NEW.class; - END IF; - {% if debug %}RAISE WARNING 'Existing: %',existing.osm_id;{% endif %} {% if debug %}RAISE WARNING 'Existing PlaceX: %',existingplacex.place_id;{% endif %} @@ -247,6 +254,7 @@ BEGIN indexed_status = 2, geometry = NEW.geometry where place_id = existingplacex.place_id; + -- if a node(=>house), which is part of a interpolation line, changes (e.g. the street attribute) => mark this line for reparenting -- (already here, because interpolation lines are reindexed before nodes, so in the second call it would be too late) IF NEW.osm_type='N' @@ -270,6 +278,26 @@ BEGIN and x.class = p.class; END IF; + IF coalesce(existing.name::text, '') != coalesce(NEW.name::text, '') + THEN + 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)