]> git.openstreetmap.org Git - nominatim.git/blobdiff - sql/functions/normalization.sql
get address terms from address tags for rank 30
[nominatim.git] / sql / functions / normalization.sql
index 71b14ee5109aa198f510993247073df754cafdc5..c7ead7006c8408a583dd716cd4e5ae51bc33fef8 100644 (file)
@@ -414,10 +414,14 @@ $$
 LANGUAGE plpgsql;
 
 
-CREATE OR REPLACE FUNCTION create_poi_search_terms(parent_place_id BIGINT,
+CREATE OR REPLACE FUNCTION create_poi_search_terms(obj_place_id BIGINT,
+                                                   in_partition SMALLINT,
+                                                   parent_place_id BIGINT,
                                                    address HSTORE,
+                                                   country TEXT,
                                                    housenumber TEXT,
                                                    initial_name_vector INTEGER[],
+                                                   geometry GEOMETRY,
                                                    OUT name_vector INTEGER[],
                                                    OUT nameaddress_vector INTEGER[])
   AS $$
@@ -427,34 +431,52 @@ DECLARE
   addr_place_ids INTEGER[];
 
   addr_item RECORD;
+  parent_address_place_ids BIGINT[];
 BEGIN
-  -- Compute all search terms from the addr: tags.
   nameaddress_vector := '{}'::INTEGER[];
 
+  SELECT s.name_vector, s.nameaddress_vector
+    INTO parent_name_vector, parent_address_vector
+    FROM search_name s
+    WHERE s.place_id = parent_place_id;
+
+  -- Compute all search terms from the addr: tags.
   IF address IS NOT NULL THEN
-    FOR addr_item IN SELECT * FROM each(address)
+    FOR addr_item IN
+      SELECT * FROM
+        get_places_for_addr_tags(in_partition, geometry, address, country)
     LOOP
-      IF addr_item.key IN ('city', 'tiger:county', 'state', 'suburb', 'province',
-                           'district', 'region', 'county', 'municipality',
-                           'hamlet', 'village', 'subdistrict', 'town',
-                           'neighbourhood', 'quarter', 'parish')
-      THEN
-          nameaddress_vector := array_merge(nameaddress_vector,
-                                            addr_ids_from_name(addr_item.value));
-      END IF;
+        IF addr_item.place_id is null THEN
+            nameaddress_vector := array_merge(nameaddress_vector,
+                                              addr_item.keywords);
+            CONTINUE;
+        END IF;
+
+        IF parent_address_place_ids is null THEN
+            SELECT array_agg(parent_place_id) INTO parent_address_place_ids
+              FROM place_addressline
+             WHERE place_id = parent_place_id;
+        END IF;
+
+        IF not parent_address_place_ids @> ARRAY[addr_item.place_id] THEN
+            nameaddress_vector := array_merge(nameaddress_vector,
+                                              addr_item.keywords);
+
+            INSERT INTO place_addressline (place_id, address_place_id, fromarea,
+                                           isaddress, distance, cached_rank_address)
+            VALUES (obj_place_id, addr_item.place_id, not addr_item.isguess,
+                    true, addr_item.distance, addr_item.rank_address);
+        END IF;
     END LOOP;
   END IF;
 
+
   -- If the POI is named, simply mix in all address terms and be done.
   IF array_length(initial_name_vector, 1) is not NULL THEN
     -- Cheating here by not recomputing all terms but simply using the ones
     -- from the parent object.
-    SELECT array_merge(s.name_vector, s.nameaddress_vector)
-      INTO parent_address_vector
-      FROM search_name s
-      WHERE s.place_id = parent_place_id;
-
     name_vector := initial_name_vector;
+    nameaddress_vector := array_merge(nameaddress_vector, parent_name_vector);
     nameaddress_vector := array_merge(nameaddress_vector, parent_address_vector);
 
     IF not address ? 'street' and address ? 'place' THEN
@@ -475,11 +497,6 @@ BEGIN
     RETURN;
   END IF;
 
-  SELECT s.name_vector, s.nameaddress_vector
-    INTO parent_name_vector, parent_address_vector
-    FROM search_name s
-    WHERE s.place_id = parent_place_id;
-
   -- Check if the parent covers all address terms.
   -- If not, create a search name entry with the house number as the name.
   -- This is unusual for the search_name table but prevents that the place