From 5ec48c66cba0e9407135b2949f2a5e446d3620ed Mon Sep 17 00:00:00 2001 From: Sarah Hoffmann Date: Tue, 13 Oct 2020 14:57:11 +0200 Subject: [PATCH] move ordering out of getNearFeatures The two places where the function is called have different ordering requirement. --- sql/functions/placex_triggers.sql | 8 +++++++- sql/functions/postcode_triggers.sql | 4 ++-- sql/partition-functions.src.sql | 9 +-------- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/sql/functions/placex_triggers.sql b/sql/functions/placex_triggers.sql index 1f664a4a..9a5c6776 100644 --- a/sql/functions/placex_triggers.sql +++ b/sql/functions/placex_triggers.sql @@ -307,7 +307,13 @@ BEGIN END LOOP; FOR location IN - SELECT * FROM getNearFeatures(partition, geometry, maxrank, isin_tokens) + SELECT * FROM getNearFeatures(partition, geometry, maxrank) + ORDER BY rank_address, isin_tokens && keywords desc, isguess asc, + distance * + CASE WHEN rank_address = 16 AND rank_search = 15 THEN 0.2 + WHEN rank_address = 16 AND rank_search = 16 THEN 0.25 + WHEN rank_address = 16 AND rank_search = 18 THEN 0.5 + ELSE 1 END ASC LOOP IF location.rank_address != current_rank_address THEN current_rank_address := location.rank_address; diff --git a/sql/functions/postcode_triggers.sql b/sql/functions/postcode_triggers.sql index 96788d65..515b7666 100644 --- a/sql/functions/postcode_triggers.sql +++ b/sql/functions/postcode_triggers.sql @@ -27,8 +27,8 @@ BEGIN NEW.parent_place_id = 0; FOR location IN SELECT place_id - FROM getNearFeatures(partition, NEW.geometry, NEW.rank_search, '{}'::int[]) - WHERE NOT isguess ORDER BY rank_address DESC LIMIT 1 + FROM getNearFeatures(partition, NEW.geometry, NEW.rank_search) + WHERE NOT isguess ORDER BY rank_address DESC, distance asc LIMIT 1 LOOP NEW.parent_place_id = location.place_id; END LOOP; diff --git a/sql/partition-functions.src.sql b/sql/partition-functions.src.sql index e2342a9c..97520f99 100644 --- a/sql/partition-functions.src.sql +++ b/sql/partition-functions.src.sql @@ -32,7 +32,7 @@ BEGIN END $$ LANGUAGE plpgsql IMMUTABLE; -create or replace function getNearFeatures(in_partition INTEGER, feature GEOMETRY, maxrank INTEGER, isin_tokens INT[]) RETURNS setof nearfeaturecentr AS $$ +create or replace function getNearFeatures(in_partition INTEGER, feature GEOMETRY, maxrank INTEGER) RETURNS setof nearfeaturecentr AS $$ DECLARE r nearfeaturecentr%rowtype; BEGIN @@ -46,13 +46,6 @@ BEGIN 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; -- 2.39.5