X-Git-Url: https://git.openstreetmap.org/nominatim.git/blobdiff_plain/a0cd96e05ebad69c38f3406b40f5a6c615b40b4a..abf349fb0da9c1f08cbe17a70b3134b64c0e61c3:/lib-sql/functions/placex_triggers.sql diff --git a/lib-sql/functions/placex_triggers.sql b/lib-sql/functions/placex_triggers.sql index 70071b2f..367d2149 100644 --- a/lib-sql/functions/placex_triggers.sql +++ b/lib-sql/functions/placex_triggers.sql @@ -197,6 +197,7 @@ BEGIN SELECT place_id FROM placex WHERE bbox && geometry AND _ST_Covers(geometry, ST_Centroid(bbox)) AND rank_address between 5 and 25 + AND ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon') ORDER BY rank_address desc LOOP RETURN location.place_id; @@ -212,6 +213,7 @@ BEGIN SELECT place_id FROM placex WHERE bbox && geometry AND _ST_Covers(geometry, ST_Centroid(bbox)) AND rank_address between 5 and 25 + AND ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon') ORDER BY rank_address desc LOOP RETURN location.place_id; @@ -275,7 +277,9 @@ BEGIN -- If extratags has a place tag, look for linked nodes by their place type. -- Area and node still have to have the same name. - IF bnd.extratags ? 'place' and bnd_name is not null THEN + IF bnd.extratags ? 'place' and bnd.extratags->'place' != 'postcode' + and bnd_name is not null + THEN FOR linked_placex IN SELECT * FROM placex WHERE (position(lower(name->'name') in bnd_name) > 0 @@ -284,7 +288,6 @@ BEGIN AND placex.osm_type = 'N' AND (placex.linked_place_id is null or placex.linked_place_id = bnd.place_id) AND placex.rank_search < 26 -- needed to select the right index - AND placex.type != 'postcode' AND ST_Covers(bnd.geometry, placex.geometry) LOOP {% if debug %}RAISE WARNING 'Found type-matching place node %', linked_placex.osm_id;{% endif %} @@ -846,7 +849,8 @@ BEGIN FROM placex WHERE osm_type = 'R' and class = 'boundary' and type = 'administrative' and admin_level < NEW.admin_level and admin_level > 3 - and rank_address > 0 + and rank_address between 1 and 25 -- for index selection + and ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon') -- for index selection and geometry && NEW.centroid and _ST_Covers(geometry, NEW.centroid) ORDER BY admin_level desc LIMIT 1 LOOP @@ -874,8 +878,9 @@ BEGIN FROM placex, LATERAL compute_place_rank(country_code, 'A', class, type, admin_level, False, null) prank - WHERE class = 'place' and rank_address < 24 + WHERE class = 'place' and rank_address between 1 and 23 and prank.address_rank >= NEW.rank_address + and ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon') -- select right index and geometry && NEW.geometry and geometry ~ NEW.geometry -- needed because ST_Relate does not do bbox cover test and ST_Relate(geometry, NEW.geometry, 'T*T***FF*') -- contains but not equal @@ -896,6 +901,8 @@ BEGIN LATERAL compute_place_rank(country_code, 'A', class, type, admin_level, False, null) prank WHERE prank.address_rank < 24 + and rank_address between 1 and 25 -- select right index + and ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon') -- select right index and prank.address_rank >= NEW.rank_address and geometry && NEW.geometry and geometry ~ NEW.geometry -- needed because ST_Relate does not do bbox cover test @@ -916,7 +923,10 @@ BEGIN LATERAL compute_place_rank(country_code, 'A', class, type, admin_level, False, null) prank WHERE osm_type = 'R' - and prank.address_rank = NEW.rank_address + and rank_address between 1 and 25 -- select right index + and ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon') -- select right index + and ((class = 'place' and prank.address_rank = NEW.rank_address) + or (class = 'boundary' and rank_address = NEW.rank_address)) and geometry && NEW.centroid and _ST_Covers(geometry, NEW.centroid) LIMIT 1 LOOP @@ -955,7 +965,7 @@ BEGIN NEW.importance := null; SELECT wikipedia, importance - FROM compute_importance(NEW.extratags, NEW.country_code, NEW.osm_type, NEW.osm_id) + FROM compute_importance(NEW.extratags, NEW.country_code, NEW.rank_search, NEW.centroid) INTO NEW.wikipedia,NEW.importance; {% if debug %}RAISE WARNING 'Importance computed from wikipedia: %', NEW.importance;{% endif %} @@ -1037,7 +1047,7 @@ BEGIN IF linked_place is not null THEN -- Recompute the ranks here as the ones from the linked place might -- have been shifted to accommodate surrounding boundaries. - SELECT place_id, osm_id, class, type, extratags, + SELECT place_id, osm_id, class, type, extratags, rank_search, centroid, geometry, (compute_place_rank(country_code, osm_type, class, type, admin_level, (extratags->'capital') = 'yes', null)).* @@ -1078,7 +1088,7 @@ BEGIN SELECT wikipedia, importance FROM compute_importance(location.extratags, NEW.country_code, - 'N', location.osm_id) + location.rank_search, NEW.centroid) INTO linked_wikipedia,linked_importance; -- Use the maximum importance if one could be computed from the linked object. @@ -1101,6 +1111,15 @@ BEGIN END IF; END IF; + {% if not disable_diff_updates %} + IF OLD.rank_address != NEW.rank_address THEN + -- After a rank shift all addresses containing us must be updated. + UPDATE placex p SET indexed_status = 2 FROM place_addressline pa + WHERE pa.address_place_id = NEW.place_id and p.place_id = pa.place_id + and p.indexed_status = 0 and p.rank_address between 4 and 25; + END IF; + {% endif %} + IF NEW.admin_level = 2 AND NEW.class = 'boundary' AND NEW.type = 'administrative' AND NEW.country_code IS NOT NULL AND NEW.osm_type = 'R'