mirror of
https://github.com/osm-search/Nominatim.git
synced 2024-11-23 21:54:10 +03:00
factor out computation of address and search rank
This commit is contained in:
parent
ef47515420
commit
c6d859a08a
@ -410,8 +410,8 @@ BEGIN
|
|||||||
is_area := ST_GeometryType(NEW.geometry) IN ('ST_Polygon','ST_MultiPolygon');
|
is_area := ST_GeometryType(NEW.geometry) IN ('ST_Polygon','ST_MultiPolygon');
|
||||||
|
|
||||||
IF NEW.class in ('place','boundary')
|
IF NEW.class in ('place','boundary')
|
||||||
AND NEW.type in ('postcode','postal_code') THEN
|
AND NEW.type in ('postcode','postal_code')
|
||||||
|
THEN
|
||||||
IF NEW.address IS NULL OR NOT NEW.address ? 'postcode' 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
|
-- most likely just a part of a multipolygon postcode boundary, throw it away
|
||||||
RETURN NULL;
|
RETURN NULL;
|
||||||
@ -419,61 +419,25 @@ BEGIN
|
|||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
IF NOT is_area THEN
|
|
||||||
NEW.rank_address := 0;
|
|
||||||
END IF;
|
|
||||||
ELSEIF NEW.class = 'boundary' AND NOT is_area THEN
|
ELSEIF NEW.class = 'boundary' AND NOT is_area THEN
|
||||||
return NULL;
|
RETURN NULL;
|
||||||
ELSEIF NEW.class = 'boundary' AND NEW.type = 'administrative'
|
ELSEIF NEW.class = 'boundary' AND NEW.type = 'administrative'
|
||||||
AND NEW.admin_level <= 4 AND NEW.osm_type = 'W' THEN
|
AND NEW.admin_level <= 4 AND NEW.osm_type = 'W'
|
||||||
return NULL;
|
THEN
|
||||||
ELSEIF NEW.osm_type = 'N' AND NEW.class = 'highway' THEN
|
RETURN NULL;
|
||||||
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
|
|
||||||
classtype = NEW.type;
|
|
||||||
END IF;
|
|
||||||
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;
|
|
||||||
|
|
||||||
IF NEW.rank_address is NULL THEN
|
|
||||||
NEW.rank_address := 30;
|
|
||||||
END IF;
|
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
-- some postcorrections
|
SELECT * INTO NEW.rank_search, NEW.rank_address
|
||||||
IF NEW.class = 'waterway' AND NEW.osm_type = 'R' THEN
|
FROM compute_place_rank(NEW.country_code, NEW.osm_type, NEW.class,
|
||||||
-- Slightly promote waterway relations so that they are processed
|
NEW.type, NEW.admin_level, is_area,
|
||||||
-- before their members.
|
(NEW.extratags->'capital') = 'yes',
|
||||||
NEW.rank_search := NEW.rank_search - 1;
|
NEW.address->'postcode');
|
||||||
|
|
||||||
|
-- a country code make no sense below rank 4 (country)
|
||||||
|
IF NEW.rank_search < 4 THEN
|
||||||
|
NEW.country_code := NULL;
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
IF (NEW.extratags -> 'capital') = 'yes' THEN
|
|
||||||
NEW.rank_search := NEW.rank_search - 1;
|
|
||||||
END IF;
|
|
||||||
|
|
||||||
END IF;
|
|
||||||
|
|
||||||
-- a country code make no sense below rank 4 (country)
|
|
||||||
IF NEW.rank_search < 4 THEN
|
|
||||||
NEW.country_code := NULL;
|
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
--DEBUG: RAISE WARNING 'placex_insert:END: % % % %',NEW.osm_type,NEW.osm_id,NEW.class,NEW.type;
|
--DEBUG: RAISE WARNING 'placex_insert:END: % % % %',NEW.osm_type,NEW.osm_id,NEW.class,NEW.type;
|
||||||
|
@ -114,3 +114,68 @@ BEGIN
|
|||||||
END;
|
END;
|
||||||
$$
|
$$
|
||||||
LANGUAGE plpgsql IMMUTABLE;
|
LANGUAGE plpgsql IMMUTABLE;
|
||||||
|
|
||||||
|
|
||||||
|
-- Get standard search and address rank for an object
|
||||||
|
CREATE OR REPLACE FUNCTION compute_place_rank(country VARCHAR(2),
|
||||||
|
osm_type VARCHAR(1),
|
||||||
|
place_class TEXT, place_type TEXT,
|
||||||
|
admin_level SMALLINT,
|
||||||
|
is_area BOOLEAN, is_major BOOLEAN,
|
||||||
|
postcode TEXT,
|
||||||
|
OUT search_rank SMALLINT,
|
||||||
|
OUT address_rank SMALLINT)
|
||||||
|
AS $$
|
||||||
|
DECLARE
|
||||||
|
classtype TEXT;
|
||||||
|
BEGIN
|
||||||
|
IF place_class in ('place','boundary')
|
||||||
|
and place_type in ('postcode','postal_code')
|
||||||
|
THEN
|
||||||
|
SELECT * INTO search_rank, address_rank
|
||||||
|
FROM get_postcode_rank(country, postcode);
|
||||||
|
|
||||||
|
IF NOT is_area THEN
|
||||||
|
address_rank := 0;
|
||||||
|
END IF;
|
||||||
|
ELSEIF osm_type = 'N' AND place_class = 'highway' THEN
|
||||||
|
search_rank = 30;
|
||||||
|
address_rank = 0;
|
||||||
|
ELSEIF place_class = 'landuse' AND NOT is_area THEN
|
||||||
|
search_rank = 30;
|
||||||
|
address_rank = 0;
|
||||||
|
ELSE
|
||||||
|
IF place_class = 'boundary' and place_type = 'administrative' THEN
|
||||||
|
classtype = place_type || admin_level::TEXT;
|
||||||
|
ELSE
|
||||||
|
classtype = place_type;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
SELECT l.rank_search, l.rank_address INTO search_rank, address_rank
|
||||||
|
FROM address_levels l
|
||||||
|
WHERE (l.country_code = country or l.country_code is NULL)
|
||||||
|
AND l.class = place_class AND (l.type = classtype or l.type is NULL)
|
||||||
|
ORDER BY l.country_code, l.class, l.type LIMIT 1;
|
||||||
|
|
||||||
|
IF search_rank is NULL THEN
|
||||||
|
search_rank := 30;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
IF address_rank is NULL THEN
|
||||||
|
address_rank := 30;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
-- some postcorrections
|
||||||
|
IF place_class = 'waterway' AND osm_type = 'R' THEN
|
||||||
|
-- Slightly promote waterway relations so that they are processed
|
||||||
|
-- before their members.
|
||||||
|
search_rank := search_rank - 1;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
IF is_major THEN
|
||||||
|
search_rank := search_rank - 1;
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
END;
|
||||||
|
$$
|
||||||
|
LANGUAGE plpgsql IMMUTABLE;
|
||||||
|
Loading…
Reference in New Issue
Block a user