From: Sarah Hoffmann Date: Tue, 22 Sep 2020 14:34:28 +0000 (+0200) Subject: use rank_address when invalidating containing objects X-Git-Tag: v3.6.0~66^2 X-Git-Url: https://git.openstreetmap.org./nominatim.git/commitdiff_plain/d9325dc11a79fc3585de487e9e42ecd7829dc0c2 use rank_address when invalidating containing objects Only rank_address is now relevant for determining if a place could be part of an address. --- diff --git a/sql/functions/placex_triggers.sql b/sql/functions/placex_triggers.sql index 76b1bf1a..ad0f041d 100644 --- a/sql/functions/placex_triggers.sql +++ b/sql/functions/placex_triggers.sql @@ -450,11 +450,16 @@ BEGIN -- mark items within the geometry for re-indexing -- RAISE WARNING 'placex poly insert: % % % %',NEW.osm_type,NEW.osm_id,NEW.class,NEW.type; - -- work around bug in postgis, this may have been fixed in 2.0.0 (see http://trac.osgeo.org/postgis/ticket/547) - update placex set indexed_status = 2 where ST_Intersects(NEW.geometry, placex.geometry) - AND rank_search > NEW.rank_search and indexed_status = 0 and ST_geometrytype(placex.geometry) = 'ST_Point' and (rank_search < 28 or name is not null or (NEW.rank_search >= 16 and address ? 'place')); - update placex set indexed_status = 2 where ST_Intersects(NEW.geometry, placex.geometry) - AND rank_search > NEW.rank_search and indexed_status = 0 and ST_geometrytype(placex.geometry) != 'ST_Point' and (rank_search < 28 or name is not null or (NEW.rank_search >= 16 and address ? 'place')); + UPDATE placex SET indexed_status = 2 + WHERE ST_Intersects(NEW.geometry, placex.geometry) + and indexed_status = 0 + and ((rank_address = 0 and rank_search > NEW.rank_address) + or rank_address > NEW.rank_address + or (class = 'place' and osm_type = 'N') + ) + and (rank_search < 28 + or name is not null + or (NEW.rank_address >= 16 and address ? 'place')); END IF; ELSE -- mark nearby items for re-indexing, where 'nearby' depends on the features rank_search and is a complete guess :( diff --git a/sql/functions/utils.sql b/sql/functions/utils.sql index 0cd793ee..9f8d3988 100644 --- a/sql/functions/utils.sql +++ b/sql/functions/utils.sql @@ -470,14 +470,20 @@ DECLARE rank SMALLINT; BEGIN UPDATE placex SET indexed_status = 2 WHERE place_id = placeid; - SELECT geometry, rank_search FROM placex WHERE place_id = placeid INTO placegeom, rank; + + SELECT geometry, rank_address INTO placegeom, rank + FROM placex WHERE place_id = placeid; + IF placegeom IS NOT NULL AND ST_IsValid(placegeom) THEN - IF ST_GeometryType(placegeom) in ('ST_Polygon','ST_MultiPolygon') THEN - FOR geom IN select split_geometry(placegeom) FROM placex WHERE place_id = placeid LOOP - update placex set indexed_status = 2 where ST_Intersects(geom, placex.geometry) - AND rank_search > rank and indexed_status = 0 and ST_geometrytype(placex.geometry) = 'ST_Point' and (rank_search < 28 or name is not null or (rank >= 16 and address ? 'place')); - update placex set indexed_status = 2 where ST_Intersects(geom, placex.geometry) - AND rank_search > rank and indexed_status = 0 and ST_geometrytype(placex.geometry) != 'ST_Point' and (rank_search < 28 or name is not null or (rank >= 16 and address ? 'place')); + IF ST_GeometryType(placegeom) in ('ST_Polygon','ST_MultiPolygon') + AND rank > 0 + THEN + FOR geom IN SELECT split_geometry(placegeom) LOOP + UPDATE placex SET indexed_status = 2 + WHERE ST_Intersects(geom, placex.geometry) + and indexed_status = 0 + and ((rank_address = 0 and rank_search > rank) or rank_address > rank) + and (rank_search < 28 or name is not null or (rank >= 16 and address ? 'place')); END LOOP; ELSE diameter := update_place_diameter(rank);