X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/c3dc66ce9c4f5fccaec405c01e7d71130dc19d2b..6b52e3765c7de9fa4831470d5f079b37e45d92bf:/sql/functions/utils.sql

diff --git a/sql/functions/utils.sql b/sql/functions/utils.sql
index 2b0f681b..6371e9ad 100644
--- a/sql/functions/utils.sql
+++ b/sql/functions/utils.sql
@@ -223,41 +223,70 @@ $$
 LANGUAGE plpgsql STABLE;
 
 
-CREATE OR REPLACE FUNCTION get_country_language_codes(search_country_code VARCHAR(2))
-  RETURNS TEXT[]
+CREATE OR REPLACE FUNCTION get_partition(in_country_code VARCHAR(10))
+  RETURNS INTEGER
   AS $$
 DECLARE
   nearcountry RECORD;
 BEGIN
   FOR nearcountry IN
-    SELECT country_default_language_codes from country_name
-    WHERE country_code = search_country_code limit 1
+    SELECT partition from country_name where country_code = in_country_code
   LOOP
-    RETURN lower(nearcountry.country_default_language_codes);
+    RETURN nearcountry.partition;
   END LOOP;
-  RETURN NULL;
+  RETURN 0;
 END;
 $$
 LANGUAGE plpgsql STABLE;
 
 
-CREATE OR REPLACE FUNCTION get_partition(in_country_code VARCHAR(10))
-  RETURNS INTEGER
+-- Find the parent of an address with addr:street/addr:place tag.
+--
+-- \param street     Value of addr:street or NULL if tag is missing.
+-- \param place      Value of addr:place or NULL if tag is missing.
+-- \param partition  Partition where to search the parent.
+-- \param centroid   Location of the address.
+--
+-- \return Place ID of the parent if one was found, NULL otherwise.
+CREATE OR REPLACE FUNCTION find_parent_for_address(street TEXT, place TEXT,
+                                                   partition SMALLINT,
+                                                   centroid GEOMETRY)
+  RETURNS BIGINT
   AS $$
 DECLARE
-  nearcountry RECORD;
+  parent_place_id BIGINT;
+  word_ids INTEGER[];
 BEGIN
-  FOR nearcountry IN
-    SELECT partition from country_name where country_code = in_country_code
-  LOOP
-    RETURN nearcountry.partition;
-  END LOOP;
-  RETURN 0;
+  IF street is not null THEN
+    -- Check for addr:street attributes
+    -- Note that addr:street links can only be indexed, once the street itself is indexed
+    word_ids := word_ids_from_name(street);
+    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;
+        RETURN parent_place_id;
+      END IF;
+    END IF;
+  END IF;
+
+  -- Check for addr:place attributes.
+  IF place is not null THEN
+    word_ids := word_ids_from_name(place);
+    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;
+        RETURN parent_place_id;
+      END IF;
+    END IF;
+  END IF;
+
+  RETURN NULL;
 END;
 $$
 LANGUAGE plpgsql STABLE;
 
-
 CREATE OR REPLACE FUNCTION delete_location(OLD_place_id BIGINT)
   RETURNS BOOLEAN
   AS $$
