]> git.openstreetmap.org Git - nominatim.git/commitdiff
reset address and search ranks on update
authorSarah Hoffmann <lonvia@denofr.de>
Sat, 11 Apr 2020 07:20:13 +0000 (09:20 +0200)
committerSarah Hoffmann <lonvia@denofr.de>
Sat, 11 Apr 2020 07:20:13 +0000 (09:20 +0200)
With ranks being dynamically changed through linking of places,
it is important to reset the ranks on update, so that changes
of the rank due to changes in linking are correctly taken into
account.

sql/functions/placex_triggers.sql
sql/functions/ranking.sql

index 3f9fae7a8803bb487fe5b145d620c4c72958801d..ab8f951f626099f9361ce6184dabdf8b3ae0cc4c 100644 (file)
@@ -392,7 +392,6 @@ DECLARE
   country_code VARCHAR(2);
   diameter FLOAT;
   classtable TEXT;
-  classtype TEXT;
 BEGIN
   --DEBUG: RAISE WARNING '% % % %',NEW.osm_type,NEW.osm_id,NEW.class,NEW.type;
 
@@ -428,8 +427,9 @@ BEGIN
     END IF;
 
     SELECT * INTO NEW.rank_search, NEW.rank_address
-      FROM compute_place_rank(NEW.country_code, NEW.osm_type, NEW.class,
-                              NEW.type, NEW.admin_level, is_area,
+      FROM compute_place_rank(NEW.country_code,
+                              CASE WHEN is_area THEN 'A' ELSE NEW.osm_type END,
+                              NEW.class, NEW.type, NEW.admin_level,
                               (NEW.extratags->'capital') = 'yes',
                               NEW.address->'postcode');
 
@@ -552,6 +552,17 @@ BEGIN
     RETURN NEW;
   END IF;
 
+  -- recompute the ranks, they might change when linking changes
+  SELECT * INTO NEW.rank_search, NEW.rank_address
+    FROM compute_place_rank(NEW.country_code,
+                            CASE WHEN ST_GeometryType(NEW.geometry)
+                                        IN ('ST_Polygon','ST_MultiPolygon')
+                            THEN 'A' ELSE NEW.osm_type END,
+                            NEW.class, NEW.type, NEW.admin_level,
+                            (NEW.extratags->'capital') = 'yes',
+                            NEW.address->'postcode');
+
+
   --DEBUG: RAISE WARNING 'Copy over address tags';
   -- housenumber is a computed field, so start with an empty value
   NEW.housenumber := NULL;
index d23944b1c64271a2a0a49060751b5221fd53211c..98e70a4235e07d2586b685ac4d27e73722ed6964 100644 (file)
@@ -116,12 +116,23 @@ $$
 LANGUAGE plpgsql IMMUTABLE;
 
 
--- Get standard search and address rank for an object
+-- Get standard search and address rank for an object.
+--
+-- \param country        Two-letter country code where the object is in.
+-- \param extended_type  OSM type (N, W, R) or area type (A).
+-- \param place_class    Class (or tag key) of object.
+-- \param place_type     Type (or tag value) of object.
+-- \param admin_level    Value of admin_level tag.
+-- \param is_major       If true, boost search rank by one.
+-- \param postcode       Value of addr:postcode tag.
+-- \param[out] search_rank   Computed search rank.
+-- \param[out] address_rank  Computed address rank.
+--
 CREATE OR REPLACE FUNCTION compute_place_rank(country VARCHAR(2),
-                                              osm_type VARCHAR(1),
+                                              extended_type VARCHAR(1),
                                               place_class TEXT, place_type TEXT,
                                               admin_level SMALLINT,
-                                              is_area BOOLEAN, is_major BOOLEAN,
+                                              is_major BOOLEAN,
                                               postcode TEXT,
                                               OUT search_rank SMALLINT,
                                               OUT address_rank SMALLINT)
@@ -135,13 +146,13 @@ BEGIN
     SELECT * INTO search_rank, address_rank
       FROM get_postcode_rank(country, postcode);
 
-    IF NOT is_area THEN
+    IF NOT extended_type = 'A' THEN
       address_rank := 0;
     END IF;
-  ELSEIF osm_type = 'N' AND place_class = 'highway' THEN
+  ELSEIF extended_type = 'N' AND place_class = 'highway' THEN
     search_rank = 30;
     address_rank = 0;
-  ELSEIF place_class = 'landuse' AND NOT is_area THEN
+  ELSEIF place_class = 'landuse' AND extended_type != 'A' THEN
     search_rank = 30;
     address_rank = 0;
   ELSE
@@ -166,7 +177,7 @@ BEGIN
     END IF;
 
     -- some postcorrections
-    IF place_class = 'waterway' AND osm_type = 'R' THEN
+    IF place_class = 'waterway' AND extended_type = 'R' THEN
         -- Slightly promote waterway relations so that they are processed
         -- before their members.
         search_rank := search_rank - 1;