]> git.openstreetmap.org Git - nominatim.git/blobdiff - sql/functions/address_lookup.sql
Merge remote-tracking branch 'upstream/master'
[nominatim.git] / sql / functions / address_lookup.sql
index 1a5ed391d42ae9c049cabcb21b801106b5d6ddc6..2426a698f03c4dc3cb373ff793fa9e1eb364e6e7 100644 (file)
@@ -90,7 +90,7 @@ DECLARE
   for_place_id BIGINT;
   result TEXT[];
   search TEXT[];
   for_place_id BIGINT;
   result TEXT[];
   search TEXT[];
-  found INTEGER;
+  current_rank_address INTEGER;
   location RECORD;
   countrylocation RECORD;
   searchcountrycode varchar(2);
   location RECORD;
   countrylocation RECORD;
   searchcountrycode varchar(2);
@@ -103,7 +103,7 @@ DECLARE
   search_unlisted_place TEXT;
   countryname HSTORE;
 BEGIN
   search_unlisted_place TEXT;
   countryname HSTORE;
 BEGIN
-  -- The place ein question might not have a direct entry in place_addressline.
+  -- The place in question might not have a direct entry in place_addressline.
   -- Look for the parent of such places then and save if in for_place_id.
 
   postcode_isexact := false;
   -- Look for the parent of such places then and save if in for_place_id.
 
   postcode_isexact := false;
@@ -177,9 +177,8 @@ BEGIN
 
 --RAISE WARNING '% % % %',searchcountrycode, searchhousenumber, searchpostcode;
 
 
 --RAISE WARNING '% % % %',searchcountrycode, searchhousenumber, searchpostcode;
 
-  found := 1000; -- the lowest rank_address included
+  -- --- Return the record for the base entry.
 
 
-  -- Return the record for the base entry.
   FOR location IN
     SELECT placex.place_id, osm_type, osm_id, name,
            coalesce(extratags->'linked_place', extratags->'place') as place_type,
   FOR location IN
     SELECT placex.place_id, osm_type, osm_id, name,
            coalesce(extratags->'linked_place', extratags->'place') as place_type,
@@ -206,24 +205,28 @@ BEGIN
                            location.admin_level, true, location.isaddress,
                            location.rank_address, location.distance)::addressline;
     RETURN NEXT countrylocation;
                            location.admin_level, true, location.isaddress,
                            location.rank_address, location.distance)::addressline;
     RETURN NEXT countrylocation;
-    found := location.rank_address;
+
+    current_rank_address := location.rank_address;
   END LOOP;
 
   END LOOP;
 
+  -- --- Return records for address parts.
+
   FOR location IN
     SELECT placex.place_id, osm_type, osm_id, name, class, type,
            coalesce(extratags->'linked_place', extratags->'place') as place_type,
   FOR location IN
     SELECT placex.place_id, osm_type, osm_id, name, class, type,
            coalesce(extratags->'linked_place', extratags->'place') as place_type,
-           admin_level, fromarea, isaddress,
+           admin_level, fromarea, isaddress and linked_place_id is NULL as isaddress,
            CASE WHEN rank_address = 11 THEN 5 ELSE rank_address END as rank_address,
            distance, country_code, postcode
       FROM place_addressline join placex on (address_place_id = placex.place_id)
            CASE WHEN rank_address = 11 THEN 5 ELSE rank_address END as rank_address,
            distance, country_code, postcode
       FROM place_addressline join placex on (address_place_id = placex.place_id)
-      WHERE place_addressline.place_id = for_place_id
+      WHERE place_addressline.place_id IN (for_place_id, in_place_id)
             AND linked_place_id is null
             AND (placex.country_code IS NULL OR searchcountrycode IS NULL
                  OR placex.country_code = searchcountrycode)
             AND linked_place_id is null
             AND (placex.country_code IS NULL OR searchcountrycode IS NULL
                  OR placex.country_code = searchcountrycode)
-      ORDER BY rank_address desc, isaddress desc, fromarea desc,
+      ORDER BY rank_address desc, (place_addressline.place_id = in_place_id) desc,
+               isaddress desc, fromarea desc,
                distance asc, rank_search desc
   LOOP
                distance asc, rank_search desc
   LOOP
---RAISE WARNING '%',location;
+    -- RAISE WARNING '%',location;
     IF searchcountrycode IS NULL AND location.country_code IS NOT NULL THEN
       searchcountrycode := location.country_code;
     END IF;
     IF searchcountrycode IS NULL AND location.country_code IS NOT NULL THEN
       searchcountrycode := location.country_code;
     END IF;
@@ -243,17 +246,21 @@ BEGIN
                            location.name, location.class, location.type,
                            location.place_type,
                            location.admin_level, location.fromarea,
                            location.name, location.class, location.type,
                            location.place_type,
                            location.admin_level, location.fromarea,
-                           location.isaddress, location.rank_address,
+                           location.isaddress and location.rank_address != current_rank_address,
+                           location.rank_address,
                            location.distance)::addressline;
     RETURN NEXT countrylocation;
                            location.distance)::addressline;
     RETURN NEXT countrylocation;
-    found := location.rank_address;
+
+    IF location.isaddress THEN
+      current_rank_address := location.rank_address;
+    END IF;
   END LOOP;
 
   -- If no country was included yet, add the name information from country_name.
   END LOOP;
 
   -- If no country was included yet, add the name information from country_name.
-  IF found > 4 THEN
+  IF current_rank_address > 4 THEN
     SELECT name FROM country_name
       WHERE country_code = searchcountrycode LIMIT 1 INTO countryname;
     SELECT name FROM country_name
       WHERE country_code = searchcountrycode LIMIT 1 INTO countryname;
---RAISE WARNING '% % %',found,searchcountrycode,countryname;
+--RAISE WARNING '% % %',current_rank_address,searchcountrycode,countryname;
     IF countryname IS NOT NULL THEN
       location := ROW(null, null, null, countryname, 'place', 'country', NULL,
                       null, true, true, 4, 0)::addressline;
     IF countryname IS NOT NULL THEN
       location := ROW(null, null, null, countryname, 'place', 'country', NULL,
                       null, true, true, 4, 0)::addressline;
@@ -282,7 +289,7 @@ BEGIN
 
   IF search_unlisted_place is not null THEN
     RETURN NEXT ROW(null, null, null, hstore('name', search_unlisted_place),
 
   IF search_unlisted_place is not null THEN
     RETURN NEXT ROW(null, null, null, hstore('name', search_unlisted_place),
-                    'place', 'locality', null, null, true, true, 26, 0)::addressline;
+                    'place', 'locality', null, null, true, true, 25, 0)::addressline;
   END IF;
 
   IF searchpostcode IS NOT NULL THEN
   END IF;
 
   IF searchpostcode IS NOT NULL THEN