From 7324431b121496f5849c70de7f10f869690568f3 Mon Sep 17 00:00:00 2001 From: Sarah Hoffmann Date: Wed, 11 Nov 2020 11:52:14 +0100 Subject: [PATCH] get additional addresses for rank 30 objects get_addressdata() now also checks if the place itself has entries in the place_addressline table and merges them into the results. Also restrict checking for address tag places to cases where the name cannot be found in the parent's address search terms. Looking up all address tags is just too slow. --- sql/functions/address_lookup.sql | 31 ++++++++++++++++----------- sql/functions/normalization.sql | 12 +++++++++-- test/bdd/db/import/addressing.feature | 12 +++++++---- 3 files changed, 37 insertions(+), 18 deletions(-) diff --git a/sql/functions/address_lookup.sql b/sql/functions/address_lookup.sql index 1a5ed391..266e8686 100644 --- a/sql/functions/address_lookup.sql +++ b/sql/functions/address_lookup.sql @@ -90,7 +90,7 @@ DECLARE for_place_id BIGINT; result TEXT[]; search TEXT[]; - found INTEGER; + current_rank_address INTEGER; location RECORD; countrylocation RECORD; searchcountrycode varchar(2); @@ -103,7 +103,7 @@ DECLARE search_unlisted_place TEXT; countryname HSTORE; BEGIN - -- The place ein question might not have a direct entry in place_addressline. + -- The place in question might not have a direct entry in place_addressline. -- Look for the parent of such places then and save if in for_place_id. postcode_isexact := false; @@ -177,9 +177,8 @@ BEGIN --RAISE WARNING '% % % %',searchcountrycode, searchhousenumber, searchpostcode; - found := 1000; -- the lowest rank_address included + -- --- Return the record for the base entry. - -- Return the record for the base entry. FOR location IN SELECT placex.place_id, osm_type, osm_id, name, coalesce(extratags->'linked_place', extratags->'place') as place_type, @@ -206,9 +205,12 @@ BEGIN location.admin_level, true, location.isaddress, location.rank_address, location.distance)::addressline; RETURN NEXT countrylocation; - found := location.rank_address; + + current_rank_address := location.rank_address; END LOOP; + -- --- Return records for address parts. + FOR location IN SELECT placex.place_id, osm_type, osm_id, name, class, type, coalesce(extratags->'linked_place', extratags->'place') as place_type, @@ -216,14 +218,15 @@ BEGIN CASE WHEN rank_address = 11 THEN 5 ELSE rank_address END as rank_address, distance, country_code, postcode FROM place_addressline join placex on (address_place_id = placex.place_id) - WHERE place_addressline.place_id = for_place_id + WHERE place_addressline.place_id IN (for_place_id, in_place_id) AND linked_place_id is null AND (placex.country_code IS NULL OR searchcountrycode IS NULL OR placex.country_code = searchcountrycode) - ORDER BY rank_address desc, isaddress desc, fromarea desc, + ORDER BY rank_address desc, (place_addressline.place_id = in_place_id) desc, + isaddress desc, fromarea desc, distance asc, rank_search desc LOOP ---RAISE WARNING '%',location; + -- RAISE WARNING '%',location; IF searchcountrycode IS NULL AND location.country_code IS NOT NULL THEN searchcountrycode := location.country_code; END IF; @@ -243,17 +246,21 @@ BEGIN location.name, location.class, location.type, location.place_type, location.admin_level, location.fromarea, - location.isaddress, location.rank_address, + location.isaddress and location.rank_address != current_rank_address, + location.rank_address, location.distance)::addressline; RETURN NEXT countrylocation; - found := location.rank_address; + + IF location.isaddress THEN + current_rank_address := location.rank_address; + END IF; END LOOP; -- If no country was included yet, add the name information from country_name. - IF found > 4 THEN + IF current_rank_address > 4 THEN SELECT name FROM country_name WHERE country_code = searchcountrycode LIMIT 1 INTO countryname; ---RAISE WARNING '% % %',found,searchcountrycode,countryname; +--RAISE WARNING '% % %',current_rank_address,searchcountrycode,countryname; IF countryname IS NOT NULL THEN location := ROW(null, null, null, countryname, 'place', 'country', NULL, null, true, true, 4, 0)::addressline; diff --git a/sql/functions/normalization.sql b/sql/functions/normalization.sql index c7ead700..fc13aa90 100644 --- a/sql/functions/normalization.sql +++ b/sql/functions/normalization.sql @@ -432,6 +432,7 @@ DECLARE addr_item RECORD; parent_address_place_ids BIGINT[]; + filtered_address HSTORE; BEGIN nameaddress_vector := '{}'::INTEGER[]; @@ -440,11 +441,18 @@ BEGIN FROM search_name s WHERE s.place_id = parent_place_id; + -- Find all address tags that don't appear in the parent search names. + SELECT hstore(array_agg(ARRAY[k, v])) INTO filtered_address + FROM (SELECT skeys(address) as k, svals(address) as v) a + WHERE not addr_ids_from_name(v) && parent_address_vector + AND k not in ('country', 'street', 'place', 'postcode', + 'housenumber', 'streetnumber', 'consriptionnumber'); + -- Compute all search terms from the addr: tags. - IF address IS NOT NULL THEN + IF filtered_address IS NOT NULL THEN FOR addr_item IN SELECT * FROM - get_places_for_addr_tags(in_partition, geometry, address, country) + get_places_for_addr_tags(in_partition, geometry, filtered_address, country) LOOP IF addr_item.place_id is null THEN nameaddress_vector := array_merge(nameaddress_vector, diff --git a/test/bdd/db/import/addressing.feature b/test/bdd/db/import/addressing.feature index 04213521..6547545a 100644 --- a/test/bdd/db/import/addressing.feature +++ b/test/bdd/db/import/addressing.feature @@ -331,10 +331,10 @@ Feature: Address computation | 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 named places - | osm | class | type | addr+city | geometry | - | W1 | highway | primary | Right | 8,9 | - | N1 | amenity | cafe | Left | 9 | + And the places + | osm | class | type | name | addr+city | geometry | + | W1 | highway | primary | Wonderway | Right | 8,9 | + | N1 | amenity | cafe | Bolder | Left | 9 | When importing Then place_addressline contains | object | address | isaddress | @@ -343,4 +343,8 @@ Feature: Address computation And place_addressline doesn't contain | object | address | | W1 | R1 | + When searching for "Bolder" + Then results contain + | osm_type | osm_id | name | + | N | 1 | Bolder, Wonderway, Left | -- 2.45.2