]> git.openstreetmap.org Git - nominatim.git/commitdiff
Handle postcode type change in place insert trigger
authorAntoJvlt <antonin.jolivat@gmail.com>
Wed, 9 Jun 2021 07:24:25 +0000 (09:24 +0200)
committerroot <root@gsoc2021-qa.nominatim.org>
Wed, 9 Jun 2021 07:31:32 +0000 (09:31 +0200)
lib-sql/functions/place_triggers.sql

index c19b22747f5fc6882b03a33a4f40fbe89469e56e..43bae85631b1cbffc5d003a9fecd7d354f7a6c14 100644 (file)
@@ -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;