X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/df0142678a10eaf51f2acac40bcff6350211b305..49f889bf09f78f7f475cf64ed4b06be9e00247ca:/lib-sql/functions/placex_triggers.sql diff --git a/lib-sql/functions/placex_triggers.sql b/lib-sql/functions/placex_triggers.sql index a73df59c..bb34883a 100644 --- a/lib-sql/functions/placex_triggers.sql +++ b/lib-sql/functions/placex_triggers.sql @@ -16,7 +16,9 @@ CREATE TYPE prepare_update_info AS ( country_code TEXT, class TEXT, type TEXT, - linked_place_id BIGINT + linked_place_id BIGINT, + centroid_x float, + centroid_y float ); -- Retrieve the data needed by the indexer for updating the place. @@ -47,7 +49,7 @@ BEGIN and rank_search = 30 AND ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon') LIMIT 1; ELSE - -- See if we can inherit addtional address tags from an interpolation. + -- See if we can inherit additional address tags from an interpolation. -- These will become permanent. FOR location IN SELECT (address - 'interpolation'::text - 'housenumber'::text) as address @@ -71,6 +73,8 @@ BEGIN result.type := p.type; result.country_code := p.country_code; result.rank_address := p.rank_address; + result.centroid_x := ST_X(p.centroid); + result.centroid_y := ST_Y(p.centroid); -- Names of linked places need to be merged in, so search for a linkable -- place already here. @@ -866,13 +870,16 @@ BEGIN -- Second check that the boundary is not completely contained in a -- place area with a equal or higher address rank. FOR location IN - SELECT rank_address FROM placex + SELECT rank_address + FROM placex, + LATERAL compute_place_rank(country_code, 'A', class, type, + admin_level, False, null) prank WHERE class = 'place' and rank_address < 24 - and rank_address >= NEW.rank_address + and prank.address_rank >= NEW.rank_address and geometry && NEW.geometry and geometry ~ NEW.geometry -- needed because ST_Relate does not do bbox cover test and ST_Relate(geometry, NEW.geometry, 'T*T***FF*') -- contains but not equal - ORDER BY rank_address desc LIMIT 1 + ORDER BY prank.address_rank desc LIMIT 1 LOOP NEW.rank_address := location.rank_address + 2; END LOOP; @@ -884,13 +891,16 @@ BEGIN -- For place areas make sure they are not completely contained in an area -- with a equal or higher address rank. FOR location IN - SELECT rank_address FROM placex - WHERE rank_address < 24 - and rank_address >= NEW.rank_address + SELECT rank_address + FROM placex, + LATERAL compute_place_rank(country_code, 'A', class, type, + admin_level, False, null) prank + WHERE prank.address_rank < 24 + and prank.address_rank >= NEW.rank_address and geometry && NEW.geometry and geometry ~ NEW.geometry -- needed because ST_Relate does not do bbox cover test and ST_Relate(geometry, NEW.geometry, 'T*T***FF*') -- contains but not equal - ORDER BY rank_address desc LIMIT 1 + ORDER BY prank.address_rank desc LIMIT 1 LOOP NEW.rank_address := location.rank_address + 2; END LOOP; @@ -901,9 +911,13 @@ BEGIN -- address level and has not been linked, then make the node a subpart -- by increasing the address rank (city level and above). FOR location IN - SELECT rank_address FROM placex + SELECT rank_address + FROM placex, + LATERAL compute_place_rank(country_code, 'A', class, type, + admin_level, False, null) prank WHERE osm_type = 'R' - and rank_address = NEW.rank_address + and ((class = 'place' and prank.address_rank = NEW.rank_address) + or (class = 'boundary' and rank_address = NEW.rank_address)) and geometry && NEW.centroid and _ST_Covers(geometry, NEW.centroid) LIMIT 1 LOOP @@ -983,7 +997,7 @@ BEGIN {% if debug %}RAISE WARNING 'Got parent details from search name';{% endif %} -- determine postcode - NEW.postcode := coalesce(token_normalized_postcode(NEW.address->'postcode'), + NEW.postcode := coalesce(token_get_postcode(NEW.token_info), location.postcode, get_nearest_postcode(NEW.country_code, NEW.centroid)); @@ -1023,7 +1037,7 @@ BEGIN {% if debug %}RAISE WARNING 'Using full index mode for % %', NEW.osm_type, NEW.osm_id;{% endif %} IF linked_place is not null THEN -- Recompute the ranks here as the ones from the linked place might - -- have been shifted to accomodate surrounding boundaries. + -- have been shifted to accommodate surrounding boundaries. SELECT place_id, osm_id, class, type, extratags, centroid, geometry, (compute_place_rank(country_code, osm_type, class, type, admin_level, @@ -1088,13 +1102,22 @@ BEGIN END IF; END IF; + {% if not disable_diff_updates %} + IF OLD.rank_address != NEW.rank_address THEN + -- After a rank shift all addresses containing us must be updated. + UPDATE placex p SET indexed_status = 2 FROM place_addressline pa + WHERE pa.address_place_id = NEW.place_id and p.place_id = pa.place_id + and p.indexed_status = 0 and p.rank_address between 4 and 25; + END IF; + {% endif %} + IF NEW.admin_level = 2 AND NEW.class = 'boundary' AND NEW.type = 'administrative' AND NEW.country_code IS NOT NULL AND NEW.osm_type = 'R' THEN -- Update the list of country names. -- Only take the name from the largest area for the given country code - -- in the hope that this is the authoritive one. + -- in the hope that this is the authoritative one. -- Also replace any old names so that all mapping mistakes can -- be fixed through regular OSM updates. FOR location IN @@ -1141,8 +1164,7 @@ BEGIN {% if debug %}RAISE WARNING 'RETURN insert_addresslines: %, %, %', NEW.parent_place_id, NEW.postcode, nameaddress_vector;{% endif %} - NEW.postcode := coalesce(token_normalized_postcode(NEW.address->'postcode'), - NEW.postcode); + NEW.postcode := coalesce(token_get_postcode(NEW.token_info), NEW.postcode); -- if we have a name add this to the name search table IF NEW.name IS NOT NULL THEN @@ -1183,7 +1205,7 @@ BEGIN NEW.postcode := get_nearest_postcode(NEW.country_code, NEW.geometry); END IF; - {% if debug %}RAISE WARNING 'place update % % finsihed.', NEW.osm_type, NEW.osm_id;{% endif %} + {% if debug %}RAISE WARNING 'place update % % finished.', NEW.osm_type, NEW.osm_id;{% endif %} NEW.token_info := token_strip_info(NEW.token_info); RETURN NEW;