Merge pull request #4012 from lonvia/interpolation-separation

Move interpolations into a separate table
This commit is contained in:
Sarah Hoffmann
2026-03-04 17:27:02 +01:00
committed by GitHub
34 changed files with 799 additions and 680 deletions

View File

@@ -241,8 +241,8 @@ Feature: Address computation
Scenario: buildings with only addr:postcodes do not appear in the address of a way
Given the grid with origin DE
| 1 | | | | | 8 | | 6 | | 2 |
| |10 |11 | | | | | | | |
| |13 |12 | | | | | | | |
| | | | | | | | | | |
| |13 | | | | | | | | |
| 20| | | 21| | | | | | |
| | | | | | | | | | |
| | | | | | 9 | | | | |
@@ -255,9 +255,9 @@ Feature: Address computation
And the named places
| osm | class | type | geometry |
| W93 | highway | residential | 20,21 |
And the places
| osm | class | type | addr+postcode | geometry |
| W22 | place | postcode | 11234 | (10,11,12,13,10) |
And the postcodes
| osm | postcode | centroid |
| W22 | 11234 | 13 |
When importing
Then place_addressline contains exactly
| object | address |

View File

@@ -8,12 +8,9 @@ Feature: Import of address interpolations
| osm | class | type | housenr |
| N1 | place | house | 2 |
| N2 | place | house | 6 |
And the places
| osm | class | type | addr+interpolation | geometry |
| W1 | place | houses | even | 1,2 |
And the ways
| id | nodes |
| 1 | 1,2 |
And the interpolations
| osm | type | geometry | nodes |
| W1 | even | 1,2 | 1,2 |
When importing
Then W1 expands to no interpolation
@@ -25,15 +22,12 @@ Feature: Import of address interpolations
| osm | class | type | housenr |
| N1 | place | house | 2 |
| N2 | place | house | 6 |
And the places
| osm | class | type | addr+interpolation | geometry |
| W1 | place | houses | even | 1,2 |
And the interpolations
| osm | type | geometry | nodes |
| W1 | even | 1,2 | 1,2 |
And the named places
| osm | class | type | geometry |
| W10 | highway | residential | 4,5 |
And the ways
| id | nodes |
| 1 | 1,2 |
When importing
Then W1 expands to interpolation
| start | end | geometry |
@@ -47,15 +41,12 @@ Feature: Import of address interpolations
| osm | class | type | housenr |
| N1 | place | house | 2 |
| N2 | place | house | 8 |
And the places
| osm | class | type | addr+interpolation | geometry |
| W1 | place | houses | even | 2,1 |
And the interpolations
| osm | type | geometry | nodes |
| W1 | even | 2,1 | 2,1 |
And the named places
| osm | class | type | geometry |
| W10 | highway | residential | 4,5 |
And the ways
| id | nodes |
| 1 | 2,1 |
When importing
Then W1 expands to interpolation
| start | end | geometry |
@@ -69,15 +60,12 @@ Feature: Import of address interpolations
| osm | class | type | housenr |
| N1 | place | house | 1 |
| N2 | place | house | 11 |
And the places
| osm | class | type | addr+interpolation | geometry |
| W1 | place | houses | odd | 1,2 |
And the interpolations
| osm | type | geometry | nodes |
| W1 | odd | 1,2 | 1,2 |
And the named places
| osm | class | type | geometry |
| W10 | highway | residential | 4,5 |
And the ways
| id | nodes |
| 1 | 1,2 |
When importing
Then W1 expands to interpolation
| start | end | geometry |
@@ -91,15 +79,12 @@ Feature: Import of address interpolations
| osm | class | type | housenr |
| N1 | place | house | 1 |
| N2 | place | house | 4 |
And the places
| osm | class | type | addr+interpolation | geometry |
| W1 | place | houses | all | 1,2 |
And the interpolations
| osm | type | geometry | nodes |
| W1 | all | 1,2 | 1,2 |
And the named places
| osm | class | type | geometry |
| W10 | highway | residential | 4,5 |
And the ways
| id | nodes |
| 1 | 1,2 |
When importing
Then W1 expands to interpolation
| start | end | geometry |
@@ -113,15 +98,12 @@ Feature: Import of address interpolations
| osm | class | type | housenr |
| N1 | place | house | 2 |
| N2 | place | house | 12 |
And the places
| osm | class | type | addr+interpolation | geometry |
| W1 | place | houses | even | 1,3,2 |
And the interpolations
| osm | type | geometry | nodes |
| W1 | even | 1,3,2 | 1,3,2 |
And the named places
| osm | class | type | geometry |
| W10 | highway | residential | 4,5 |
And the ways
| id | nodes |
| 1 | 1,3,2 |
When importing
Then W1 expands to interpolation
| start | end | geometry |
@@ -135,15 +117,12 @@ Feature: Import of address interpolations
| osm | class | type | housenr |
| N1 | place | house | 2 |
| N2 | place | house | 10 |
And the places
| osm | class | type | addr+interpolation | geometry |
| W1 | place | houses | even | 1,3,2 |
And the interpolations
| osm | type | geometry | nodes |
| W1 | even | 1,3,2 | 1,3,3,2 |
And the named places
| osm | class | type | geometry |
| W10 | highway | residential | 4,5 |
And the ways
| id | nodes |
| 1 | 1,3,3,2 |
When importing
Then W1 expands to interpolation
| start | end | geometry |
@@ -158,15 +137,12 @@ Feature: Import of address interpolations
| N1 | place | house | 2 |
| N2 | place | house | 14 |
| N3 | place | house | 10 |
And the places
| osm | class | type | addr+interpolation | geometry |
| W1 | place | houses | even | 1,3,2 |
And the interpolations
| osm | type | geometry | nodes |
| W1 | even | 1,3,2 | 1,3,2 |
And the named places
| osm | class | type | geometry |
| W10 | highway | residential | 4,5 |
And the ways
| id | nodes |
| 1 | 1,3,2 |
When importing
Then W1 expands to interpolation
| start | end | geometry |
@@ -184,15 +160,12 @@ Feature: Import of address interpolations
| N2 | place | house | 14 |
| N3 | place | house | 10 |
| N4 | place | house | 18 |
And the places
| osm | class | type | addr+interpolation | geometry |
| W1 | place | houses | even | 1,3,2,4 |
And the interpolations
| osm | type | geometry | nodes |
| W1 | even | 1,3,2,4 | 1,3,2,4 |
And the named places
| osm | class | type | geometry |
| W10 | highway | residential | 1,3,2,4 |
And the ways
| id | nodes |
| 1 | 1,3,2,4 |
When importing
Then W1 expands to interpolation
| start | end | geometry |
@@ -209,15 +182,12 @@ Feature: Import of address interpolations
| N1 | place | house | 2 |
| N2 | place | house | 14 |
| N3 | place | house | 10 |
And the places
| osm | class | type | addr+interpolation | geometry |
| W1 | place | houses | even | 2,3,1 |
And the interpolations
| osm | type | geometry | nodes |
| W1 | even | 2,3,1 | 2,3,1 |
And the named places
| osm | class | type | geometry |
| W10 | highway | residential | 4,5 |
And the ways
| id | nodes |
| 1 | 2,3,1 |
When importing
Then W1 expands to interpolation
| start | end | geometry |
@@ -233,15 +203,12 @@ Feature: Import of address interpolations
| N1 | place | house | 2 |
| N2 | place | house | 8 |
| N3 | place | house | 7 |
And the places
| osm | class | type | addr+interpolation | geometry |
| W1 | place | houses | even | 1,3,2 |
And the interpolations
| osm | type | geometry | nodes |
| W1 | even | 1,3,2 | 1,3,2 |
And the named places
| osm | class | type | geometry |
| W10 | highway | residential | 4,5 |
And the ways
| id | nodes |
| 1 | 1,3,2 |
When importing
Then W1 expands to interpolation
| start | end | geometry |
@@ -257,15 +224,12 @@ Feature: Import of address interpolations
| N1 | place | house | 2 |
| N2 | place | house | 6 |
| N3 | place | house | 10 |
And the places
| osm | class | type | addr+interpolation | geometry |
| W1 | place | houses | even | 1,2,3,2 |
And the interpolations
| osm | type | geometry | nodes |
| W1 | even | 1,2,3,2 | 1,2,3,2 |
And the named places
| osm | class | type | geometry |
| W10 | highway | residential | 1,2,3 |
And the ways
| id | nodes |
| 1 | 1,2,3,2 |
When importing
Then W1 expands to interpolation
| start | end | geometry |
@@ -281,15 +245,12 @@ Feature: Import of address interpolations
| osm | class | type | housenr |
| N1 | place | house | 2 |
| N2 | place | house | 6 |
And the places
| osm | class | type | addr+interpolation | geometry |
| W1 | place | houses | even | 1,2,3,2 |
And the interpolations
| osm | type | geometry | nodes |
| W1 | even | 1,2,3,2 | 1,2,3,2 |
And the named places
| osm | class | type | geometry |
| W10 | highway | residential | 1,2,3 |
And the ways
| id | nodes |
| 1 | 1,2,3,2 |
When importing
Then W1 expands to interpolation
| start | end | geometry |
@@ -306,18 +267,14 @@ Feature: Import of address interpolations
| N2 | place | house | 6 | 2 |
| N3 | place | house | 12 | 1 |
| N4 | place | house | 16 | 2 |
And the places
| osm | class | type | addr+interpolation | street | geometry |
| W10 | place | houses | even | | 1,2 |
| W11 | place | houses | even | Cloud Street | 1,2 |
And the interpolations
| osm | type | street | nodes | geometry | nodes |
| W10 | even | | 1,2 | 1,2 | 1,2 |
| W11 | even | Cloud Street | 3,4 | 1,2 | 3,4 |
And the places
| osm | class | type | name | geometry |
| W2 | highway | tertiary | Sun Way | 10,11 |
| W3 | highway | tertiary | Cloud Street | 20,21 |
And the ways
| id | nodes |
| 10 | 1,2 |
| 11 | 3,4 |
When importing
Then placex contains
| object | parent_place_id |
@@ -351,18 +308,14 @@ Feature: Import of address interpolations
| N2 | place | house | 6 | | 2 |
| N3 | place | house | 12 | Cloud Street | 1 |
| N4 | place | house | 16 | Cloud Street | 2 |
And the places
| osm | class | type | addr+interpolation | geometry |
| W10 | place | houses | even | 1,2 |
| W11 | place | houses | even | 1,2 |
And the interpolations
| osm | type | geometry | nodes |
| W10 | even | 1,2 | 1,2 |
| W11 | even | 1,2 | 3,4 |
And the places
| osm | class | type | name | geometry |
| W2 | highway | tertiary | Sun Way | 10,11 |
| W3 | highway | tertiary | Cloud Street | 20,21 |
And the ways
| id | nodes |
| 10 | 1,2 |
| 11 | 3,4 |
When importing
Then placex contains
| object | parent_place_id |
@@ -391,15 +344,12 @@ Feature: Import of address interpolations
| N1 | place | house | 10 | 144.9632341 -37.76163 |
| N2 | place | house | 6 | 144.9630541 -37.7628174 |
| N3 | shop | supermarket | 2 | 144.9629794 -37.7630755 |
And the places
| osm | class | type | addr+interpolation | geometry |
| W1 | place | houses | even | 144.9632341 -37.76163,144.9630541 -37.7628172,144.9629794 -37.7630755 |
And the interpolations
| osm | type | geometry | nodes |
| W1 | even | 144.9632341 -37.76163,144.9630541 -37.7628172,144.9629794 -37.7630755 | 1,2,3 |
And the named places
| osm | class | type | geometry |
| W10 | highway | residential | 144.9632341 -37.76163,144.9629794 -37.7630755 |
And the ways
| id | nodes |
| 1 | 1,2,3 |
When importing
Then W1 expands to interpolation
| start | end | geometry |
@@ -415,24 +365,21 @@ Feature: Import of address interpolations
| N1 | place | house | 23 |
| N2 | amenity | school | |
| N3 | place | house | 29 |
And the places
| osm | class | type | addr+interpolation | geometry |
| W1 | place | houses | odd | 1,2,3 |
And the interpolations
| osm | type | geometry | nodes |
| W1 | odd | 1,2,3 | 1,2,3 |
And the named places
| osm | class | type | geometry |
| W10 | highway | residential | 4,5 |
And the ways
| id | nodes |
| 1 | 1,2,3 |
When importing
Then W1 expands to interpolation
| start | end | geometry |
| 25 | 27 | 0.0000166 0,0.00002 0,0.0000333 0 |
Scenario: Ways without node entries are ignored
Given the places
| osm | class | type | housenr | geometry |
| W1 | place | houses | even | 1 1, 1 1.001 |
Given the interpolations
| osm | type | geometry | nodes |
| W1 | even | 1 1, 1 1.001 | 34,45 |
And the named places
| osm | class | type | geometry |
| W10 | highway | residential | 1 1, 1 1.001 |
@@ -447,9 +394,9 @@ Feature: Import of address interpolations
| osm | class | type |
| N1 | place | house |
| N2 | place | house |
Given the places
| osm | class | type | housenr | geometry |
| W1 | place | houses | even | 1,2 |
Given the interpolations
| osm | type | geometry | nodes |
| W1 | even | 1,2 | 1,2 |
And the named places
| osm | class | type | geometry |
| W10 | highway | residential | 4,5 |
@@ -464,15 +411,12 @@ Feature: Import of address interpolations
| osm | class | type | housenr |
| N1 | place | house | 0 |
| N2 | place | house | 10 |
And the places
| osm | class | type | addr+interpolation | geometry |
| W1 | place | houses | even | 1,2 |
And the interpolations
| osm | type | geometry | nodes |
| W1 | even | 1,2 | 1,2 |
And the places
| osm | class | type | name | geometry |
| W10 | highway | residential | London Road |4,5 |
And the ways
| id | nodes |
| 1 | 1,2 |
When importing
Then W1 expands to interpolation
| start | end | geometry |
@@ -497,12 +441,9 @@ Feature: Import of address interpolations
| osm | class | type | name | geometry |
| W1 | highway | residential | Vert St | 1,2 |
| W2 | highway | residential | Horiz St | 2,3 |
And the places
| osm | class | type | addr+interpolation | addr+inclusion | geometry |
| W10 | place | houses | even | actual | 8,9 |
And the ways
| id | nodes |
| 10 | 8,9 |
And the interpolations
| osm | type | addr+inclusion | geometry | nodes |
| W10 | even | actual | 8,9 | 8,9 |
When importing
Then placex contains
| object | parent_place_id |
@@ -521,15 +462,12 @@ Feature: Import of address interpolations
| osm | class | type | housenr |
| N1 | place | house | 2 |
| N2 | place | house | 6 |
And the places
| osm | class | type | addr+interpolation | geometry |
| W1 | place | houses | <value> | 1,2 |
And the interpolations
| osm | type | geometry | nodes |
| W1 | <value> | 1,2 | 1,2 |
And the named places
| osm | class | type | geometry |
| W10 | highway | residential | 4,5 |
And the ways
| id | nodes |
| 1 | 1,2 |
When importing
Then W1 expands to no interpolation
@@ -549,15 +487,12 @@ Feature: Import of address interpolations
| N2 | place | house | 18 | 3 |
| N3 | place | house | 24 | 9 |
| N4 | place | house | 42 | 4 |
And the places
| osm | class | type | addr+interpolation | geometry |
| W1 | place | houses | even | 1,2,3,4 |
And the interpolations
| osm | type | geometry | nodes |
| W1 | even | 1,2,3,4 | 1,2,3,4 |
And the named places
| osm | class | type | geometry |
| W10 | highway | residential | 1,4 |
And the ways
| id | nodes |
| 1 | 1,2,3,4 |
When importing
Then W1 expands to interpolation
| start | end |
@@ -576,15 +511,12 @@ Feature: Import of address interpolations
| N2 | place | house | 6 | 8 |
| N3 | place | house | 10 | 8 |
| N4 | place | house | 14 | 9 |
And the places
| osm | class | type | addr+interpolation | geometry |
| W1 | place | houses | even | 7,8,8,9 |
And the interpolations
| osm | type | geometry | nodes |
| W1 | even | 7,8,8,9 | 1,2,3,4 |
And the named places
| osm | class | type | geometry |
| W10 | highway | residential | 4,5 |
And the ways
| id | nodes |
| 1 | 1,2,3,4 |
When importing
Then W1 expands to interpolation
| start | end | geometry |
@@ -601,15 +533,12 @@ Feature: Import of address interpolations
| N2 | place | house | 8 |
| N3 | place | house | 12 |
| N4 | place | house | 14 |
And the places
| osm | class | type | addr+interpolation | geometry |
| W1 | place | houses | even | 8,9 |
And the interpolations
| osm | type | geometry | nodes |
| W1 | even | 8,9 | 1,8,9,2,3,4 |
And the named places
| osm | class | type | geometry |
| W10 | highway | residential | 1,4 |
And the ways
| id | nodes |
| 1 | 1,8,9,2,3,4 |
When importing
Then W1 expands to interpolation
| start | end | geometry |

View File

@@ -297,25 +297,21 @@ Feature: Linking of places
| R1 | LabelPlace |
@skip
Scenario: Linked places expand default language names
Given the grid with origin CO
| 1 | | 2 | | 5 | | 6 |
| | 9 | | | | 10 | |
| 4 | | 3 | | 8 | | 7 |
And the places
Given the grid
| 1 | | 2 |
| | 9 | |
| 4 | | 3 |
Given the places
| osm | class | type | name+name | geometry |
| N9 | place | city | Popayán | 9 |
And the places
| osm | class | type | name+name:en | geometry |
| N10 | place | city | Open | 10 |
And the places
Given the places
| osm | class | type | name+name | geometry | admin |
| R1 | boundary | administrative | Perímetro Urbano Popayán | (1,2,3,4,1) | 8 |
| R2 | boundary | administrative | Abre | (5,6,7,8,5) | 8 |
And the relations
| id | members |
| 1 | N9:label |
| 2 | N10:label |
| id | members |
| 1 | N9:label |
When importing
Then placex contains
| object | linked_place_id |

View File

@@ -287,38 +287,6 @@ Feature: Searching of house numbers
| N1 |
Scenario: Interpolations are found according to their type
Given the grid
| 10 | | 11 |
| 100 | | 101 |
| 20 | | 21 |
And the places
| osm | class | type | name | geometry |
| W100 | highway | residential | Ringstr | 100, 101 |
And the places
| osm | class | type | addr+interpolation | geometry |
| W10 | place | houses | even | 10, 11 |
| W20 | place | houses | odd | 20, 21 |
And the places
| osm | class | type | housenr | geometry |
| N10 | place | house | 10 | 10 |
| N11 | place | house | 20 | 11 |
| N20 | place | house | 11 | 20 |
| N21 | place | house | 21 | 21 |
And the ways
| id | nodes |
| 10 | 10, 11 |
| 20 | 20, 21 |
When importing
When geocoding "Ringstr 12"
Then the result set contains
| object |
| W10 |
When geocoding "Ringstr 13"
Then the result set contains
| object |
| W20 |
Scenario: A housenumber with interpolation is found
Given the places
| osm | class | type | housenr | addr+interpolation | geometry |
@@ -378,4 +346,3 @@ Feature: Searching of house numbers
Then the result set contains
| object |
| W10 |

View File

@@ -11,16 +11,13 @@ Feature: Query of address interpolations
Given the places
| osm | class | type | name | geometry |
| W10 | highway | primary | Nickway | 10,12,13 |
And the places
| osm | class | type | addr+interpolation | geometry |
| W1 | place | houses | odd | 1,3 |
And the interpolations
| osm | type | geometry | nodes |
| W1 | odd | 1,3 | 1,3 |
And the places
| osm | class | type | housenr | geometry |
| N1 | place | house | 1 | 1 |
| N3 | place | house | 5 | 3 |
And the ways
| id | nodes |
| 1 | 1,3 |
When importing
When reverse geocoding at node 2
Then the result contains
@@ -36,16 +33,13 @@ Feature: Query of address interpolations
Given the places
| osm | class | type | name | geometry |
| W10 | highway | primary | Nickway | 10,12,13 |
And the places
| osm | class | type | addr+interpolation | geometry |
| W1 | place | houses | even | 1,3 |
And the interpolations
| osm | type | geometry | nodes |
| W1 | even | 1,3 | 1,3 |
And the places
| osm | class | type | housenr | geometry |
| N1 | place | house | 2 | 1 |
| N3 | place | house | 18 | 3 |
And the ways
| id | nodes |
| 1 | 1,3 |
When importing
When reverse geocoding at node 2
Then the result contains
@@ -55,3 +49,32 @@ Feature: Query of address interpolations
Then all results contain
| object | display_name | centroid!wkt |
| W1 | 10, Nickway | 2 |
Scenario: Interpolations are found according to their type
Given the grid
| 10 | | 11 |
| 100 | | 101 |
| 20 | | 21 |
And the places
| osm | class | type | name | geometry |
| W100 | highway | residential | Ringstr | 100, 101 |
And the interpolations
| osm | type | geometry | nodes |
| W10 | even | 10, 11 | 10, 11 |
| W20 | odd | 20, 21 | 20, 21 |
And the places
| osm | class | type | housenr | geometry |
| N10 | place | house | 10 | 10 |
| N11 | place | house | 20 | 11 |
| N20 | place | house | 11 | 20 |
| N21 | place | house | 21 | 21 |
When importing
When geocoding "Ringstr 12"
Then the result set contains
| object |
| W10 |
When geocoding "Ringstr 13"
Then the result set contains
| object |
| W20 |

View File

@@ -11,18 +11,15 @@ Feature: Update of address interpolations
| osm | class | type | name | geometry |
| W2 | highway | unclassified | Sun Way | 10,11 |
| W3 | highway | unclassified | Cloud Street | 20,21 |
And the ways
| id | nodes |
| 10 | 1,2 |
When importing
Then W10 expands to no interpolation
When updating places
| osm | class | type | housenr |
| N1 | place | house | 2 |
| N2 | place | house | 6 |
And updating places
| osm | class | type | addr+interpolation | geometry |
| W10 | place | houses | even | 1,2 |
And updating interpolations
| osm | type | geometry | nodes |
| W10 | even | 1,2 | 1,2 |
Then placex contains
| object | parent_place_id |
| N1 | W2 |
@@ -41,16 +38,13 @@ Feature: Update of address interpolations
| osm | class | type | housenr |
| N1 | place | house | 2 |
| N2 | place | house | 6 |
And the places
| osm | class | type | addr+interpolation | geometry |
| W10 | place | houses | even | 1,2 |
And the interpolations
| osm | type | geometry | nodes |
| W10 | even | 1,2 | 1,2 |
And the places
| osm | class | type | name | geometry |
| W2 | highway | unclassified | Sun Way | 10,11 |
| W3 | highway | unclassified | Cloud Street | 20,21 |
And the ways
| id | nodes |
| 10 | 1,2 |
When importing
Then placex contains
| object | parent_place_id |
@@ -59,9 +53,9 @@ Feature: Update of address interpolations
And W10 expands to interpolation
| parent_place_id | start | end |
| W2 | 4 | 4 |
When updating places
| osm | class | type | addr+interpolation | street | geometry |
| W10 | place | houses | even | Cloud Street | 1,2 |
When updating interpolations
| osm | type | street | nodes | geometry |
| W10 | even | Cloud Street | 1,2 | 1,2 |
Then placex contains
| object | parent_place_id |
| N1 | W3 |
@@ -80,16 +74,13 @@ Feature: Update of address interpolations
| osm | class | type | housenr |
| N1 | place | house | 2 |
| N2 | place | house | 6 |
And the places
| osm | class | type | addr+interpolation | geometry |
| W10 | place | houses | even | 1,2 |
And the interpolations
| osm | type | geometry | nodes |
| W10 | even | 1,2 | 1,2 |
And the places
| osm | class | type | name | geometry |
| W2 | highway | unclassified | Sun Way | 10,11 |
| W3 | highway | unclassified | Cloud Street | 20,21 |
And the ways
| id | nodes |
| 10 | 1,2 |
When importing
Then placex contains
| object | parent_place_id |
@@ -120,16 +111,13 @@ Feature: Update of address interpolations
| osm | class | type | housenr |
| N1 | place | house | 2 |
| N2 | place | house | 6 |
And the places
| osm | class | type | addr+interpolation | geometry |
| W10 | place | houses | even | 1,2 |
And the interpolations
| osm | type | geometry | nodes |
| W10 | even | 1,2 | 1,2 |
And the places
| osm | class | type | name | geometry |
| W2 | highway | unclassified | Sun Way | 10,11 |
| W3 | highway | unclassified | Cloud Street | 20,21 |
And the ways
| id | nodes |
| 10 | 1,2 |
When importing
Then placex contains
| object | parent_place_id |
@@ -155,15 +143,12 @@ Feature: Update of address interpolations
| osm | class | type | housenr |
| N1 | place | house | 2 |
| N2 | place | house | 6 |
And the places
| osm | class | type | addr+interpolation | street | geometry |
| W10 | place | houses | even | Cloud Street| 1,2 |
And the interpolations
| osm | type | street | geometry | nodes |
| W10 | even | Cloud Street| 1,2 | 1,2 |
And the places
| osm | class | type | name | geometry |
| W2 | highway | unclassified | Sun Way | 10,11 |
And the ways
| id | nodes |
| 10 | 1,2 |
When importing
Then placex contains
| object | parent_place_id |
@@ -193,16 +178,13 @@ Feature: Update of address interpolations
| osm | class | type | housenr |
| N1 | place | house | 2 |
| N2 | place | house | 6 |
And the places
| osm | class | type | addr+interpolation | street | geometry |
| W10 | place | houses | even | Cloud Street| 1,2 |
And the interpolations
| osm | type | street | geometry | nodes |
| W10 | even | Cloud Street| 1,2 | 1,2 |
And the places
| osm | class | type | name | geometry |
| W2 | highway | unclassified | Sun Way | 10,11 |
| W3 | highway | unclassified | Cloud Street | 20,21 |
And the ways
| id | nodes |
| 10 | 1,2 |
When importing
Then placex contains
| object | parent_place_id |
@@ -220,67 +202,6 @@ Feature: Update of address interpolations
| parent_place_id | start | end |
| W2 | 4 | 4 |
Scenario: building becomes interpolation
Given the grid
| 10 | | | | 11 |
| | 1 | | 2 | |
| | 4 | | 3 | |
And the places
| osm | class | type | housenr | geometry |
| W1 | place | house | 3 | (1,2,3,4,1) |
And the places
| osm | class | type | name | geometry |
| W2 | highway | unclassified | Cloud Street | 10,11 |
When importing
Then placex contains
| object | parent_place_id |
| W1 | W2 |
Given the ways
| id | nodes |
| 1 | 1,2 |
When updating places
| osm | class | type | housenr |
| N1 | place | house | 2 |
| N2 | place | house | 6 |
And updating places
| osm | class | type | addr+interpolation | street | geometry |
| W1 | place | houses | even | Cloud Street| 1,2 |
Then placex has no entry for W1
And W1 expands to interpolation
| parent_place_id | start | end |
| W2 | 4 | 4 |
Scenario: interpolation becomes building
Given the grid
| 10 | | | | 11 |
| | 1 | | 2 | |
| | 4 | | 3 | |
And the places
| osm | class | type | housenr |
| N1 | place | house | 2 |
| N2 | place | house | 6 |
And the places
| osm | class | type | name | geometry |
| W2 | highway | unclassified | Cloud Street | 10,11 |
And the ways
| id | nodes |
| 1 | 1,2 |
And the places
| osm | class | type | addr+interpolation | street | geometry |
| W1 | place | houses | even | Cloud Street| 1,2 |
When importing
Then placex has no entry for W1
And W1 expands to interpolation
| parent_place_id | start | end |
| W2 | 4 | 4 |
When updating places
| osm | class | type | housenr | geometry |
| W1 | place | house | 3 | (1,2,3,4,1) |
Then placex contains
| object | parent_place_id |
| W1 | W2 |
And W1 expands to no interpolation
Scenario: housenumbers added to interpolation
Given the grid
| 10 | | | | 11 |
@@ -288,18 +209,18 @@ Feature: Update of address interpolations
And the places
| osm | class | type | name | geometry |
| W2 | highway | unclassified | Cloud Street | 10,11 |
And the ways
| id | nodes |
| 1 | 1,2 |
And the places
| osm | class | type | addr+interpolation | geometry |
| W1 | place | houses | even | 1,2 |
And the interpolations
| osm | type | geometry | nodes |
| W1 | even | 1,2 | 1,2 |
When importing
Then W1 expands to no interpolation
When updating places
| osm | class | type | housenr |
| N1 | place | house | 2 |
| N2 | place | house | 6 |
And updating interpolations
| osm | type | geometry | nodes |
| W1 | even | 1,2 | 1,2 |
Then W1 expands to interpolation
| parent_place_id | start | end |
| W2 | 4 | 4 |
@@ -311,12 +232,9 @@ Feature: Update of address interpolations
And the places
| osm | class | type | name | geometry |
| W1 | highway | unclassified | Cloud Street | 1, 2 |
And the ways
| id | nodes |
| 2 | 3,4,5 |
And the places
| osm | class | type | addr+interpolation | geometry |
| W2 | place | houses | even | 3,4,5 |
And the interpolations
| osm | type | geometry | nodes |
| W2 | even | 3,4,5 | 3,4,5 |
And the places
| osm | class | type | housenr |
| N3 | place | house | 2 |
@@ -328,12 +246,14 @@ Feature: Update of address interpolations
When updating places
| osm | class | type | housenr |
| N4 | place | house | 6 |
And updating interpolations
| osm | type | geometry | nodes |
| W2 | even | 3,4,5 | 3,4,5 |
Then W2 expands to interpolation
| parent_place_id | start | end |
| W1 | 4 | 4 |
| W1 | 8 | 8 |
@skip
Scenario: housenumber removed in middle of interpolation
Given the grid
| 1 | | | | | 2 |
@@ -341,12 +261,9 @@ Feature: Update of address interpolations
And the places
| osm | class | type | name | geometry |
| W1 | highway | unclassified | Cloud Street | 1, 2 |
And the ways
| id | nodes |
| 2 | 3,4,5 |
And the places
| osm | class | type | addr+interpolation | geometry |
| W2 | place | houses | even | 3,4,5 |
And the interpolations
| osm | type | geometry | nodes |
| W2 | even | 3,4,5 | 3,4,5 |
And the places
| osm | class | type | housenr |
| N3 | place | house | 2 |
@@ -358,6 +275,9 @@ Feature: Update of address interpolations
| W1 | 4 | 4 |
| W1 | 8 | 8 |
When marking for delete N4
And updating interpolations
| osm | type | geometry | nodes |
| W2 | even | 3,4,5 | 3,4,5 |
Then W2 expands to interpolation
| parent_place_id | start | end |
| W1 | 4 | 8 |
@@ -369,12 +289,9 @@ Feature: Update of address interpolations
And the places
| osm | class | type | name | geometry |
| W1 | highway | unclassified | Cloud Street | 1, 2 |
And the ways
| id | nodes |
| 2 | 3,4 |
And the places
| osm | class | type | addr+interpolation | geometry |
| W2 | place | houses | even | 3,4 |
And the interpolations
| osm | type | geometry | nodes |
| W2 | even | 3,4 | 3,4 |
And the places
| osm | class | type | housenr |
| N3 | place | house | 2 |
@@ -386,33 +303,9 @@ Feature: Update of address interpolations
When updating places
| osm | class | type | housenr |
| N4 | place | house | 8 |
And updating interpolations
| osm | type | geometry | nodes |
| W2 | even | 3,4 | 3,4 |
Then W2 expands to interpolation
| parent_place_id | start | end |
| W1 | 4 | 6 |
Scenario: Legal interpolation type changed to illegal one
Given the grid
| 1 | | 2 |
| 3 | | 4 |
And the places
| osm | class | type | name | geometry |
| W1 | highway | unclassified | Cloud Street | 1, 2 |
And the ways
| id | nodes |
| 2 | 3,4 |
And the places
| osm | class | type | addr+interpolation | geometry |
| W2 | place | houses | even | 3,4 |
And the places
| osm | class | type | housenr |
| N3 | place | house | 2 |
| N4 | place | house | 6 |
When importing
Then W2 expands to interpolation
| parent_place_id | start | end |
| W1 | 4 | 4 |
When updating places
| osm | class | type | addr+interpolation | geometry |
| W2 | place | houses | 12-2 | 3,4 |
Then W2 expands to no interpolation

View File

@@ -68,19 +68,6 @@ Feature: Update of simple objects
| object | class | type | centroid!wkt |
| N3 | shop | grocery | 1 -1 |
Scenario: remove postcode place when house number is added
Given the places
| osm | class | type | postcode | geometry |
| N3 | place | postcode | 12345 | country:de |
When importing
Then placex has no entry for N3
When updating places
| osm | class | type | postcode | housenr | geometry |
| N3 | place | house | 12345 | 13 | country:de |
Then placex contains
| object | class | type |
| N3 | place | house |
Scenario: remove boundary when changing from polygon to way
Given the grid
| 1 | 2 |

View File

@@ -0,0 +1,42 @@
Feature: Import of interpolations
Test if interpolation objects are correctly imported into the
place_interpolation table
Background:
Given the grid
| 1 | 2 |
| 4 | 3 |
Scenario: Simple address interpolations
When loading osm data
"""
n1
n2
w13001 Taddr:interpolation=odd,addr:street=Blumenstrasse Nn1,n2
w13002 Taddr:interpolation=even,place=city Nn1,n2
w13003 Taddr:interpolation=odd Nn1,n1
"""
Then place contains exactly
| object | class | type |
| W13002 | place | city |
And place_interpolation contains exactly
| osm_id | type | address!dict | nodes!ints | geometry!wkt |
| 13001 | odd | "street": "Blumenstrasse" | 1,2 | 1,2 |
| 13002 | even | - | 1,2 | 1,2 |
Scenario: Address interpolation with housenumber
When loading osm data
"""
n1
n2
n3
n4
w34 Taddr:interpolation=all,addr:housenumber=2-4,building=yes Nn1,n2,n3,n4,n1
w35 Taddr:interpolation=all,addr:housenumber=5,building=yes Nn1,n2,n3,n4,n1
w36 Taddr:interpolation=all,addr:housenumber=2a-c Nn1,n2,n3,n4,n1
"""
Then place contains exactly
| object | class | type | address!dict |
| W35 | building | yes | "housenumber": "5", "interpolation": "all" |
| W34 | building | yes | "housenumber": "2-4", "interpolation": "all" |
| W36 | place | house | "housenumber": "2a-c", "interpolation": "all" |

View File

@@ -205,18 +205,6 @@ Feature: Tag evaluation
| N12005 | 12345 | - |
Scenario: Address interpolations
When loading osm data
"""
n13001 Taddr:interpolation=odd
n13002 Taddr:interpolation=even,place=city
"""
Then place contains exactly
| object | class | type | address!dict |
| N13001 | place | houses | 'interpolation': 'odd' |
| N13002 | place | houses | 'interpolation': 'even' |
Scenario: Footways
When loading osm data
"""

View File

@@ -14,20 +14,24 @@ Feature: Updates of address interpolation objects
n2 Taddr:housenumber=17
w33 Thighway=residential,name=Tao Nn1,n2
"""
Then place contains
Then place contains exactly
| object | class | type |
| N1 | place | house |
| N2 | place | house |
| W33 | highway | residential |
When updating osm data
"""
w99 Taddr:interpolation=odd Nn1,n2
"""
Then place contains
Then place contains exactly
| object | class | type |
| N1 | place | house |
| N2 | place | house |
| W99 | place | houses |
| W33 | highway | residential |
And place_interpolation contains exactly
| osm_id | type |
| 99 | odd |
When indexing
Then placex contains exactly
| object | class | type |
@@ -46,11 +50,13 @@ Feature: Updates of address interpolation objects
n2 Taddr:housenumber=7
w99 Taddr:interpolation=odd Nn1,n2
"""
Then place contains
Then place contains exactly
| object | class | type |
| N1 | place | house |
| N2 | place | house |
| W99 | place | houses |
And place_interpolation contains exactly
| osm_id | type |
| 99 | odd |
When updating osm data
"""
@@ -60,6 +66,8 @@ Feature: Updates of address interpolation objects
| object | class | type |
| N1 | place | house |
| N2 | place | house |
And place_interpolation contains exactly
| osm_id |
When indexing
Then placex contains exactly
| object | class | type |
@@ -77,21 +85,27 @@ Feature: Updates of address interpolation objects
w33 Thighway=residential Nn1,n2
w99 Thighway=residential Nn1,n2
"""
Then place contains
Then place contains exactly
| object | class | type |
| N1 | place | house |
| N2 | place | house |
| W33 | highway | residential |
| W99 | highway | residential |
And place_interpolation contains exactly
| osm_id |
When updating osm data
"""
w99 Taddr:interpolation=odd Nn1,n2
"""
Then place contains
Then place contains exactly
| object | class | type |
| N1 | place | house |
| N2 | place | house |
| W99 | place | houses |
| W33 | highway | residential |
And place_interpolation contains exactly
| osm_id | type |
| 99 | odd |
When indexing
Then placex contains exactly
| object | class | type |
@@ -110,11 +124,13 @@ Feature: Updates of address interpolation objects
n2 Taddr:housenumber=17
w99 Taddr:interpolation=odd Nn1,n2
"""
Then place contains
Then place contains exactly
| object | class | type |
| N1 | place | house |
| N2 | place | house |
| W99 | place | houses |
And place_interpolation contains exactly
| osm_id | type |
| 99 | odd |
When updating osm data
"""
@@ -125,6 +141,8 @@ Feature: Updates of address interpolation objects
| N1 | place | house |
| N2 | place | house |
| W99 | highway | residential |
And place_interpolation contains exactly
| osm_id |
When indexing
Then placex contains exactly
| object | class | type |

View File

@@ -112,7 +112,9 @@ Feature: Update of postcode only objects
| object | class | type |
| N1 | place | house |
| N2 | place | house |
| W34 | place | houses |
And place_interpolation contains exactly
| osm_id | type |
| 34 | odd |
When updating osm data
"""
@@ -122,9 +124,11 @@ Feature: Update of postcode only objects
| object | class | type |
| N1 | place | house |
| N2 | place | house |
Then place_postcode contains exactly
And place_postcode contains exactly
| object | postcode |
| W34 | 4456 |
And place_interpolation contains exactly
| osm_id |
When indexing
Then location_property_osmline contains exactly
| osm_id |
@@ -158,7 +162,9 @@ Feature: Update of postcode only objects
| N1 | place | house |
| N2 | place | house |
| W33 | highway | residential |
| W34 | place | houses |
And place_interpolation contains exactly
| osm_id | type |
| 34 | odd |
And place_postcode contains exactly
| object |
When indexing

View File

@@ -2,7 +2,7 @@
#
# This file is part of Nominatim. (https://nominatim.org)
#
# Copyright (C) 2025 by the Nominatim developer community.
# Copyright (C) 2026 by the Nominatim developer community.
# For a full list of authors see the git log.
"""
Collector for BDD import acceptance tests.
@@ -14,6 +14,7 @@ import re
from collections import defaultdict
import psycopg
import psycopg.sql as pysql
import pytest
from pytest_bdd import when, then, given
@@ -50,6 +51,34 @@ def _collect_place_ids(conn):
return pids
@pytest.fixture
def row_factory(db_conn):
def _insert_row(table, **data):
columns = []
placeholders = []
values = []
for k, v in data.items():
columns.append(pysql.Identifier(k))
if isinstance(v, tuple):
placeholders.append(pysql.SQL(v[0]))
values.append(v[1])
elif isinstance(v, (pysql.Literal, pysql.SQL)):
placeholders.append(v)
else:
placeholders.append(pysql.Placeholder())
values.append(v)
sql = pysql.SQL("INSERT INTO {table} ({columns}) VALUES({values})")\
.format(table=pysql.Identifier(table),
columns=pysql.SQL(',').join(columns),
values=pysql.SQL(',').join(placeholders))
db_conn.execute(sql, values)
db_conn.commit()
return _insert_row
@pytest.fixture
def test_config_env(pytestconfig):
dbname = pytestconfig.getini('nominatim_test_db')
@@ -85,18 +114,36 @@ def import_places(db_conn, named, datatable, node_grid):
@given(step_parse('the entrances'), target_fixture=None)
def import_place_entrances(db_conn, datatable, node_grid):
def import_place_entrances(row_factory, datatable, node_grid):
""" Insert todo rows into the place_entrance table.
"""
with db_conn.cursor() as cur:
for row in datatable[1:]:
data = PlaceColumn(node_grid).add_row(datatable[0], row, False)
assert data.columns['osm_type'] == 'N'
for row in datatable[1:]:
data = PlaceColumn(node_grid).add_row(datatable[0], row, False)
assert data.columns['osm_type'] == 'N'
cur.execute("""INSERT INTO place_entrance (osm_id, type, extratags, geometry)
VALUES (%s, %s, %s, {})""".format(data.get_wkt()),
(data.columns['osm_id'], data.columns['type'],
data.columns.get('extratags')))
params = {'osm_id': data.columns['osm_id'],
'type': data.columns['type'],
'extratags': data.columns.get('extratags'),
'geometry': pysql.SQL(data.get_wkt())}
row_factory('place_entrance', **params)
@given(step_parse('the interpolations'), target_fixture=None)
def import_place_interpolations(row_factory, datatable, node_grid):
""" Insert todo rows into the place_entrance table.
"""
for row in datatable[1:]:
data = PlaceColumn(node_grid).add_row(datatable[0], row, False)
assert data.columns['osm_type'] == 'W'
params = {'osm_id': data.columns['osm_id'],
'type': data.columns['type'],
'address': data.columns.get('address'),
'nodes': [int(x) for x in data.columns['nodes'].split(',')],
'geometry': pysql.SQL(data.get_wkt())}
row_factory('place_interpolation', **params)
@given(step_parse('the postcodes'), target_fixture=None)
@@ -135,43 +182,41 @@ def import_place_postcode(db_conn, datatable, node_grid):
@given('the ways', target_fixture=None)
def import_ways(db_conn, datatable):
def import_ways(row_factory, datatable):
""" Import raw ways into the osm2pgsql way middle table.
"""
with db_conn.cursor() as cur:
id_idx = datatable[0].index('id')
node_idx = datatable[0].index('nodes')
for line in datatable[1:]:
tags = psycopg.types.json.Json(
{k[5:]: v for k, v in zip(datatable[0], line)
if k.startswith("tags+")})
nodes = [int(x) for x in line[node_idx].split(',')]
cur.execute("INSERT INTO planet_osm_ways (id, nodes, tags) VALUES (%s, %s, %s)",
(line[id_idx], nodes, tags))
id_idx = datatable[0].index('id')
node_idx = datatable[0].index('nodes')
for line in datatable[1:]:
row_factory('planet_osm_ways',
id=line[id_idx],
nodes=[int(x) for x in line[node_idx].split(',')],
tags=psycopg.types.json.Json(
{k[5:]: v for k, v in zip(datatable[0], line)
if k.startswith("tags+")}))
@given('the relations', target_fixture=None)
def import_rels(db_conn, datatable):
def import_rels(row_factory, datatable):
""" Import raw relations into the osm2pgsql relation middle table.
"""
with db_conn.cursor() as cur:
id_idx = datatable[0].index('id')
memb_idx = datatable[0].index('members')
for line in datatable[1:]:
tags = psycopg.types.json.Json(
{k[5:]: v for k, v in zip(datatable[0], line)
if k.startswith("tags+")})
members = []
if line[memb_idx]:
for member in line[memb_idx].split(','):
m = re.fullmatch(r'\s*([RWN])(\d+)(?::(\S+))?\s*', member)
if not m:
raise ValueError(f'Illegal member {member}.')
members.append({'ref': int(m[2]), 'role': m[3] or '', 'type': m[1]})
id_idx = datatable[0].index('id')
memb_idx = datatable[0].index('members')
for line in datatable[1:]:
tags = psycopg.types.json.Json(
{k[5:]: v for k, v in zip(datatable[0], line)
if k.startswith("tags+")})
members = []
if line[memb_idx]:
for member in line[memb_idx].split(','):
m = re.fullmatch(r'\s*([RWN])(\d+)(?::(\S+))?\s*', member)
if not m:
raise ValueError(f'Illegal member {member}.')
members.append({'ref': int(m[2]), 'role': m[3] or '', 'type': m[1]})
cur.execute('INSERT INTO planet_osm_rels (id, tags, members) VALUES (%s, %s, %s)',
(int(line[id_idx]), tags, psycopg.types.json.Json(members)))
row_factory('planet_osm_rels',
id=int(line[id_idx]), tags=tags,
members=psycopg.types.json.Json(members))
@when('importing', target_fixture='place_ids')
@@ -221,6 +266,28 @@ def update_place_entrances(db_conn, datatable, node_grid):
db_conn.commit()
@when('updating interpolations', target_fixture=None)
def update_place_interpolations(db_conn, row_factory, update_config, datatable, node_grid):
""" Update rows in the place_entrance table.
"""
for row in datatable[1:]:
data = PlaceColumn(node_grid).add_row(datatable[0], row, False)
assert data.columns['osm_type'] == 'W'
params = {'osm_id': data.columns['osm_id'],
'type': data.columns['type'],
'address': data.columns.get('address'),
'nodes': [int(x) for x in data.columns['nodes'].split(',')],
'geometry': pysql.SQL(data.get_wkt())}
row_factory('place_interpolation', **params)
db_conn.execute('SELECT flush_deleted_places()')
db_conn.commit()
cli.nominatim(['index', '-q', '--minrank', '30'], update_config.environ)
@when('refreshing postcodes')
def do_postcode_update(update_config):
""" Recompute the postcode centroids.
@@ -237,6 +304,8 @@ def do_delete_place(db_conn, update_config, node_grid, otype, oid):
cur.execute('TRUNCATE place_to_be_deleted')
cur.execute('DELETE FROM place WHERE osm_type = %s and osm_id = %s',
(otype, oid))
cur.execute('DELETE FROM place_interpolation WHERE osm_id = %s',
(oid, ))
cur.execute('SELECT flush_deleted_places()')
if otype == 'N':
cur.execute('DELETE FROM place_entrance WHERE osm_id = %s',

View File

@@ -2,7 +2,7 @@
#
# This file is part of Nominatim. (https://nominatim.org)
#
# Copyright (C) 2025 by the Nominatim developer community.
# Copyright (C) 2026 by the Nominatim developer community.
# For a full list of authors see the git log.
"""
Helper functions to compare expected values.
@@ -61,6 +61,8 @@ COMPARISON_FUNCS = {
'fm': lambda val, exp: re.fullmatch(exp, val) is not None,
'dict': lambda val, exp: (val is None if exp == '-'
else (val == ast.literal_eval('{' + exp + '}'))),
'ints': lambda val, exp: (val is None if exp == '-'
else (val == [int(i) for i in exp.split(',')])),
'in_box': within_box
}
@@ -84,6 +86,8 @@ class ResultAttr:
!fm - consider comparison string a regular expression and match full value
!wkt - convert the expected value to a WKT string before comparing
!in_box - the expected value is a comma-separated bbox description
!dict - compare as a dictitionary, member order does not matter
!ints - compare as integer array
"""
def __init__(self, obj, key, grid=None):

View File

@@ -54,7 +54,6 @@ class PlaceColumn:
elif key in ('name', 'address', 'extratags'):
self.columns[key] = ast.literal_eval('{' + value + '}')
else:
assert key in ('class', 'type'), "Unknown column '{}'.".format(key)
self.columns[key] = None if value == '' else value
def _set_key_name(self, value):