X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/bdaa39573ffe032214ec31f763ec0110401d7e4f..5a6da83577935cf4622efa6c7ec32baf80d370fc:/sql/partition-functions.src.sql?ds=sidebyside diff --git a/sql/partition-functions.src.sql b/sql/partition-functions.src.sql index 07e99c97..97520f99 100644 --- a/sql/partition-functions.src.sql +++ b/sql/partition-functions.src.sql @@ -10,7 +10,29 @@ CREATE TYPE nearfeaturecentr AS ( centroid GEOMETRY ); -create or replace function getNearFeatures(in_partition INTEGER, feature GEOMETRY, maxrank INTEGER, isin_tokens INT[]) RETURNS setof nearfeaturecentr AS $$ + -- feature intersects geoemtry + -- for areas and linestrings they must touch at least along a line +CREATE OR REPLACE FUNCTION is_relevant_geometry(de9im TEXT, geom_type TEXT) +RETURNS BOOLEAN +AS $$ +BEGIN + IF substring(de9im from 1 for 2) != 'FF' THEN + RETURN TRUE; + END IF; + + IF geom_type = 'ST_Point' THEN + RETURN substring(de9im from 4 for 1) = '0'; + END IF; + + IF geom_type in ('ST_LineString', 'ST_MultiLineString') THEN + RETURN substring(de9im from 4 for 1) = '1'; + END IF; + + RETURN substring(de9im from 4 for 1) = '2'; +END +$$ LANGUAGE plpgsql IMMUTABLE; + +create or replace function getNearFeatures(in_partition INTEGER, feature GEOMETRY, maxrank INTEGER) RETURNS setof nearfeaturecentr AS $$ DECLARE r nearfeaturecentr%rowtype; BEGIN @@ -20,15 +42,10 @@ BEGIN FOR r IN SELECT place_id, keywords, rank_address, rank_search, min(ST_Distance(feature, centroid)) as distance, isguess, postcode, centroid FROM location_area_large_-partition- - WHERE ST_Intersects(geometry, feature) and rank_search < maxrank + WHERE geometry && feature + AND is_relevant_geometry(ST_Relate(geometry, feature), ST_GeometryType(feature)) + AND rank_address < maxrank GROUP BY place_id, keywords, rank_address, rank_search, isguess, postcode, centroid - ORDER BY rank_address, isin_tokens && keywords desc, isguess asc, - ST_Distance(feature, centroid) * - CASE - WHEN rank_address = 16 AND rank_search = 15 THEN 0.2 -- capital city - WHEN rank_address = 16 AND rank_search = 16 THEN 0.25 -- city - WHEN rank_address = 16 AND rank_search = 17 THEN 0.5 -- town - ELSE 1 END ASC -- everything else LOOP RETURN NEXT r; END LOOP; @@ -39,7 +56,7 @@ BEGIN RAISE EXCEPTION 'Unknown partition %', in_partition; END $$ -LANGUAGE plpgsql; +LANGUAGE plpgsql STABLE; create or replace function deleteLocationArea(in_partition INTEGER, in_place_id BIGINT, in_rank_search INTEGER) RETURNS BOOLEAN AS $$ DECLARE @@ -136,7 +153,7 @@ BEGIN FROM search_name_-partition- WHERE name_vector && isin_token AND centroid && ST_Expand(point, 0.04) - AND search_rank between 16 and 22 + AND search_rank between 16 and 25 ORDER BY ST_Distance(centroid, point) ASC limit 1; RETURN parent; END IF; @@ -145,7 +162,7 @@ BEGIN RAISE EXCEPTION 'Unknown partition %', in_partition; END $$ -LANGUAGE plpgsql; +LANGUAGE plpgsql STABLE; create or replace function insertSearchName( @@ -254,7 +271,7 @@ BEGIN RAISE EXCEPTION 'Unknown partition %', in_partition; END $$ -LANGUAGE plpgsql IMMUTABLE; +LANGUAGE plpgsql STABLE; CREATE OR REPLACE FUNCTION getNearestParallelRoadFeature(in_partition INTEGER, line GEOMETRY) @@ -298,4 +315,4 @@ BEGIN RAISE EXCEPTION 'Unknown partition %', in_partition; END $$ -LANGUAGE plpgsql IMMUTABLE; +LANGUAGE plpgsql STABLE;