From: Sarah Hoffmann Date: Thu, 16 Jun 2022 09:20:23 +0000 (+0200) Subject: use default ranks when reorganising rank_address X-Git-Tag: v4.1.0~29^2 X-Git-Url: https://git.openstreetmap.org./nominatim.git/commitdiff_plain/f833cc80df0715ced2f25626cdaa5b81efe19085 use default ranks when reorganising rank_address When shifting address ranks, the evaluation is always done against unshifted address ranks on import because the objects we compare against have not been indexed yet. This changes for updates when the object have been touched in the meantime. To ensure consistent behaviour across imports and updates, always use the unshifted address ranks. --- diff --git a/lib-sql/functions/placex_triggers.sql b/lib-sql/functions/placex_triggers.sql index a73df59c..6143a1ed 100644 --- a/lib-sql/functions/placex_triggers.sql +++ b/lib-sql/functions/placex_triggers.sql @@ -866,13 +866,16 @@ BEGIN -- Second check that the boundary is not completely contained in a -- place area with a equal or higher address rank. FOR location IN - SELECT rank_address FROM placex + SELECT rank_address + FROM placex, + LATERAL compute_place_rank(country_code, 'A', class, type, + admin_level, False, null) prank WHERE class = 'place' and rank_address < 24 - and rank_address >= NEW.rank_address + 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 and ST_Relate(geometry, NEW.geometry, 'T*T***FF*') -- contains but not equal - ORDER BY rank_address desc LIMIT 1 + ORDER BY prank.address_rank desc LIMIT 1 LOOP NEW.rank_address := location.rank_address + 2; END LOOP; @@ -884,13 +887,16 @@ BEGIN -- For place areas make sure they are not completely contained in an area -- with a equal or higher address rank. FOR location IN - SELECT rank_address FROM placex - WHERE rank_address < 24 - and rank_address >= NEW.rank_address + SELECT rank_address + FROM placex, + LATERAL compute_place_rank(country_code, 'A', class, type, + admin_level, False, null) prank + WHERE prank.address_rank < 24 + 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 and ST_Relate(geometry, NEW.geometry, 'T*T***FF*') -- contains but not equal - ORDER BY rank_address desc LIMIT 1 + ORDER BY prank.address_rank desc LIMIT 1 LOOP NEW.rank_address := location.rank_address + 2; END LOOP; @@ -901,9 +907,12 @@ BEGIN -- address level and has not been linked, then make the node a subpart -- by increasing the address rank (city level and above). FOR location IN - SELECT rank_address FROM placex + SELECT rank_address + FROM placex, + LATERAL compute_place_rank(country_code, 'A', class, type, + admin_level, False, null) prank WHERE osm_type = 'R' - and rank_address = NEW.rank_address + and prank.address_rank = NEW.rank_address and geometry && NEW.centroid and _ST_Covers(geometry, NEW.centroid) LIMIT 1 LOOP