-- First, check that admin boundaries do not overtake each other rank-wise.
parent_address_level := 3;
FOR location IN
- SELECT rank_address, extratags FROM placex
+ SELECT rank_address,
+ (CASE WHEN extratags ? 'wikidata' and NEW.extratags ? 'wikidata'
+ and extratags->'wikidata' = NEW.extratags->'wikidata'
+ THEN ST_Equals(geometry, NEW.geometry)
+ ELSE false END) as is_same
+ 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 ST_Covers(geometry, NEW.geometry)
+ and geometry && NEW.centroid and _ST_Covers(geometry, NEW.centroid)
ORDER BY admin_level desc LIMIT 1
LOOP
- IF location.extratags ? 'wikidata' and NEW.extratags ? 'wikidata'
- and location.extratags->'wikidata' = NEW.extratags->'wikidata'
- THEN
+ IF location.is_same THEN
-- Looks like the same boundary is replicated on multiple admin_levels.
-- Usual tagging in Poland. Remove our boundary from addresses.
NEW.rank_address := 0;
| R21 | R20 | 16 |
| R22 | R20 | 16 |
+ Scenario: Admin levels cannot overtake each other due to place address ranks even when slightly misaligned
+ Given the named places
+ | osm | class | type | admin | extra+place | geometry |
+ | R20 | boundary | administrative | 6 | town | (0 0, 0 2, 2 2, 2 0, 0 0) |
+ | R21 | boundary | administrative | 8 | | (0 0, -0.0001 1, 1 1, 1 0, 0 0) |
+ When importing
+ Then placex contains
+ | object | rank_search | rank_address |
+ | R20 | 12 | 16 |
+ | R21 | 16 | 18 |
+ Then place_addressline contains
+ | object | address | cached_rank_address |
+ | R21 | R20 | 16 |
+
Scenario: Admin levels must not be larger than 25
Given the named places
| osm | class | type | admin | extra+place | geometry |