From: Sarah Hoffmann Date: Sun, 19 Sep 2021 13:57:28 +0000 (+0200) Subject: Merge pull request #2447 from lonvia/fix-dynamic-address-assignment X-Git-Tag: v4.0.0~29 X-Git-Url: https://git.openstreetmap.org/nominatim.git/commitdiff_plain/e9d54f752cf959d6a6807312d56b3c726772001e?hp=2b2109c89a85c38522f10a6ec869f0b7d41fbf7c Merge pull request #2447 from lonvia/fix-dynamic-address-assignment Fix dynamic assignment of address parts --- diff --git a/.github/workflows/ci-tests.yml b/.github/workflows/ci-tests.yml index bac20d98..b70ea80f 100644 --- a/.github/workflows/ci-tests.yml +++ b/.github/workflows/ci-tests.yml @@ -185,7 +185,7 @@ jobs: - name: Prepare container (CentOS) run: | dnf update -y - dnf install -y sudo + dnf install -y sudo glibc-langpack-en shell: bash if: matrix.flavour == 'centos' diff --git a/lib-sql/functions/address_lookup.sql b/lib-sql/functions/address_lookup.sql index 45e49750..b6adfdc3 100644 --- a/lib-sql/functions/address_lookup.sql +++ b/lib-sql/functions/address_lookup.sql @@ -223,11 +223,13 @@ BEGIN OR placex.country_code = place.country_code) ORDER BY rank_address desc, (place_addressline.place_id = in_place_id) desc, - (fromarea and place.centroid is not null and not isaddress - and (place.address is null or avals(name) && avals(place.address)) - and ST_Contains(geometry, place.centroid)) desc, - isaddress desc, fromarea desc, - distance asc, rank_search desc + (CASE WHEN coalesce((avals(name) && avals(place.address)), False) THEN 2 + WHEN isaddress THEN 0 + WHEN fromarea + and place.centroid is not null + and ST_Contains(geometry, place.centroid) THEN 1 + ELSE -1 END) desc, + fromarea desc, distance asc, rank_search desc LOOP -- RAISE WARNING '%',location; location_isaddress := location.rank_address != current_rank_address; diff --git a/test/bdd/db/import/addressing.feature b/test/bdd/db/import/addressing.feature index b6345baf..b2437d71 100644 --- a/test/bdd/db/import/addressing.feature +++ b/test/bdd/db/import/addressing.feature @@ -433,3 +433,76 @@ Feature: Address computation Then results contain | osm | display_name | | N2 | Leftside, Wonderway, Right | + + + Scenario: POIs can correct address parts on the fly (with partial unmatching address) + Given the grid + | 1 | | | | 2 | | 5 | + | | | | 9 | | 8 | | + | | 10| 11| | | 12| | + | 4 | | | | 3 | | 6 | + And the places + | osm | class | type | admin | name | geometry | + | R1 | boundary | administrative | 8 | Left | (1,2,3,4,1) | + | R2 | boundary | administrative | 8 | Right | (2,3,6,5,2) | + And the places + | osm | class | type | name | geometry | + | W1 | highway | primary | Wonderway | 10,11,12 | + And the places + | osm | class | type | name | addr+suburb | geometry | + | N1 | amenity | cafe | Bolder | Boring | 9 | + | N2 | amenity | cafe | Leftside | Boring | 8 | + When importing + Then place_addressline contains + | object | address | isaddress | + | W1 | R1 | True | + | W1 | R2 | False | + And place_addressline doesn't contain + | object | address | + | N1 | R1 | + | N2 | R2 | + When sending search query "Bolder" + Then results contain + | osm | display_name | + | N1 | Bolder, Wonderway, Left | + When sending search query "Leftside" + Then results contain + | osm | display_name | + | N2 | Leftside, Wonderway, Right | + + + + Scenario: POIs can correct address parts on the fly (with partial matching address) + Given the grid + | 1 | | | | 2 | | 5 | + | | | | 9 | | 8 | | + | | 10| 11| | | 12| | + | 4 | | | | 3 | | 6 | + And the places + | osm | class | type | admin | name | geometry | + | R1 | boundary | administrative | 8 | Left | (1,2,3,4,1) | + | R2 | boundary | administrative | 8 | Right | (2,3,6,5,2) | + And the places + | osm | class | type | name | geometry | + | W1 | highway | primary | Wonderway | 10,11,12 | + And the places + | osm | class | type | name | addr+state | geometry | + | N1 | amenity | cafe | Bolder | Left | 9 | + | N2 | amenity | cafe | Leftside | Left | 8 | + When importing + Then place_addressline contains + | object | address | isaddress | + | W1 | R1 | True | + | W1 | R2 | False | + And place_addressline doesn't contain + | object | address | + | N1 | R1 | + | N2 | R2 | + When sending search query "Bolder" + Then results contain + | osm | display_name | + | N1 | Bolder, Wonderway, Left | + When sending search query "Leftside" + Then results contain + | osm | display_name | + | N2 | Leftside, Wonderway, Left |