liquid_feedback_core

view update/core-update.v3.2.1-v3.2.2.sql @ 520:053190248598

Allow a value of zero as "notification_sample_size" to disable featured initiatives
author jbe
date Wed May 04 21:44:18 2016 +0200 (2016-05-04)
parents
children 65bd17395c28
line source
1 BEGIN;
3 CREATE OR REPLACE VIEW "liquid_feedback_version" AS
4 SELECT * FROM (VALUES ('3.2.2', 3, 2, 2))
5 AS "subquery"("string", "major", "minor", "revision");
7 CREATE OR REPLACE FUNCTION "featured_initiative"
8 ( "recipient_id_p" "member"."id"%TYPE,
9 "area_id_p" "area"."id"%TYPE )
10 RETURNS SETOF "initiative"."id"%TYPE
11 LANGUAGE 'plpgsql' STABLE AS $$
12 DECLARE
13 "counter_v" "member"."notification_counter"%TYPE;
14 "sample_size_v" "member"."notification_sample_size"%TYPE;
15 "initiative_id_ary" INT4[]; --"initiative"."id"%TYPE[]
16 "match_v" BOOLEAN;
17 "member_id_v" "member"."id"%TYPE;
18 "seed_v" TEXT;
19 "initiative_id_v" "initiative"."id"%TYPE;
20 BEGIN
21 SELECT "notification_counter", "notification_sample_size"
22 INTO "counter_v", "sample_size_v"
23 FROM "member" WHERE "id" = "recipient_id_p";
24 IF COALESCE("sample_size_v" <= 0, TRUE) THEN
25 RETURN;
26 END IF;
27 "initiative_id_ary" := '{}';
28 LOOP
29 "match_v" := FALSE;
30 FOR "member_id_v", "seed_v" IN
31 SELECT * FROM (
32 SELECT DISTINCT
33 "supporter"."member_id",
34 md5(
35 "recipient_id_p" || '-' ||
36 "counter_v" || '-' ||
37 "area_id_p" || '-' ||
38 "supporter"."member_id"
39 ) AS "seed"
40 FROM "supporter"
41 JOIN "initiative" ON "initiative"."id" = "supporter"."initiative_id"
42 JOIN "issue" ON "issue"."id" = "initiative"."issue_id"
43 WHERE "supporter"."member_id" != "recipient_id_p"
44 AND "issue"."area_id" = "area_id_p"
45 AND "issue"."state" IN ('admission', 'discussion', 'verification')
46 ) AS "subquery"
47 ORDER BY "seed"
48 LOOP
49 SELECT "initiative"."id" INTO "initiative_id_v"
50 FROM "initiative"
51 JOIN "issue" ON "issue"."id" = "initiative"."issue_id"
52 JOIN "area" ON "area"."id" = "issue"."area_id"
53 JOIN "supporter" ON "supporter"."initiative_id" = "initiative"."id"
54 LEFT JOIN "supporter" AS "self_support" ON
55 "self_support"."initiative_id" = "initiative"."id" AND
56 "self_support"."member_id" = "recipient_id_p"
57 LEFT JOIN "privilege" ON
58 "privilege"."member_id" = "recipient_id_p" AND
59 "privilege"."unit_id" = "area"."unit_id" AND
60 "privilege"."voting_right" = TRUE
61 LEFT JOIN "subscription" ON
62 "subscription"."member_id" = "recipient_id_p" AND
63 "subscription"."unit_id" = "area"."unit_id"
64 LEFT JOIN "ignored_initiative" ON
65 "ignored_initiative"."member_id" = "recipient_id_p" AND
66 "ignored_initiative"."initiative_id" = "initiative"."id"
67 WHERE "supporter"."member_id" = "member_id_v"
68 AND "issue"."area_id" = "area_id_p"
69 AND "issue"."state" IN ('admission', 'discussion', 'verification')
70 AND "initiative"."revoked" ISNULL
71 AND "self_support"."member_id" ISNULL
72 AND NOT "initiative_id_ary" @> ARRAY["initiative"."id"]
73 AND (
74 "privilege"."member_id" NOTNULL OR
75 "subscription"."member_id" NOTNULL )
76 AND "ignored_initiative"."member_id" ISNULL
77 AND NOT EXISTS (
78 SELECT NULL FROM "draft"
79 JOIN "ignored_member" ON
80 "ignored_member"."member_id" = "recipient_id_p" AND
81 "ignored_member"."other_member_id" = "draft"."author_id"
82 WHERE "draft"."initiative_id" = "initiative"."id"
83 )
84 ORDER BY md5("seed_v" || '-' || "initiative"."id")
85 LIMIT 1;
86 IF FOUND THEN
87 "match_v" := TRUE;
88 RETURN NEXT "initiative_id_v";
89 IF array_length("initiative_id_ary", 1) + 1 >= "sample_size_v" THEN
90 RETURN;
91 END IF;
92 "initiative_id_ary" := "initiative_id_ary" || "initiative_id_v";
93 END IF;
94 END LOOP;
95 EXIT WHEN NOT "match_v";
96 END LOOP;
97 RETURN;
98 END;
99 $$;
101 COMMIT;

Impressum / About Us