# HG changeset patch # User jbe # Date 1519295095 -3600 # Node ID 3536fb4148dc055cd99799375986daf210af4dd8 # Parent eb5f4e4f17d816ab7d652043fac029b69774ca5a# Parent f28662013308ef2e57aa6744a9e839b5495582b8 Merged experimental workaround for missing spatio-temporal index as commented-out section diff -r eb5f4e4f17d8 -r 3536fb4148dc core.sql --- a/core.sql Mon Oct 23 15:14:11 2017 +0200 +++ b/core.sql Thu Feb 22 11:24:55 2018 +0100 @@ -4554,6 +4554,86 @@ +------------------------ +-- Geospatial lookups -- +------------------------ + +/* +CREATE FUNCTION "closed_initiatives_in_bounding_box" + ( "bounding_box_p" EBOX, + "limit_p" INT4 ) + RETURNS SETOF "initiative" + LANGUAGE 'plpgsql' STABLE AS $$ + DECLARE + "limit_v" INT4; + "count_v" INT4; + BEGIN + "limit_v" := "limit_p" + 1; + LOOP + SELECT count(1) INTO "count_v" + FROM "initiative" + JOIN "issue" ON "issue"."id" = "initiative"."issue_id" + WHERE "issue"."closed" NOTNULL + AND GeoJSON_to_ecluster("initiative"."location") && "bounding_box_p" + LIMIT "limit_v"; + IF "count_v" < "limit_v" THEN + RETURN QUERY SELECT "initiative".* + FROM ( + SELECT + "initiative"."id" AS "initiative_id", + "issue"."closed" + FROM "initiative" + JOIN "issue" ON "issue"."id" = "initiative"."issue_id" + WHERE "issue"."closed" NOTNULL + AND GeoJSON_to_ecluster("initiative"."location") && "bounding_box_p" + ) AS "subquery" + JOIN "initiative" ON "initiative"."id" = "subquery"."initiative_id" + ORDER BY "subquery"."closed" DESC + LIMIT "limit_p"; + RETURN; + END IF; + SELECT count(1) INTO "count_v" + FROM ( + SELECT "initiative"."id" AS "initiative_id" + FROM "initiative" + JOIN "issue" ON "issue"."id" = "initiative"."issue_id" + WHERE "issue"."closed" NOTNULL + ORDER BY "closed" DESC + LIMIT "limit_v" + ) AS "subquery" + JOIN "initiative" ON "initiative"."id" = "subquery"."initiative_id" + WHERE GeoJSON_to_ecluster("initiative"."location") && "bounding_box_p" + LIMIT "limit_p"; + IF "count_v" >= "limit_p" THEN + RETURN QUERY SELECT "initiative".* + FROM ( + SELECT + "initiative"."id" AS "initiative_id", + "issue"."closed" + FROM "initiative" + JOIN "issue" ON "issue"."id" = "initiative"."issue_id" + WHERE "issue"."closed" NOTNULL + ORDER BY "closed" DESC + LIMIT "limit_v" + ) AS "subquery" + JOIN "initiative" ON "initiative"."id" = "subquery"."initiative_id" + WHERE GeoJSON_to_ecluster("initiative"."location") && "bounding_box_p" + ORDER BY "subquery"."closed" DESC + LIMIT "limit_p"; + RETURN; + END IF; + "limit_v" := "limit_v" * 2; + END LOOP; + END; + $$; + +COMMENT ON FUNCTION "closed_initiatives_in_bounding_box" + ( EBOX, INT4 ) + IS 'TODO'; +*/ + + + --------------------------- -- Transaction isolation -- ---------------------------