]> git.openstreetmap.org Git - nominatim.git/blobdiff - sql/functions/normalization.sql
Merge pull request #2058 from lonvia/split-address-words
[nominatim.git] / sql / functions / normalization.sql
index 03b97968e73b2d3bd752aa4a904781a4e2ddb05b..4aea0e9ba3673854dd4cf8ed7dea492916600b66 100644 (file)
@@ -207,19 +207,31 @@ CREATE OR REPLACE FUNCTION addr_ids_from_name(lookup_word TEXT)
   RETURNS INTEGER[]
   AS $$
 DECLARE
-  lookup_token TEXT;
+  words TEXT[];
   id INTEGER;
   return_word_id INTEGER[];
+  word_ids INTEGER[];
+  j INTEGER;
 BEGIN
-  lookup_token := make_standard_name(lookup_word);
-  SELECT array_agg(word_id) FROM word
-    WHERE word_token = lookup_token and class is null and type is null
-    INTO return_word_id;
-  IF return_word_id IS NULL THEN
-    id := nextval('seq_word');
-    INSERT INTO word VALUES (id, lookup_token, null, null, null, null, 0);
-    return_word_id = ARRAY[id];
+  words := string_to_array(make_standard_name(lookup_word), ' ');
+  IF array_upper(words, 1) IS NOT NULL THEN
+    FOR j IN 1..array_upper(words, 1) LOOP
+      IF (words[j] != '') THEN
+        SELECT array_agg(word_id) INTO word_ids
+          FROM word
+         WHERE word_token = words[j] and class is null and type is null;
+
+        IF word_ids IS NULL THEN
+          id := nextval('seq_word');
+          INSERT INTO word VALUES (id, words[j], null, null, null, null, 0);
+          return_word_id := return_word_id || id;
+        ELSE
+          return_word_id := array_merge(return_word_id, word_ids);
+        END IF;
+      END IF;
+    END LOOP;
   END IF;
+
   RETURN return_word_id;
 END;
 $$