]> git.openstreetmap.org Git - nominatim.git/blobdiff - sql/functions/utils.sql
when linking always check against original address rank
[nominatim.git] / sql / functions / utils.sql
index 2b3db04a92116b38c4f0504f1372923d313ed897..9f8d39889e1412be3db33a721595c9ba721beda9 100644 (file)
@@ -237,7 +237,7 @@ BEGIN
     IF word_ids is not null THEN
       parent_place_id := getNearestNamedRoadPlaceId(partition, centroid, word_ids);
       IF parent_place_id is not null THEN
-        --DEBUG: RAISE WARNING 'Get parent form addr:street: %', parent.place_id;
+        --DEBUG: RAISE WARNING 'Get parent form addr:street: %', parent_place_id;
         RETURN parent_place_id;
       END IF;
     END IF;
@@ -249,7 +249,7 @@ BEGIN
     IF word_ids is not null THEN
       parent_place_id := getNearestNamedPlacePlaceId(partition, centroid, word_ids);
       IF parent_place_id is not null THEN
-        --DEBUG: RAISE WARNING 'Get parent form addr:place: %', parent.place_id;
+        --DEBUG: RAISE WARNING 'Get parent form addr:place: %', parent_place_id;
         RETURN parent_place_id;
       END IF;
     END IF;
@@ -322,7 +322,7 @@ BEGIN
 
   ELSEIF ST_GeometryType(geometry) = 'ST_Point' THEN
     radius := near_feature_rank_distance(rank_search);
-    --DEBUG: RAISE WARNING 'adding % diameter %', place_id, diameter;
+    --DEBUG: RAISE WARNING 'adding % radius %', place_id, radius;
 
     -- Create a bounding box with an extent computed from the radius (in meters).
     secgeo := ST_Envelope(ST_Collect(
@@ -429,7 +429,7 @@ DECLARE
   geo RECORD;
 BEGIN
   -- 10000000000 is ~~ 1x1 degree
-  FOR geo IN select quad_split_geometry(geometry, 0.25, 20) as geom LOOP
+  FOR geo IN select quad_split_geometry(geometry, 0.01, 20) as geom LOOP
     RETURN NEXT geo.geom;
   END LOOP;
   RETURN;
@@ -467,17 +467,23 @@ DECLARE
   placegeom GEOMETRY;
   geom GEOMETRY;
   diameter FLOAT;
-  rank INTEGER;
+  rank SMALLINT;
 BEGIN
   UPDATE placex SET indexed_status = 2 WHERE place_id = placeid;
-  SELECT geometry, rank_search FROM placex WHERE place_id = placeid INTO placegeom, rank;
+
+  SELECT geometry, rank_address INTO placegeom, rank
+    FROM placex WHERE place_id = placeid;
+
   IF placegeom IS NOT NULL AND ST_IsValid(placegeom) THEN
-    IF ST_GeometryType(placegeom) in ('ST_Polygon','ST_MultiPolygon') THEN
-      FOR geom IN select split_geometry(placegeom) FROM placex WHERE place_id = placeid LOOP
-        update placex set indexed_status = 2 where (st_covers(geom, placex.geometry) OR ST_Intersects(geom, placex.geometry)) 
-        AND rank_search > rank and indexed_status = 0 and ST_geometrytype(placex.geometry) = 'ST_Point' and (rank_search < 28 or name is not null or (rank >= 16 and address ? 'place'));
-        update placex set indexed_status = 2 where (st_covers(geom, placex.geometry) OR ST_Intersects(geom, placex.geometry)) 
-        AND rank_search > rank and indexed_status = 0 and ST_geometrytype(placex.geometry) != 'ST_Point' and (rank_search < 28 or name is not null or (rank >= 16 and address ? 'place'));
+    IF ST_GeometryType(placegeom) in ('ST_Polygon','ST_MultiPolygon')
+       AND rank > 0
+    THEN
+      FOR geom IN SELECT split_geometry(placegeom) LOOP
+        UPDATE placex SET indexed_status = 2
+         WHERE ST_Intersects(geom, placex.geometry)
+               and indexed_status = 0
+               and ((rank_address = 0 and rank_search > rank) or rank_address > rank)
+               and (rank_search < 28 or name is not null or (rank >= 16 and address ? 'place'));
       END LOOP;
     ELSE
         diameter := update_place_diameter(rank);