From: AntoJvlt Date: Wed, 9 Jun 2021 07:24:25 +0000 (+0200) Subject: Handle postcode type change in place insert trigger X-Git-Tag: v4.0.0~64^2~2 X-Git-Url: https://git.openstreetmap.org/nominatim.git/commitdiff_plain/9e07a197e982a111d33dd190f422b5b923f4197a?ds=sidebyside Handle postcode type change in place insert trigger --- diff --git a/lib-sql/functions/place_triggers.sql b/lib-sql/functions/place_triggers.sql index c19b2274..43bae856 100644 --- a/lib-sql/functions/place_triggers.sql +++ b/lib-sql/functions/place_triggers.sql @@ -77,12 +77,6 @@ BEGIN ELSE -- insert to placex - -- 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 - RETURN NEW; - END IF; - -- Patch in additional country names IF NEW.admin_level = 2 AND NEW.type = 'administrative' AND NEW.address is not NULL AND NEW.address ? 'country' THEN @@ -98,6 +92,16 @@ 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; + -- 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 + -- Remove old placex entry if the type changed to postcode. + IF existingplacex.type IS NOT NULL AND existingplacex.type != 'postcode' THEN + DELETE FROM placex where osm_type = NEW.osm_type and osm_id = NEW.osm_id; + END IF; + 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 @@ -207,7 +211,7 @@ BEGIN where osm_type = NEW.osm_type and osm_id = NEW.osm_id and class = NEW.class and type = NEW.type; - IF NEW.class in ('place','boundary') AND NEW.type in ('postcode','postal_code') THEN + IF NEW.class = 'boundary' AND NEW.type = 'postal_code' THEN IF NEW.address is NULL OR NOT NEW.address ? 'postcode' THEN -- postcode was deleted, no longer retain in placex DELETE FROM placex where place_id = existingplacex.place_id;