Merge pull request #1919 from lonvia/tests-for-ranking

More tests and fixes for address rank computation
This commit is contained in:
Sarah Hoffmann 2020-08-13 09:13:10 +02:00 committed by GitHub
commit 1b484fa90d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 136 additions and 69 deletions

View File

@ -534,6 +534,7 @@ DECLARE
centroid GEOMETRY; centroid GEOMETRY;
parent_address_level SMALLINT; parent_address_level SMALLINT;
place_address_level SMALLINT;
addr_street TEXT; addr_street TEXT;
addr_place TEXT; addr_place TEXT;
@ -591,7 +592,11 @@ BEGIN
IF NEW.class = 'boundary' and NEW.type = 'administrative' THEN IF NEW.class = 'boundary' and NEW.type = 'administrative' THEN
parent_address_level := get_parent_address_level(NEW.geometry, NEW.admin_level); parent_address_level := get_parent_address_level(NEW.geometry, NEW.admin_level);
IF parent_address_level >= NEW.rank_address THEN IF parent_address_level >= NEW.rank_address THEN
NEW.rank_address := parent_address_level + 2; IF parent_address_level >= 24 THEN
NEW.rank_address := 25;
ELSE
NEW.rank_address := parent_address_level + 2;
END IF;
END IF; END IF;
ELSE ELSE
parent_address_level := 3; parent_address_level := 3;
@ -828,6 +833,18 @@ BEGIN
THEN THEN
NEW.importance = linked_importance; NEW.importance = linked_importance;
END IF; END IF;
ELSE
-- No linked place? As a last resort check if the boundary is tagged with
-- a place type and adapt the rank address.
IF NEW.rank_address > 0 and NEW.extratags ? 'place' THEN
SELECT address_rank INTO place_address_level
FROM compute_place_rank(NEW.country_code, 'A', 'place',
NEW.extratags->'place', 0::SMALLINT, False, null);
IF place_address_level > parent_address_level and
place_address_level < 26 THEN
NEW.rank_address := place_address_level;
END IF;
END IF;
END IF; END IF;
-- Initialise the name vector using our name -- Initialise the name vector using our name
@ -844,7 +861,9 @@ BEGIN
END IF; END IF;
SELECT * FROM insert_addresslines(NEW.place_id, NEW.partition, SELECT * FROM insert_addresslines(NEW.place_id, NEW.partition,
NEW.rank_search, NEW.address, CASE WHEN NEW.rank_address = 0
THEN NEW.rank_search ELSE NEW.rank_address END,
NEW.address,
CASE WHEN NEW.rank_search >= 26 CASE WHEN NEW.rank_search >= 26
AND NEW.rank_search < 30 AND NEW.rank_search < 30
THEN NEW.geometry ELSE NEW.centroid END) THEN NEW.geometry ELSE NEW.centroid END)

View File

@ -125,73 +125,6 @@ Feature: Import into placex
| N8 | ca | 25 | 0 | | N8 | ca | 25 | 0 |
| N9 | ca | 25 | 0 | | N9 | ca | 25 | 0 |
Scenario: search and address ranks for places are correctly assigned
Given the named places
| osm | class | type |
| N1 | foo | bar |
| N11 | place | Continent |
| N12 | place | continent |
| N13 | place | sea |
| N14 | place | country |
| N15 | place | state |
| N16 | place | region |
| N17 | place | county |
| N18 | place | city |
| N19 | place | island |
| N20 | place | town |
| N21 | place | village |
| N22 | place | hamlet |
| N23 | place | municipality |
| N24 | place | district |
| N26 | place | borough |
| N27 | place | suburb |
| N28 | place | croft |
| N29 | place | subdivision |
| N30 | place | isolated_dwelling |
| N31 | place | farm |
| N32 | place | locality |
| N33 | place | islet |
| N34 | place | mountain_pass |
| N35 | place | neighbourhood |
| N36 | place | house |
| N37 | place | building |
| N38 | place | houses |
And the named places
| osm | class | type | extra+capital |
| N101 | place | city | yes |
When importing
Then placex contains
| object | rank_search | rank_address |
| N1 | 30 | 30 |
| N11 | 30 | 30 |
| N12 | 2 | 0 |
| N13 | 2 | 0 |
| N14 | 4 | 0 |
| N15 | 8 | 0 |
| N16 | 18 | 0 |
| N17 | 12 | 12 |
| N18 | 16 | 16 |
| N19 | 17 | 0 |
| N20 | 18 | 16 |
| N21 | 19 | 16 |
| N22 | 20 | 20 |
| N23 | 14 | 14 |
| N24 | 19 | 16 |
| N26 | 18 | 18 |
| N27 | 19 | 20 |
| N28 | 20 | 20 |
| N29 | 20 | 20 |
| N30 | 22 | 20 |
| N31 | 20 | 0 |
| N32 | 20 | 0 |
| N33 | 20 | 0 |
| N34 | 20 | 0 |
| N101 | 15 | 16 |
| N35 | 20 | 22 |
| N36 | 30 | 30 |
| N37 | 30 | 30 |
| N38 | 28 | 0 |
Scenario: search and address ranks for boundaries are correctly assigned Scenario: search and address ranks for boundaries are correctly assigned
Given the named places Given the named places
| osm | class | type | | osm | class | type |

View File

@ -0,0 +1,115 @@
@DB
Feature: Rank assignment
Tests for assignment of search and address ranks.
Scenario: Ranks for place nodes are assinged according to thier type
Given the named places
| osm | class | type |
| N1 | foo | bar |
| N11 | place | Continent |
| N12 | place | continent |
| N13 | place | sea |
| N14 | place | country |
| N15 | place | state |
| N16 | place | region |
| N17 | place | county |
| N18 | place | city |
| N19 | place | island |
| N36 | place | house |
| N38 | place | houses |
And the named places
| osm | class | type | extra+capital |
| N101 | place | city | yes |
When importing
Then placex contains
| object | rank_search | rank_address |
| N1 | 30 | 30 |
| N11 | 30 | 30 |
| N12 | 2 | 0 |
| N13 | 2 | 0 |
| N14 | 4 | 0 |
| N15 | 8 | 0 |
| N16 | 18 | 0 |
| N17 | 12 | 12 |
| N18 | 16 | 16 |
| N19 | 17 | 0 |
| N101 | 15 | 16 |
| N36 | 30 | 30 |
| N38 | 28 | 0 |
Scenario: Ranks for boundaries are assigned according to admin level
Given the named places
| osm | class | type | admin | geometry |
| R20 | boundary | administrative | 2 | (1 1, 2 2, 1 2, 1 1) |
| R21 | boundary | administrative | 32 | (3 3, 4 4, 3 4, 3 3) |
| R22 | boundary | administrative | 6 | (0 0, 1 0, 0 1, 0 0) |
| R23 | boundary | administrative | 10 | (0 0, 1 1, 1 0, 0 0) |
When importing
Then placex contains
| object | rank_search | rank_address |
| R20 | 4 | 4 |
| R21 | 30 | 30 |
| R22 | 12 | 12 |
| R23 | 20 | 20 |
Scenario: Ranks for boundaries with place assignment go with place address ranks if available
Given the named places
| osm | class | type | admin | extra+place | geometry |
| R20 | boundary | administrative | 3 | state | (1 1, 2 2, 1 2, 1 1) |
| R21 | boundary | administrative | 32 | suburb | (3 3, 4 4, 3 4, 3 3) |
| R22 | boundary | administrative | 6 | town | (0 0, 1 0, 0 1, 0 0) |
| R23 | boundary | administrative | 10 | village | (0 0, 1 1, 1 0, 0 0) |
When importing
Then placex contains
| object | rank_search | rank_address |
| R20 | 6 | 6 |
| R21 | 30 | 20 |
| R22 | 12 | 16 |
| R23 | 20 | 16 |
Scenario: Place address ranks cannot overtake a parent address rank
Given the named places
| osm | class | type | admin | extra+place | geometry |
| R20 | boundary | administrative | 8 | town | (0 0, 0 2, 2 2, 2 0, 0 0) |
| R21 | boundary | administrative | 9 | municipality | (0 0, 0 1, 1 1, 1 0, 0 0) |
| R22 | boundary | administrative | 9 | suburb | (0 0, 0 1, 1 1, 1 0, 0 0) |
When importing
Then place_addressline contains
| object | address | cached_rank_address |
| R21 | R20 | 16 |
| R22 | R20 | 16 |
Then placex contains
| object | rank_search | rank_address |
| R20 | 16 | 16 |
| R21 | 18 | 18 |
| R22 | 18 | 20 |
Scenario: Admin levels cannot overtake each other due to place address ranks
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 1, 1 1, 1 0, 0 0) |
| R22 | boundary | administrative | 8 | suburb | (0 0, 0 1, 1 1, 1 0, 0 0) |
When importing
Then placex contains
| object | rank_search | rank_address |
| R20 | 12 | 16 |
| R21 | 16 | 18 |
| R22 | 16 | 20 |
Then place_addressline contains
| object | address | cached_rank_address |
| R21 | R20 | 16 |
| R22 | R20 | 16 |
Scenario: Admin levels must not be larger than 25
Given the named places
| osm | class | type | admin | extra+place | geometry |
| R20 | boundary | administrative | 6 | neighbourhood | (0 0, 0 2, 2 2, 2 0, 0 0) |
| R21 | boundary | administrative | 7 | | (0 0, 0 1, 1 1, 1 0, 0 0) |
| R22 | boundary | administrative | 8 | | (0 0, 0 0.5, 0.5 0.5, 0.5 0, 0 0) |
When importing
Then placex contains
| object | rank_search | rank_address |
| R20 | 12 | 22 |
| R21 | 14 | 24 |
| R22 | 16 | 25 |