]> git.openstreetmap.org Git - nominatim.git/commitdiff
Merge pull request #1698 from lonvia/cleanup-partition-functions
authorSarah Hoffmann <lonvia@denofr.de>
Wed, 26 Feb 2020 19:21:10 +0000 (20:21 +0100)
committerGitHub <noreply@github.com>
Wed, 26 Feb 2020 19:21:10 +0000 (20:21 +0100)
Cleanup partition functions

sql/functions/aux_property.sql
sql/functions/placex_triggers.sql
sql/partition-functions.src.sql
sql/partition-tables.src.sql
sql/tiger_import_start.sql

index cee5cfb2e3619145b4b10ff856d6057d54b59b3a..6dd99eb241436e286c65602d3b5be3b94b1a133f 100644 (file)
@@ -28,8 +28,8 @@ BEGIN
   END IF;
 
   IF out_parent_place_id IS NULL THEN
-    FOR location IN SELECT place_id FROM getNearestRoadFeature(out_partition, place_centroid) LOOP
-      out_parent_place_id := location.place_id;
+    SELECT getNearestRoadPlaceId(out_partition, place_centroid)
+      INTO out_parent_place_id;
     END LOOP;
   END IF;
 
index fb3f2dc5e6b920d76180a093810a9edb1fbfba36..ffc83fa3aa03197e9a3ca22ac32cfbcbf219a12d 100644 (file)
@@ -135,8 +135,7 @@ BEGIN
     IF fallback THEN
       IF ST_Area(bbox) < 0.01 THEN
         -- for smaller features get the nearest road
-        SELECT place_id FROM getNearestRoadFeature(poi_partition, bbox)
-          INTO parent_place_id;
+        SELECT getNearestRoadPlaceId(poi_partition, bbox) INTO parent_place_id;
         --DEBUG: RAISE WARNING 'Checked for nearest way (%)', parent_place_id;
       ELSE
         -- for larger features simply find the area with the largest rank that
index 41758c83d22481234b2e2253f30169033e03a36d..8f78032ed18d4e05e5bc5d4f3ea9dc50563db898 100644 (file)
@@ -1,3 +1,15 @@
+DROP TYPE IF EXISTS nearfeaturecentr CASCADE;
+CREATE TYPE nearfeaturecentr AS (
+  place_id BIGINT,
+  keywords int[],
+  rank_address smallint,
+  rank_search smallint,
+  distance float,
+  isguess boolean,
+  postcode TEXT,
+  centroid GEOMETRY
+);
+
 create or replace function getNearFeatures(in_partition INTEGER, feature GEOMETRY, maxrank INTEGER, isin_tokens INT[]) RETURNS setof nearfeaturecentr AS $$
 DECLARE
   r nearfeaturecentr%rowtype;
@@ -27,7 +39,7 @@ BEGIN
   RAISE EXCEPTION 'Unknown partition %', in_partition;
 END
 $$
-LANGUAGE plpgsql;
+LANGUAGE plpgsql STABLE;
 
 create or replace function deleteLocationArea(in_partition INTEGER, in_place_id BIGINT, in_rank_search INTEGER) RETURNS BOOLEAN AS $$
 DECLARE
@@ -133,7 +145,7 @@ BEGIN
   RAISE EXCEPTION 'Unknown partition %', in_partition;
 END
 $$
-LANGUAGE plpgsql;
+LANGUAGE plpgsql STABLE;
 
 
 create or replace function insertSearchName(
@@ -214,48 +226,50 @@ END
 $$
 LANGUAGE plpgsql;
 
-create or replace function getNearestRoadFeature(in_partition INTEGER, point GEOMETRY) RETURNS setof nearfeature AS $$
+CREATE OR REPLACE FUNCTION getNearestRoadPlaceId(in_partition INTEGER, point GEOMETRY)
+  RETURNS BIGINT
+  AS $$
 DECLARE
-  r nearfeature%rowtype;
-  search_diameter FLOAT;  
+  r RECORD;
+  search_diameter FLOAT;
 BEGIN
 
 -- start
   IF in_partition = -partition- THEN
     search_diameter := 0.00005;
     WHILE search_diameter < 0.1 LOOP
-      FOR r IN 
-        SELECT place_id, null, null, null,
-            ST_Distance(geometry, point) as distance, null as isguess
-            FROM location_road_-partition-
-            WHERE ST_DWithin(geometry, point, search_diameter) 
-        ORDER BY distance ASC limit 1
+      FOR r IN
+        SELECT place_id FROM location_road_-partition-
+          WHERE ST_DWithin(geometry, point, search_diameter)
+          ORDER BY ST_Distance(geometry, point) ASC limit 1
       LOOP
-        RETURN NEXT r;
-        RETURN;
+        RETURN r.place_id;
       END LOOP;
       search_diameter := search_diameter * 2;
     END LOOP;
-    RETURN;
+    RETURN NULL;
   END IF;
 -- end
 
   RAISE EXCEPTION 'Unknown partition %', in_partition;
 END
 $$
-LANGUAGE plpgsql;
+LANGUAGE plpgsql STABLE;
 
-create or replace function getNearestParellelRoadFeature(in_partition INTEGER, line GEOMETRY) RETURNS setof nearfeature AS $$
+CREATE OR REPLACE FUNCTION getNearestParallelRoadFeature(in_partition INTEGER,
+                                                         line GEOMETRY)
+  RETURNS BIGINT
+  AS $$
 DECLARE
-  r nearfeature%rowtype;
-  search_diameter FLOAT;  
+  r RECORD;
+  search_diameter FLOAT;
   p1 GEOMETRY;
   p2 GEOMETRY;
   p3 GEOMETRY;
 BEGIN
 
-  IF st_geometrytype(line) not in ('ST_LineString') THEN
-    RETURN;
+  IF ST_GeometryType(line) not in ('ST_LineString') THEN
+    RETURN NULL;
   END IF;
 
   p1 := ST_LineInterpolatePoint(line,0);
@@ -266,25 +280,22 @@ BEGIN
   IF in_partition = -partition- THEN
     search_diameter := 0.0005;
     WHILE search_diameter < 0.01 LOOP
-      FOR r IN 
-        SELECT place_id, null, null, null,
-            ST_Distance(geometry, line) as distance, null as isguess
-            FROM location_road_-partition-
-            WHERE ST_DWithin(line, geometry, search_diameter)
-            ORDER BY (ST_distance(geometry, p1)+
-                      ST_distance(geometry, p2)+
-                      ST_distance(geometry, p3)) ASC limit 1
+      FOR r IN
+        SELECT place_id FROM location_road_-partition-
+          WHERE ST_DWithin(line, geometry, search_diameter)
+          ORDER BY (ST_distance(geometry, p1)+
+                    ST_distance(geometry, p2)+
+                    ST_distance(geometry, p3)) ASC limit 1
       LOOP
-        RETURN NEXT r;
-        RETURN;
+        RETURN r.place_id;
       END LOOP;
       search_diameter := search_diameter * 2;
     END LOOP;
-    RETURN;
+    RETURN NULL;
   END IF;
 -- end
 
   RAISE EXCEPTION 'Unknown partition %', in_partition;
 END
 $$
-LANGUAGE plpgsql;
+LANGUAGE plpgsql STABLE;
index 57806898e14bb57a5c38fe4ea45798a753f3326f..8749243e5f8fb94402685d52463912cd1253a1bf 100644 (file)
@@ -1,30 +1,3 @@
-drop type if exists nearplace cascade;
-create type nearplace as (
-  place_id BIGINT
-);
-
-drop type if exists nearfeature cascade;
-create type nearfeature as (
-  place_id BIGINT,
-  keywords int[],
-  rank_address smallint,
-  rank_search smallint,
-  distance float,
-  isguess boolean
-);
-
-drop type if exists nearfeaturecentr cascade;
-create type nearfeaturecentr as (
-  place_id BIGINT,
-  keywords int[],
-  rank_address smallint,
-  rank_search smallint,
-  distance float,
-  isguess boolean,
-  postcode TEXT,
-  centroid GEOMETRY
-);
-
 drop table IF EXISTS search_name_blank CASCADE;
 CREATE TABLE search_name_blank (
   place_id BIGINT,
index b9c4fcfc86e83e9855c4c63b7e5d7e23cc72a08a..4b9c33fcbcb5e7650729e1ea34102e056ddf0af4 100644 (file)
@@ -63,15 +63,13 @@ BEGIN
   END IF;
 
   IF out_parent_place_id IS NULL THEN
-    FOR location IN SELECT place_id FROM getNearestParellelRoadFeature(out_partition, linegeo) LOOP
-      out_parent_place_id := location.place_id;
-    END LOOP;    
+    SELECT getNearestParallelRoadFeature(out_partition, linegeo)
+      INTO out_parent_place_id;
   END IF;
 
   IF out_parent_place_id IS NULL THEN
-    FOR location IN SELECT place_id FROM getNearestRoadFeature(out_partition, place_centroid) LOOP
-      out_parent_place_id := location.place_id;
-    END LOOP;    
+    SELECT getNearestRoadPlaceId(out_partition, place_centroid)
+      INTO out_parent_place_id;
   END IF;
 
 --insert street(line) into import table