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