]> git.openstreetmap.org Git - nominatim.git/blobdiff - sql/functions.sql
Merge remote-tracking branch 'upstream/master'
[nominatim.git] / sql / functions.sql
index 839d086c5b78b0b577d4ed7bd9e3c243a5beec0a..21d037170744bd59289066a4bc5a8b9a13f5fba6 100644 (file)
@@ -554,20 +554,6 @@ END;
 $$
 LANGUAGE plpgsql IMMUTABLE;
 
-CREATE OR REPLACE FUNCTION get_country_code(place geometry, in_country_code VARCHAR(2)) RETURNS TEXT
-  AS $$
-DECLARE
-  nearcountry RECORD;
-BEGIN
-  FOR nearcountry IN select country_code from country_name where country_code = lower(in_country_code)
-  LOOP
-    RETURN nearcountry.country_code;
-  END LOOP;
-  RETURN get_country_code(place);
-END;
-$$
-LANGUAGE plpgsql IMMUTABLE;
-
 CREATE OR REPLACE FUNCTION get_country_language_code(search_country_code VARCHAR(2)) RETURNS TEXT
   AS $$
 DECLARE
@@ -596,10 +582,9 @@ END;
 $$
 LANGUAGE plpgsql IMMUTABLE;
 
-CREATE OR REPLACE FUNCTION get_partition(place geometry, in_country_code VARCHAR(10)) RETURNS INTEGER
+CREATE OR REPLACE FUNCTION get_partition(in_country_code VARCHAR(10)) RETURNS INTEGER
   AS $$
 DECLARE
-  place_centre GEOMETRY;
   nearcountry RECORD;
 BEGIN
   FOR nearcountry IN select partition from country_name where country_code = in_country_code
@@ -970,9 +955,9 @@ BEGIN
   NEW.place_id := nextval('seq_place');
   NEW.indexed_status := 1; --STATUS_NEW
 
-  NEW.calculated_country_code := lower(get_country_code(NEW.geometry, NEW.country_code));
+  NEW.calculated_country_code := lower(get_country_code(NEW.geometry));
 
-  NEW.partition := get_partition(NEW.geometry, NEW.calculated_country_code);
+  NEW.partition := get_partition(NEW.calculated_country_code);
   NEW.geometry_sector := geometry_sector(NEW.partition, NEW.geometry);
 
   -- copy 'name' to or from the default language (if there is a default language)
@@ -1083,18 +1068,6 @@ BEGIN
       ELSEIF NEW.type in ('village','hamlet','municipality','district','unincorporated_area','borough') THEN
         NEW.rank_search := 19;
         NEW.rank_address := 16;
-      ELSEIF NEW.type in ('airport') AND ST_GeometryType(NEW.geometry) in ('ST_Polygon','ST_MultiPolygon') THEN
-        NEW.rank_search := 18;
-        NEW.rank_address := 17;
-      ELSEIF NEW.type in ('moor') AND ST_GeometryType(NEW.geometry) in ('ST_Polygon','ST_MultiPolygon') THEN
-        NEW.rank_search := 17;
-        NEW.rank_address := 18;
-      ELSEIF NEW.type in ('moor') THEN
-        NEW.rank_search := 17;
-        NEW.rank_address := 0;
-      ELSEIF NEW.type in ('national_park') THEN
-        NEW.rank_search := 18;
-        NEW.rank_address := 18;
       ELSEIF NEW.type in ('suburb','croft','subdivision','isolated_dwelling') THEN
         NEW.rank_search := 20;
         NEW.rank_address := NEW.rank_search;
@@ -1105,12 +1078,9 @@ BEGIN
         IF (NEW.extratags -> 'locality') = 'townland' THEN
           NEW.rank_address := 20;
         END IF;
-      ELSEIF NEW.type in ('hall_of_residence','neighbourhood','housing_estate','nature_reserve') THEN
+      ELSEIF NEW.type in ('neighbourhood') THEN
         NEW.rank_search := 22;
         NEW.rank_address := 22;
-      ELSEIF NEW.type in ('airport','street') THEN
-        NEW.rank_search := 26;
-        NEW.rank_address := NEW.rank_search;
       ELSEIF NEW.type in ('house','building') THEN
         NEW.rank_search := 30;
         NEW.rank_address := NEW.rank_search;
@@ -1152,7 +1122,8 @@ BEGIN
     ELSEIF NEW.class = 'waterway' AND NEW.name is NULL THEN
       RETURN NULL;
     ELSEIF NEW.class = 'waterway' THEN
-      NEW.rank_address := 17;
+      NEW.rank_search := 17;
+      NEW.rank_address := 0;
     ELSEIF NEW.class = 'highway' AND NEW.osm_type != 'N' AND NEW.type in ('service','cycleway','path','footway','steps','bridleway','motorway_link','primary_link','trunk_link','secondary_link','tertiary_link') THEN
       NEW.rank_search := 27;
       NEW.rank_address := NEW.rank_search;
@@ -1366,10 +1337,10 @@ BEGIN
       -- for countries, believe the mapped country code,
       -- so that we remain in the right partition if the boundaries
       -- suddenly expand.
-      NEW.partition := get_partition(place_centroid, lower(NEW.country_code));
+      NEW.partition := get_partition(lower(NEW.country_code));
       IF NEW.partition = 0 THEN
         NEW.calculated_country_code := lower(get_country_code(place_centroid));
-        NEW.partition := get_partition(place_centroid, NEW.calculated_country_code);
+        NEW.partition := get_partition(NEW.calculated_country_code);
       ELSE
         NEW.calculated_country_code := lower(NEW.country_code);
       END IF;
@@ -1380,7 +1351,7 @@ BEGIN
       ELSE
         NEW.calculated_country_code := NULL;
       END IF;
-      NEW.partition := get_partition(place_centroid, NEW.calculated_country_code);
+      NEW.partition := get_partition(NEW.calculated_country_code);
     END IF;
     NEW.geometry_sector := geometry_sector(NEW.partition, place_centroid);
 
@@ -2021,15 +1992,18 @@ LANGUAGE plpgsql;
 CREATE OR REPLACE FUNCTION place_delete() RETURNS TRIGGER
   AS $$
 DECLARE
-  placeid BIGINT;
+  has_rank BOOLEAN;
 BEGIN
 
   --DEBUG: RAISE WARNING 'delete: % % % %',OLD.osm_type,OLD.osm_id,OLD.class,OLD.type;
 
   -- deleting large polygons can have a massive effect on the system - require manual intervention to let them through
   IF st_area(OLD.geometry) > 2 and st_isvalid(OLD.geometry) THEN
-    insert into import_polygon_delete values (OLD.osm_type,OLD.osm_id,OLD.class,OLD.type);
-    RETURN NULL;
+    SELECT bool_or(not (rank_address = 0 or rank_address > 26)) as ranked FROM placex WHERE osm_type = OLD.osm_type and osm_id = OLD.osm_id and class = OLD.class and type = OLD.type INTO has_rank;
+    IF has_rank THEN
+      insert into import_polygon_delete values (OLD.osm_type,OLD.osm_id,OLD.class,OLD.type);
+      RETURN NULL;
+    END IF;
   END IF;
 
   -- mark for delete
@@ -2287,6 +2261,16 @@ BEGIN
       geometry = NEW.geometry
       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.postcode IS NULL THEN
+            -- postcode was deleted, no longer retain in placex
+            DELETE FROM placex where place_id = existingplacex.place_id;
+            RETURN NULL;
+        END IF;
+
+        NEW.name := hstore('ref', NEW.postcode);
+    END IF;
+
     update placex set 
       name = NEW.name,
       housenumber = NEW.housenumber,
@@ -2837,7 +2821,7 @@ DECLARE
 BEGIN
 
   place_centroid := ST_Centroid(pointgeo);
-  out_partition := get_partition(place_centroid, in_countrycode);
+  out_partition := get_partition(in_countrycode);
   out_parent_place_id := null;
 
   address_street_word_id := get_name_id(make_standard_name(in_street));