]> git.openstreetmap.org Git - nominatim.git/blobdiff - sql/functions.sql
query.php - we no longer support PHP < 5.4
[nominatim.git] / sql / functions.sql
index f17976adfc703a3e5ddca23f26625252d4307421..73790353059a683cdfec0db2f101e1dbc5935f4e 100644 (file)
@@ -561,14 +561,6 @@ BEGIN
     RETURN nearcountry.country_code;
   END LOOP;
 
--- RAISE WARNING 'natural earth: %', ST_AsText(place_centre);
-
-  -- Natural earth data
-  FOR nearcountry IN select country_code from country_naturalearthdata where st_covers(geometry, place_centre) limit 1
-  LOOP
-    RETURN nearcountry.country_code;
-  END LOOP;
-
 -- RAISE WARNING 'near osm fallback: %', ST_AsText(place_centre);
 
   -- 
@@ -577,14 +569,6 @@ BEGIN
     RETURN nearcountry.country_code;
   END LOOP;
 
--- RAISE WARNING 'near natural earth: %', ST_AsText(place_centre);
-
-  -- Natural earth data 
-  FOR nearcountry IN select country_code from country_naturalearthdata where st_dwithin(geometry, place_centre, 0.5) limit 1
-  LOOP
-    RETURN nearcountry.country_code;
-  END LOOP;
-
   RETURN NULL;
 END;
 $$
@@ -817,11 +801,12 @@ DECLARE
   i INTEGER;
   postcode TEXT;
   result BOOLEAN;
+  is_area BOOLEAN;
   country_code VARCHAR(2);
   default_language VARCHAR(10);
   diameter FLOAT;
   classtable TEXT;
-  line RECORD;
+  classtype TEXT;
 BEGIN
   --DEBUG: RAISE WARNING '% % % %',NEW.osm_type,NEW.osm_id,NEW.class,NEW.type;
 
@@ -848,148 +833,74 @@ BEGIN
   IF NEW.osm_type = 'X' THEN
     -- E'X'ternal records should already be in the right format so do nothing
   ELSE
-    NEW.rank_search := 30;
-    NEW.rank_address := NEW.rank_search;
+    is_area := ST_GeometryType(NEW.geometry) IN ('ST_Polygon','ST_MultiPolygon');
 
-    -- By doing in postgres we have the country available to us - currently only used for postcode
-    IF NEW.class in ('place','boundary') AND NEW.type in ('postcode','postal_code') THEN
+    IF NEW.class in ('place','boundary')
+       AND NEW.type in ('postcode','postal_code') THEN
 
-        IF NEW.address IS NULL OR NOT NEW.address ? 'postcode' THEN
-            -- most likely just a part of a multipolygon postcode boundary, throw it away
-            RETURN NULL;
-        END IF;
+      IF NEW.address IS NULL OR NOT NEW.address ? 'postcode' THEN
+          -- most likely just a part of a multipolygon postcode boundary, throw it away
+          RETURN NULL;
+      END IF;
 
-        NEW.name := hstore('ref', NEW.address->'postcode');
+      NEW.name := hstore('ref', NEW.address->'postcode');
 
-        SELECT * FROM get_postcode_rank(NEW.country_code, NEW.address->'postcode')
-          INTO NEW.rank_search, NEW.rank_address;
+      SELECT * FROM get_postcode_rank(NEW.country_code, NEW.address->'postcode')
+        INTO NEW.rank_search, NEW.rank_address;
 
-        IF NOT ST_GeometryType(NEW.geometry) IN ('ST_Polygon','ST_MultiPolygon') THEN
-            NEW.rank_address := 0;
-        END IF;
-
-    ELSEIF NEW.class = 'place' THEN
-      IF NEW.type in ('continent', 'sea') THEN
-        NEW.rank_search := 2;
-        NEW.rank_address := 0;
-        NEW.country_code := NULL;
-      ELSEIF NEW.type in ('country') THEN
-        NEW.rank_search := 4;
-        IF ST_GeometryType(NEW.geometry) IN ('ST_Polygon','ST_MultiPolygon') THEN
-            NEW.rank_address := NEW.rank_search;
-        ELSE
-            NEW.rank_address := 0;
-        END IF;
-      ELSEIF NEW.type in ('state') THEN
-        NEW.rank_search := 8;
-        IF ST_GeometryType(NEW.geometry) IN ('ST_Polygon','ST_MultiPolygon') THEN
-            NEW.rank_address := NEW.rank_search;
-        ELSE
-            NEW.rank_address := 0;
-        END IF;
-      ELSEIF NEW.type in ('region') THEN
-        NEW.rank_search := 18; -- dropped from previous value of 10
-        NEW.rank_address := 0; -- So badly miss-used that better to just drop it!
-      ELSEIF NEW.type in ('county') THEN
-        NEW.rank_search := 12;
-        NEW.rank_address := NEW.rank_search;
-      ELSEIF NEW.type in ('city') THEN
-        NEW.rank_search := 16;
-        NEW.rank_address := NEW.rank_search;
-      ELSEIF NEW.type in ('island') THEN
-        NEW.rank_search := 17;
-        NEW.rank_address := 0;
-      ELSEIF NEW.type in ('town') THEN
-        NEW.rank_search := 18;
-        NEW.rank_address := 16;
-      ELSEIF NEW.type in ('village','hamlet','municipality','district','unincorporated_area','borough') THEN
-        NEW.rank_search := 19;
-        NEW.rank_address := 16;
-      ELSEIF NEW.type in ('suburb','croft','subdivision','isolated_dwelling') THEN
-        NEW.rank_search := 20;
-        NEW.rank_address := NEW.rank_search;
-      ELSEIF NEW.type in ('farm','locality','islet','mountain_pass') THEN
-        NEW.rank_search := 20;
-        NEW.rank_address := 0;
-        -- Irish townlands, tagged as place=locality and locality=townland
-        IF (NEW.extratags -> 'locality') = 'townland' THEN
-          NEW.rank_address := 20;
-        END IF;
-      ELSEIF NEW.type in ('neighbourhood') THEN
-        NEW.rank_search := 22;
-        NEW.rank_address := 22;
-      ELSEIF NEW.type in ('house','building') THEN
-        NEW.rank_search := 30;
-        NEW.rank_address := NEW.rank_search;
-      ELSEIF NEW.type in ('houses') THEN
-        -- can't guarantee all required nodes loaded yet due to caching in osm2pgsql
-        NEW.rank_search := 28;
-        NEW.rank_address := 0;
+      IF NOT is_area THEN
+          NEW.rank_address := 0;
       END IF;
-
-    ELSEIF NEW.class = 'boundary' THEN
-      IF ST_GeometryType(NEW.geometry) NOT IN ('ST_Polygon','ST_MultiPolygon') THEN
---        RAISE WARNING 'invalid boundary %',NEW.osm_id;
+    ELSEIF NEW.class = 'boundary' AND NOT is_area THEN
         return NULL;
-      END IF;
-      NEW.rank_search := NEW.admin_level * 2;
-      IF NEW.type = 'administrative' THEN
-        NEW.rank_address := NEW.rank_search;
+    ELSEIF NEW.class = 'boundary' AND NEW.type = 'administrative'
+           AND NEW.admin_level <= 4 AND NEW.osm_type = 'W' THEN
+        return NULL;
+    ELSEIF NEW.class = 'railway' AND NEW.type in ('rail') THEN
+        return NULL;
+    ELSEIF NEW.osm_type = 'N' AND NEW.class = 'highway' THEN
+        NEW.rank_search = 30;
+        NEW.rank_address = 0;
+    ELSEIF NEW.class = 'landuse' AND NOT is_area THEN
+        NEW.rank_search = 30;
+        NEW.rank_address = 0;
+    ELSE
+      -- do table lookup stuff
+      IF NEW.class = 'boundary' and NEW.type = 'administrative' THEN
+        classtype = NEW.type || NEW.admin_level::TEXT;
       ELSE
-        NEW.rank_address := 0;
+        classtype = NEW.type;
       END IF;
-    ELSEIF NEW.class = 'landuse' AND ST_GeometryType(NEW.geometry) in ('ST_Polygon','ST_MultiPolygon') THEN
-      NEW.rank_search := 22;
-      IF NEW.type in ('residential', 'farm', 'farmyard', 'industrial', 'commercial', 'allotments', 'retail') THEN
-        NEW.rank_address := NEW.rank_search;
-      ELSE
-        NEW.rank_address := 0;
+      SELECT l.rank_search, l.rank_address FROM address_levels l
+       WHERE (l.country_code = NEW.country_code or l.country_code is NULL)
+             AND l.class = NEW.class AND (l.type = classtype or l.type is NULL)
+       ORDER BY l.country_code, l.class, l.type LIMIT 1
+        INTO NEW.rank_search, NEW.rank_address;
+
+      IF NEW.rank_search is NULL THEN
+        NEW.rank_search := 30;
       END IF;
-    ELSEIF NEW.class = 'leisure' and NEW.type in ('park') THEN
-      NEW.rank_search := 24;
-      NEW.rank_address := 0;
-    ELSEIF NEW.class = 'natural' and NEW.type in ('peak','volcano','mountain_range') THEN
-      NEW.rank_search := 18;
-      NEW.rank_address := 0;
-    ELSEIF NEW.class = 'natural' and NEW.type = 'sea' THEN
-      NEW.rank_search := 4;
-      NEW.rank_address := NEW.rank_search;
-    -- any feature more than 5 square miles is probably worth indexing
-    ELSEIF ST_GeometryType(NEW.geometry) in ('ST_Polygon','ST_MultiPolygon') AND ST_Area(NEW.geometry) > 0.1 THEN
-      NEW.rank_search := 22;
-      NEW.rank_address := 0;
-    ELSEIF NEW.class = 'railway' AND NEW.type in ('rail') THEN
-      RETURN NULL;
-    ELSEIF NEW.class = 'waterway' THEN
-      IF NEW.osm_type = 'R' THEN
-        NEW.rank_search := 16;
-      ELSE
-        NEW.rank_search := 17;
+
+      IF NEW.rank_address is NULL THEN
+        NEW.rank_address := 30;
       END IF;
-      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;
-    ELSEIF NEW.class = 'highway' AND NEW.osm_type != 'N' THEN
-      NEW.rank_search := 26;
-      NEW.rank_address := NEW.rank_search;
-    ELSEIF NEW.class = 'mountain_pass' THEN
-        NEW.rank_search := 20;
-        NEW.rank_address := 0;
     END IF;
 
-  END IF;
-
-  IF NEW.rank_search > 30 THEN
-    NEW.rank_search := 30;
-  END IF;
+    -- some postcorrections
+    IF NEW.class = 'place' THEN
+      IF NEW.type in ('continent', 'sea', 'country', 'state') AND NEW.osm_type = 'N' THEN
+        NEW.rank_address := 0;
+      END IF;
+    ELSEIF NEW.class = 'waterway' AND NEW.osm_type = 'R' THEN
+        -- Slightly promote waterway relations so that they are processed
+        -- before their members.
+        NEW.rank_search := NEW.rank_search - 1;
+    END IF;
 
-  IF NEW.rank_address > 30 THEN
-    NEW.rank_address := 30;
-  END IF;
+    IF (NEW.extratags -> 'capital') = 'yes' THEN
+      NEW.rank_search := NEW.rank_search - 1;
+    END IF;
 
-  IF (NEW.extratags -> 'capital') = 'yes' THEN
-    NEW.rank_search := NEW.rank_search - 1;
   END IF;
 
   -- a country code make no sense below rank 4 (country)
@@ -1400,10 +1311,6 @@ BEGIN
       --DEBUG: RAISE WARNING 'Waterway processed';
   END IF;
 
-  -- Adding ourselves to the list simplifies address calculations later
-  INSERT INTO place_addressline (place_id, address_place_id, fromarea, isaddress, distance, cached_rank_address)
-    VALUES (NEW.place_id, NEW.place_id, true, true, 0, NEW.rank_address); 
-
   -- What level are we searching from
   search_maxrank := NEW.rank_search;
 
@@ -2394,6 +2301,9 @@ create type addressline as (
   distance FLOAT
 );
 
+-- Compute the list of address parts for the given place.
+--
+-- If in_housenumber is greator or equal 0, look for an interpolation.
 CREATE OR REPLACE FUNCTION get_addressdata(in_place_id BIGINT, in_housenumber INTEGER) RETURNS setof addressline 
   AS $$
 DECLARE
@@ -2411,50 +2321,66 @@ DECLARE
   searchclass TEXT;
   searchtype TEXT;
   countryname HSTORE;
-  hadcountry BOOLEAN;
 BEGIN
+  -- The place ein 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.
+
   -- first query osmline (interpolation lines)
-  select parent_place_id, country_code, 30, postcode, null, 'place', 'house' from location_property_osmline 
-    WHERE place_id = in_place_id AND in_housenumber>=startnumber AND in_housenumber <= endnumber
-    INTO for_place_id,searchcountrycode, searchrankaddress, searchpostcode, searchhousename, searchclass, searchtype;
-  IF for_place_id IS NOT NULL THEN
-    searchhousenumber = in_housenumber::text;
+  IF in_housenumber >= 0 THEN
+    SELECT parent_place_id, country_code, in_housenumber::text, 30, postcode,
+           null, 'place', 'house'
+      FROM location_property_osmline
+      WHERE place_id = in_place_id AND in_housenumber>=startnumber
+            AND in_housenumber <= endnumber
+      INTO for_place_id, searchcountrycode, searchhousenumber, searchrankaddress,
+           searchpostcode, searchhousename, searchclass, searchtype;
   END IF;
 
   --then query tiger data
   -- %NOTIGERDATA% IF 0 THEN
-  IF for_place_id IS NULL THEN
-    select parent_place_id,'us', 30, postcode, null, 'place', 'house' from location_property_tiger 
-      WHERE place_id = in_place_id AND in_housenumber>=startnumber AND in_housenumber <= endnumber
-      INTO for_place_id,searchcountrycode, searchrankaddress, searchpostcode, searchhousename, searchclass, searchtype;
-    IF for_place_id IS NOT NULL THEN
-      searchhousenumber = in_housenumber::text;
-    END IF;
+  IF for_place_id IS NULL AND in_housenumber >= 0 THEN
+    SELECT parent_place_id, 'us', in_housenumber::text, 30, postcode, null,
+           'place', 'house'
+      FROM location_property_tiger
+      WHERE place_id = in_place_id AND in_housenumber >= startnumber
+            AND in_housenumber <= endnumber
+      INTO for_place_id, searchcountrycode, searchhousenumber, searchrankaddress,
+           searchpostcode, searchhousename, searchclass, searchtype;
   END IF;
   -- %NOTIGERDATA% END IF;
 
   -- %NOAUXDATA% IF 0 THEN
   IF for_place_id IS NULL THEN
-    select parent_place_id,'us', housenumber, 30, postcode, null, 'place', 'house' from location_property_aux
+    SELECT parent_place_id, 'us', housenumber, 30, postcode, null, 'place', 'house'
+      FROM location_property_aux
       WHERE place_id = in_place_id
-      INTO for_place_id,searchcountrycode, searchhousenumber, searchrankaddress, searchpostcode, searchhousename, searchclass, searchtype;
+      INTO for_place_id,searchcountrycode, searchhousenumber, searchrankaddress,
+           searchpostcode, searchhousename, searchclass, searchtype;
   END IF;
   -- %NOAUXDATA% END IF;
 
   -- postcode table
   IF for_place_id IS NULL THEN
-    select parent_place_id, country_code, rank_address, postcode, 'place', 'postcode'
+    SELECT parent_place_id, country_code, rank_address, postcode, 'place', 'postcode'
       FROM location_postcode
       WHERE place_id = in_place_id
-      INTO for_place_id, searchcountrycode, searchrankaddress, searchpostcode, searchclass, searchtype;
+      INTO for_place_id, searchcountrycode, searchrankaddress, searchpostcode,
+           searchclass, searchtype;
   END IF;
 
+  -- POI objects in the placex table
   IF for_place_id IS NULL THEN
-    select parent_place_id, country_code, housenumber, rank_search, postcode, name, class, type from placex 
-      WHERE place_id = in_place_id and  rank_search > 27
-      INTO for_place_id, searchcountrycode, searchhousenumber, searchrankaddress, searchpostcode, searchhousename, searchclass, searchtype;
+    SELECT parent_place_id, country_code, housenumber, rank_search, postcode,
+           name, class, type
+      FROM placex
+      WHERE place_id = in_place_id and rank_search > 27
+      INTO for_place_id, searchcountrycode, searchhousenumber, searchrankaddress,
+           searchpostcode, searchhousename, searchclass, searchtype;
   END IF;
 
+  -- If for_place_id is still NULL at this point then the object has its own
+  -- entry in place_address line. However, still check if there is not linked
+  -- place we should be using instead.
   IF for_place_id IS NULL THEN
     select coalesce(linked_place_id, place_id),  country_code,
            housenumber, rank_search, postcode, null
@@ -2464,52 +2390,51 @@ BEGIN
 
 --RAISE WARNING '% % % %',searchcountrycode, searchhousenumber, searchrankaddress, searchpostcode;
 
-  found := 1000;
-  hadcountry := false;
-  FOR location IN 
-    select placex.place_id, osm_type, osm_id, name,
-      class, type, admin_level, true as isaddress,
-      CASE WHEN rank_address = 0 THEN 100 WHEN rank_address = 11 THEN 5 ELSE rank_address END as rank_address,
-      0 as distance, country_code, postcode
-      from placex
-      where place_id = for_place_id 
+  found := 1000; -- the lowest rank_address included
+
+  -- Return the record for the base entry.
+  FOR location IN
+    SELECT placex.place_id, osm_type, osm_id, name,
+           class, type, admin_level,
+           type not in ('postcode', 'postal_code') as isaddress,
+           CASE WHEN rank_address = 0 THEN 100
+                WHEN rank_address = 11 THEN 5
+                ELSE rank_address END as rank_address,
+           0 as distance, country_code, postcode
+      FROM placex
+      WHERE place_id = for_place_id
   LOOP
 --RAISE WARNING '%',location;
     IF searchcountrycode IS NULL AND location.country_code IS NOT NULL THEN
       searchcountrycode := location.country_code;
     END IF;
-    IF location.type in ('postcode', 'postal_code') THEN
-      location.isaddress := FALSE;
-    ELSEIF location.rank_address = 4 THEN
-      hadcountry := true;
-    END IF;
-    IF location.rank_address < 4 AND NOT hadcountry THEN
-      select name from country_name where country_code = searchcountrycode limit 1 INTO countryname;
-      IF countryname IS NOT NULL THEN
-        countrylocation := ROW(null, null, null, countryname, 'place', 'country', null, true, true, 4, 0)::addressline;
-        RETURN NEXT countrylocation;
-      END IF;
+    IF location.rank_address < 4 THEN
+      -- no country locations for ranks higher than country
+      searchcountrycode := NULL;
     END IF;
-    countrylocation := ROW(location.place_id, location.osm_type, location.osm_id, location.name, location.class, 
-                           location.type, location.admin_level, true, location.isaddress, location.rank_address,
-                           location.distance)::addressline;
+    countrylocation := ROW(location.place_id, location.osm_type, location.osm_id,
+                           location.name, location.class, location.type,
+                           location.admin_level, true, location.isaddress,
+                           location.rank_address, location.distance)::addressline;
     RETURN NEXT countrylocation;
     found := location.rank_address;
   END LOOP;
 
-  FOR location IN 
-    select placex.place_id, osm_type, osm_id, name,
-      CASE WHEN extratags ? 'place' THEN 'place' ELSE class END as class,
-      CASE WHEN extratags ? 'place' THEN extratags->'place' ELSE type END as type,
-      admin_level, fromarea, isaddress,
-      CASE WHEN address_place_id = for_place_id AND rank_address = 0 THEN 100 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 
-      and (cached_rank_address > 0 AND cached_rank_address < searchrankaddress)
-      and address_place_id != for_place_id 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,distance asc,rank_search desc
+  FOR location IN
+    SELECT placex.place_id, osm_type, osm_id, name,
+           CASE WHEN extratags ? 'place' THEN 'place' ELSE class END as class,
+           CASE WHEN extratags ? 'place' THEN extratags->'place' ELSE type END as type,
+           admin_level, fromarea, 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)
+      WHERE place_addressline.place_id = for_place_id
+            AND (cached_rank_address >= 4 AND cached_rank_address < searchrankaddress)
+            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,
+               distance asc, rank_search desc
   LOOP
 --RAISE WARNING '%',location;
     IF searchcountrycode IS NULL AND location.country_code IS NOT NULL THEN
@@ -2518,49 +2443,49 @@ BEGIN
     IF location.type in ('postcode', 'postal_code') THEN
       location.isaddress := FALSE;
     END IF;
-    IF location.rank_address = 4 AND location.isaddress THEN
-      hadcountry := true;
-    END IF;
-    IF location.rank_address < 4 AND NOT hadcountry THEN
-      select name from country_name where country_code = searchcountrycode limit 1 INTO countryname;
-      IF countryname IS NOT NULL THEN
-        countrylocation := ROW(null, null, null, countryname, 'place', 'country', null, true, true, 4, 0)::addressline;
-        RETURN NEXT countrylocation;
-      END IF;
-    END IF;
-    countrylocation := ROW(location.place_id, location.osm_type, location.osm_id, location.name, location.class, 
-                           location.type, location.admin_level, location.fromarea, location.isaddress, location.rank_address, 
+    countrylocation := ROW(location.place_id, location.osm_type, location.osm_id,
+                           location.name, location.class, location.type,
+                           location.admin_level, location.fromarea,
+                           location.isaddress, location.rank_address,
                            location.distance)::addressline;
     RETURN NEXT countrylocation;
     found := location.rank_address;
   END LOOP;
 
+  -- If no country was included yet, add the name information from country_name.
   IF found > 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;
     IF countryname IS NOT NULL THEN
-      location := ROW(null, null, null, countryname, 'place', 'country', null, true, true, 4, 0)::addressline;
+      location := ROW(null, null, null, countryname, 'place', 'country',
+                      null, true, true, 4, 0)::addressline;
       RETURN NEXT location;
     END IF;
   END IF;
 
+  -- Finally add some artificial rows.
   IF searchcountrycode IS NOT NULL THEN
-    location := ROW(null, null, null, hstore('ref', searchcountrycode), 'place', 'country_code', null, true, false, 4, 0)::addressline;
+    location := ROW(null, null, null, hstore('ref', searchcountrycode),
+                    'place', 'country_code', null, true, false, 4, 0)::addressline;
     RETURN NEXT location;
   END IF;
 
   IF searchhousename IS NOT NULL THEN
-    location := ROW(in_place_id, null, null, searchhousename, searchclass, searchtype, null, true, true, 29, 0)::addressline;
+    location := ROW(in_place_id, null, null, searchhousename, searchclass,
+                    searchtype, null, true, true, 29, 0)::addressline;
     RETURN NEXT location;
   END IF;
 
   IF searchhousenumber IS NOT NULL THEN
-    location := ROW(in_place_id, null, null, hstore('ref', searchhousenumber), 'place', 'house_number', null, true, true, 28, 0)::addressline;
+    location := ROW(in_place_id, null, null, hstore('ref', searchhousenumber),
+                    'place', 'house_number', null, true, true, 28, 0)::addressline;
     RETURN NEXT location;
   END IF;
 
   IF searchpostcode IS NOT NULL THEN
-    location := ROW(null, null, null, hstore('ref', searchpostcode), 'place', 'postcode', null, true, true, 5, 0)::addressline;
+    location := ROW(null, null, null, hstore('ref', searchpostcode), 'place',
+                    'postcode', null, true, true, 5, 0)::addressline;
     RETURN NEXT location;
   END IF;
 
@@ -2570,96 +2495,6 @@ $$
 LANGUAGE plpgsql;
 
 
-CREATE OR REPLACE FUNCTION get_searchrank_label(rank INTEGER) RETURNS TEXT
-  AS $$
-DECLARE
-BEGIN
-  IF rank < 2 THEN
-    RETURN 'Continent';
-  ELSEIF rank < 4 THEN
-    RETURN 'Sea';
-  ELSEIF rank < 8 THEN
-    RETURN 'Country';
-  ELSEIF rank < 12 THEN
-    RETURN 'State';
-  ELSEIF rank < 16 THEN
-    RETURN 'County';
-  ELSEIF rank = 16 THEN
-    RETURN 'City';
-  ELSEIF rank = 17 THEN
-    RETURN 'Town / Island';
-  ELSEIF rank = 18 THEN
-    RETURN 'Village / Hamlet';
-  ELSEIF rank = 20 THEN
-    RETURN 'Suburb';
-  ELSEIF rank = 21 THEN
-    RETURN 'Postcode Area';
-  ELSEIF rank = 22 THEN
-    RETURN 'Croft / Farm / Locality / Islet';
-  ELSEIF rank = 23 THEN
-    RETURN 'Postcode Area';
-  ELSEIF rank = 25 THEN
-    RETURN 'Postcode Point';
-  ELSEIF rank = 26 THEN
-    RETURN 'Street / Major Landmark';
-  ELSEIF rank = 27 THEN
-    RETURN 'Minory Street / Path';
-  ELSEIF rank = 28 THEN
-    RETURN 'House / Building';
-  ELSE
-    RETURN 'Other: '||rank;
-  END IF;
-  
-END;
-$$
-LANGUAGE plpgsql;
-
-CREATE OR REPLACE FUNCTION get_addressrank_label(rank INTEGER) RETURNS TEXT
-  AS $$
-DECLARE
-BEGIN
-  IF rank = 0 THEN
-    RETURN 'None';
-  ELSEIF rank < 2 THEN
-    RETURN 'Continent';
-  ELSEIF rank < 4 THEN
-    RETURN 'Sea';
-  ELSEIF rank = 5 THEN
-    RETURN 'Postcode';
-  ELSEIF rank < 8 THEN
-    RETURN 'Country';
-  ELSEIF rank < 12 THEN
-    RETURN 'State';
-  ELSEIF rank < 16 THEN
-    RETURN 'County';
-  ELSEIF rank = 16 THEN
-    RETURN 'City';
-  ELSEIF rank = 17 THEN
-    RETURN 'Town / Village / Hamlet';
-  ELSEIF rank = 20 THEN
-    RETURN 'Suburb';
-  ELSEIF rank = 21 THEN
-    RETURN 'Postcode Area';
-  ELSEIF rank = 22 THEN
-    RETURN 'Croft / Farm / Locality / Islet';
-  ELSEIF rank = 23 THEN
-    RETURN 'Postcode Area';
-  ELSEIF rank = 25 THEN
-    RETURN 'Postcode Point';
-  ELSEIF rank = 26 THEN
-    RETURN 'Street / Major Landmark';
-  ELSEIF rank = 27 THEN
-    RETURN 'Minory Street / Path';
-  ELSEIF rank = 28 THEN
-    RETURN 'House / Building';
-  ELSE
-    RETURN 'Other: '||rank;
-  END IF;
-  
-END;
-$$
-LANGUAGE plpgsql;
-
 CREATE OR REPLACE FUNCTION aux_create_property(pointgeo GEOMETRY, in_housenumber TEXT, 
   in_street TEXT, in_isin TEXT, in_postcode TEXT, in_countrycode char(2)) RETURNS INTEGER
   AS $$