X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/2fac507453ca5d50ecc8ccd4f8d66aa0b8954c18..7717bbf59d711d21818c89309dbe08e00b16250f:/lib-sql/functions/place_triggers.sql?ds=sidebyside diff --git a/lib-sql/functions/place_triggers.sql b/lib-sql/functions/place_triggers.sql index 5b2642e7..5b4a8441 100644 --- a/lib-sql/functions/place_triggers.sql +++ b/lib-sql/functions/place_triggers.sql @@ -37,7 +37,7 @@ BEGIN -- Remove the place from the list of places to be deleted DELETE FROM place_to_be_deleted pdel WHERE pdel.osm_type = NEW.osm_type and pdel.osm_id = NEW.osm_id - and pdel.class = NEW.class; + and pdel.class = NEW.class and pdel.type = NEW.type; -- Have we already done this place? SELECT * INTO existing @@ -47,8 +47,6 @@ BEGIN {% if debug %}RAISE WARNING 'Existing: %',existing.osm_id;{% endif %} - -- Handle a place changing type by removing the old data. - -- (This trigger is executed BEFORE INSERT of the NEW tuple.) 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; @@ -192,15 +190,11 @@ BEGIN END IF; {% endif %} - IF existing.osm_type IS NOT NULL THEN - -- Pathological case caused by the triggerless copy into place during initial import - -- force delete even for large areas, it will be reinserted later - UPDATE place SET geometry = ST_SetSRID(ST_Point(0,0), 4326) - WHERE osm_type = NEW.osm_type and osm_id = NEW.osm_id - and class = NEW.class and type = NEW.type; - DELETE FROM place - WHERE osm_type = NEW.osm_type and osm_id = NEW.osm_id - and class = NEW.class and type = NEW.type; + IF existingplacex.osm_type is not NULL THEN + -- Mark any existing place for delete in the placex table + UPDATE placex SET indexed_status = 100 + WHERE placex.osm_type = NEW.osm_type and placex.osm_id = NEW.osm_id + and placex.class = NEW.class and placex.type = NEW.type; END IF; -- Process it as a new insertion @@ -211,6 +205,27 @@ BEGIN {% if debug %}RAISE WARNING 'insert done % % % % %',NEW.osm_type,NEW.osm_id,NEW.class,NEW.type,NEW.name;{% endif %} + IF existing.osm_type is not NULL THEN + -- If there is already an entry in place, just update that, if necessary. + IF coalesce(existing.name, ''::hstore) != coalesce(NEW.name, ''::hstore) + or coalesce(existing.address, ''::hstore) != coalesce(NEW.address, ''::hstore) + or coalesce(existing.extratags, ''::hstore) != coalesce(NEW.extratags, ''::hstore) + or coalesce(existing.admin_level, 15) != coalesce(NEW.admin_level, 15) + or existing.geometry::text != NEW.geometry::text + THEN + UPDATE place + SET name = NEW.name, + address = NEW.address, + extratags = NEW.extratags, + admin_level = NEW.admin_level, + geometry = NEW.geometry + WHERE osm_type = NEW.osm_type and osm_id = NEW.osm_id + and class = NEW.class and type = NEW.type; + END IF; + + RETURN NULL; + END IF; + RETURN NEW; END IF; @@ -281,7 +296,9 @@ BEGIN extratags = NEW.extratags, admin_level = NEW.admin_level, indexed_status = 2, - geometry = NEW.geometry + geometry = CASE WHEN existingplacex.rank_address = 0 + THEN simplify_large_polygons(NEW.geometry) + ELSE NEW.geometry END WHERE place_id = existingplacex.place_id; -- Invalidate linked places: they potentially get a new name and addresses. @@ -348,45 +365,3 @@ BEGIN RETURN NULL; END; $$ LANGUAGE plpgsql; - -CREATE OR REPLACE FUNCTION flush_deleted_places() - RETURNS INTEGER - AS $$ -BEGIN - -- deleting large polygons can have a massive effect on the system - require manual intervention to let them through - INSERT INTO import_polygon_delete (osm_type, osm_id, class, type) - SELECT osm_type, osm_id, class, type FROM place_to_be_deleted WHERE deferred; - - -- delete from place table - ALTER TABLE place DISABLE TRIGGER place_before_delete; - DELETE FROM place USING place_to_be_deleted - WHERE place.osm_type = place_to_be_deleted.osm_type - and place.osm_id = place_to_be_deleted.osm_id - and place.class = place_to_be_deleted.class - and place.type = place_to_be_deleted.type - and not deferred; - ALTER TABLE place ENABLE TRIGGER place_before_delete; - - -- Mark for delete in the placex table - UPDATE placex SET indexed_status = 100 FROM place_to_be_deleted - WHERE placex.osm_type = place_to_be_deleted.osm_type - and placex.osm_id = place_to_be_deleted.osm_id - and placex.class = place_to_be_deleted.class - and placex.type = place_to_be_deleted.type - and not deferred; - - -- Mark for delete in interpolations - UPDATE location_property_osmline SET indexed_status = 100 FROM place_to_be_deleted - WHERE place_to_be_deleted.osm_type = 'W' - and place_to_be_deleted.class = 'place' - and place_to_be_deleted.type = 'houses' - and location_property_osmline.osm_id = place_to_be_deleted.osm_id - and not deferred; - - -- Clear todo list. - TRUNCATE TABLE place_to_be_deleted; - - RETURN NULL; -END; -$$ LANGUAGE plpgsql; -