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;
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;
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
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;