]> git.openstreetmap.org Git - nominatim.git/blobdiff - sql/functions/placex_triggers.sql
remove linking via admin_centre role
[nominatim.git] / sql / functions / placex_triggers.sql
index 779301c56cc87f2fafe762d5dd3a281385745f68..0fd0c3bce4aabfd6256dfdb59b1e7c67ad2bdb4d 100644 (file)
@@ -220,40 +220,14 @@ BEGIN
     END LOOP;
   END IF;
 
     END LOOP;
   END IF;
 
-  -- Search for relation members with role admin_center.
-  IF bnd.osm_type = 'R' and bnd_name is not null
-     and relation_members is not null
-  THEN
-    FOR rel_member IN
-      SELECT get_rel_node_members(relation_members,
-                                ARRAY['admin_center','admin_centre']) as member
-    LOOP
-    --DEBUG: RAISE WARNING 'Found admin_center member %', rel_member.member;
-      FOR linked_placex IN
-        SELECT * from placex
-        WHERE osm_type = 'N' and osm_id = rel_member.member
-          and class = 'place'
-      LOOP
-        -- For an admin centre we also want a name match - still not perfect,
-        -- for example 'new york, new york'
-        -- But that can be fixed by explicitly setting the label in the data
-        IF bnd_name = make_standard_name(linked_placex.name->'name')
-           AND bnd.rank_address = linked_placex.rank_address
-        THEN
-          RETURN linked_placex;
-        END IF;
-          --DEBUG: RAISE WARNING 'Linked admin_center';
-      END LOOP;
-    END LOOP;
-  END IF;
-
   -- Name searches can be done for ways as well as relations
   IF bnd_name is not null THEN
     --DEBUG: RAISE WARNING 'Looking for nodes with matching names';
     FOR linked_placex IN
       SELECT placex.* from placex
       WHERE make_standard_name(name->'name') = bnd_name
   -- Name searches can be done for ways as well as relations
   IF bnd_name is not null THEN
     --DEBUG: RAISE WARNING 'Looking for nodes with matching names';
     FOR linked_placex IN
       SELECT placex.* from placex
       WHERE make_standard_name(name->'name') = bnd_name
-        AND placex.rank_address = bnd.rank_address
+        AND ((bnd.rank_address > 0 and placex.rank_address = bnd.rank_address)
+             OR (bnd.rank_address = 0 and placex.rank_search = bnd.rank_search))
         AND placex.osm_type = 'N'
         AND placex.rank_search < 26 -- needed to select the right index
         AND _st_covers(bnd.geometry, placex.geometry)
         AND placex.osm_type = 'N'
         AND placex.rank_search < 26 -- needed to select the right index
         AND _st_covers(bnd.geometry, placex.geometry)
@@ -387,11 +361,12 @@ BEGIN
       location_keywords := location.keywords;
 
       location_isaddress := NOT address_havelevel[location.rank_address];
       location_keywords := location.keywords;
 
       location_isaddress := NOT address_havelevel[location.rank_address];
+      --DEBUG: RAISE WARNING 'should be address: %, is guess: %, rank: %', location_isaddress, location.isguess, location.rank_address;
       IF location_isaddress AND location.isguess AND location_parent IS NOT NULL THEN
           location_isaddress := ST_Contains(location_parent, location.centroid);
       END IF;
 
       IF location_isaddress AND location.isguess AND location_parent IS NOT NULL THEN
           location_isaddress := ST_Contains(location_parent, location.centroid);
       END IF;
 
-      -- RAISE WARNING '% isaddress: %', location.place_id, location_isaddress;
+      --DEBUG: RAISE WARNING '% isaddress: %', location.place_id, location_isaddress;
       -- Add it to the list of search terms
       IF NOT %REVERSE-ONLY% THEN
           nameaddress_vector := array_merge(nameaddress_vector,
       -- Add it to the list of search terms
       IF NOT %REVERSE-ONLY% THEN
           nameaddress_vector := array_merge(nameaddress_vector,
@@ -411,9 +386,12 @@ BEGIN
         END IF;
 
         address_havelevel[location.rank_address] := true;
         END IF;
 
         address_havelevel[location.rank_address] := true;
-        IF NOT location.isguess THEN
-          SELECT placex.geometry FROM placex
-            WHERE obj_place_id = location.place_id INTO location_parent;
+        -- add a hack against postcode ranks
+        IF NOT location.isguess
+           AND location.rank_address != 11 AND location.rank_address != 5
+        THEN
+          SELECT p.geometry FROM placex p
+            WHERE p.place_id = location.place_id INTO location_parent;
         END IF;
 
         IF location.rank_address > parent_place_id_rank THEN
         END IF;
 
         IF location.rank_address > parent_place_id_rank THEN
@@ -421,7 +399,6 @@ BEGIN
           parent_place_id_rank = location.rank_address;
         END IF;
       END IF;
           parent_place_id_rank = location.rank_address;
         END IF;
       END IF;
-    --DEBUG: RAISE WARNING '  Terms: (%) %',location, nameaddress_vector;
     END IF;
 
   END LOOP;
     END IF;
 
   END LOOP;
@@ -723,6 +700,7 @@ BEGIN
                   and ( relation_members[i+1] != 'side_stream' or NEW.name->'name' = name->'name')
                 LOOP
                   UPDATE placex SET linked_place_id = NEW.place_id WHERE place_id = linked_node_id;
                   and ( relation_members[i+1] != 'side_stream' or NEW.name->'name' = name->'name')
                 LOOP
                   UPDATE placex SET linked_place_id = NEW.place_id WHERE place_id = linked_node_id;
+                  DELETE FROM search_name WHERE place_id = linked_node_id;
                 END LOOP;
               END IF;
           END LOOP;
                 END LOOP;
               END IF;
           END LOOP;
@@ -864,6 +842,8 @@ BEGIN
     -- mark the linked place (excludes from search results)
     UPDATE placex set linked_place_id = NEW.place_id
       WHERE place_id = location.place_id;
     -- mark the linked place (excludes from search results)
     UPDATE placex set linked_place_id = NEW.place_id
       WHERE place_id = location.place_id;
+    -- ensure that those places are not found anymore
+    DELETE FROM search_name WHERE place_id = location.place_id;
 
     SELECT wikipedia, importance
       FROM compute_importance(location.extratags, NEW.country_code,
 
     SELECT wikipedia, importance
       FROM compute_importance(location.extratags, NEW.country_code,