forked from hans/Nominatim
reset address and search ranks on update
With ranks being dynamically changed through linking of places, it is important to reset the ranks on update, so that changes of the rank due to changes in linking are correctly taken into account.
This commit is contained in:
@@ -392,7 +392,6 @@ DECLARE
|
|||||||
country_code VARCHAR(2);
|
country_code VARCHAR(2);
|
||||||
diameter FLOAT;
|
diameter FLOAT;
|
||||||
classtable TEXT;
|
classtable TEXT;
|
||||||
classtype TEXT;
|
|
||||||
BEGIN
|
BEGIN
|
||||||
--DEBUG: RAISE WARNING '% % % %',NEW.osm_type,NEW.osm_id,NEW.class,NEW.type;
|
--DEBUG: RAISE WARNING '% % % %',NEW.osm_type,NEW.osm_id,NEW.class,NEW.type;
|
||||||
|
|
||||||
@@ -428,8 +427,9 @@ BEGIN
|
|||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
SELECT * INTO NEW.rank_search, NEW.rank_address
|
SELECT * INTO NEW.rank_search, NEW.rank_address
|
||||||
FROM compute_place_rank(NEW.country_code, NEW.osm_type, NEW.class,
|
FROM compute_place_rank(NEW.country_code,
|
||||||
NEW.type, NEW.admin_level, is_area,
|
CASE WHEN is_area THEN 'A' ELSE NEW.osm_type END,
|
||||||
|
NEW.class, NEW.type, NEW.admin_level,
|
||||||
(NEW.extratags->'capital') = 'yes',
|
(NEW.extratags->'capital') = 'yes',
|
||||||
NEW.address->'postcode');
|
NEW.address->'postcode');
|
||||||
|
|
||||||
@@ -552,6 +552,17 @@ BEGIN
|
|||||||
RETURN NEW;
|
RETURN NEW;
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
|
-- recompute the ranks, they might change when linking changes
|
||||||
|
SELECT * INTO NEW.rank_search, NEW.rank_address
|
||||||
|
FROM compute_place_rank(NEW.country_code,
|
||||||
|
CASE WHEN ST_GeometryType(NEW.geometry)
|
||||||
|
IN ('ST_Polygon','ST_MultiPolygon')
|
||||||
|
THEN 'A' ELSE NEW.osm_type END,
|
||||||
|
NEW.class, NEW.type, NEW.admin_level,
|
||||||
|
(NEW.extratags->'capital') = 'yes',
|
||||||
|
NEW.address->'postcode');
|
||||||
|
|
||||||
|
|
||||||
--DEBUG: RAISE WARNING 'Copy over address tags';
|
--DEBUG: RAISE WARNING 'Copy over address tags';
|
||||||
-- housenumber is a computed field, so start with an empty value
|
-- housenumber is a computed field, so start with an empty value
|
||||||
NEW.housenumber := NULL;
|
NEW.housenumber := NULL;
|
||||||
|
|||||||
@@ -116,12 +116,23 @@ $$
|
|||||||
LANGUAGE plpgsql IMMUTABLE;
|
LANGUAGE plpgsql IMMUTABLE;
|
||||||
|
|
||||||
|
|
||||||
-- Get standard search and address rank for an object
|
-- Get standard search and address rank for an object.
|
||||||
|
--
|
||||||
|
-- \param country Two-letter country code where the object is in.
|
||||||
|
-- \param extended_type OSM type (N, W, R) or area type (A).
|
||||||
|
-- \param place_class Class (or tag key) of object.
|
||||||
|
-- \param place_type Type (or tag value) of object.
|
||||||
|
-- \param admin_level Value of admin_level tag.
|
||||||
|
-- \param is_major If true, boost search rank by one.
|
||||||
|
-- \param postcode Value of addr:postcode tag.
|
||||||
|
-- \param[out] search_rank Computed search rank.
|
||||||
|
-- \param[out] address_rank Computed address rank.
|
||||||
|
--
|
||||||
CREATE OR REPLACE FUNCTION compute_place_rank(country VARCHAR(2),
|
CREATE OR REPLACE FUNCTION compute_place_rank(country VARCHAR(2),
|
||||||
osm_type VARCHAR(1),
|
extended_type VARCHAR(1),
|
||||||
place_class TEXT, place_type TEXT,
|
place_class TEXT, place_type TEXT,
|
||||||
admin_level SMALLINT,
|
admin_level SMALLINT,
|
||||||
is_area BOOLEAN, is_major BOOLEAN,
|
is_major BOOLEAN,
|
||||||
postcode TEXT,
|
postcode TEXT,
|
||||||
OUT search_rank SMALLINT,
|
OUT search_rank SMALLINT,
|
||||||
OUT address_rank SMALLINT)
|
OUT address_rank SMALLINT)
|
||||||
@@ -135,13 +146,13 @@ BEGIN
|
|||||||
SELECT * INTO search_rank, address_rank
|
SELECT * INTO search_rank, address_rank
|
||||||
FROM get_postcode_rank(country, postcode);
|
FROM get_postcode_rank(country, postcode);
|
||||||
|
|
||||||
IF NOT is_area THEN
|
IF NOT extended_type = 'A' THEN
|
||||||
address_rank := 0;
|
address_rank := 0;
|
||||||
END IF;
|
END IF;
|
||||||
ELSEIF osm_type = 'N' AND place_class = 'highway' THEN
|
ELSEIF extended_type = 'N' AND place_class = 'highway' THEN
|
||||||
search_rank = 30;
|
search_rank = 30;
|
||||||
address_rank = 0;
|
address_rank = 0;
|
||||||
ELSEIF place_class = 'landuse' AND NOT is_area THEN
|
ELSEIF place_class = 'landuse' AND extended_type != 'A' THEN
|
||||||
search_rank = 30;
|
search_rank = 30;
|
||||||
address_rank = 0;
|
address_rank = 0;
|
||||||
ELSE
|
ELSE
|
||||||
@@ -166,7 +177,7 @@ BEGIN
|
|||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
-- some postcorrections
|
-- some postcorrections
|
||||||
IF place_class = 'waterway' AND osm_type = 'R' THEN
|
IF place_class = 'waterway' AND extended_type = 'R' THEN
|
||||||
-- Slightly promote waterway relations so that they are processed
|
-- Slightly promote waterway relations so that they are processed
|
||||||
-- before their members.
|
-- before their members.
|
||||||
search_rank := search_rank - 1;
|
search_rank := search_rank - 1;
|
||||||
|
|||||||
Reference in New Issue
Block a user