liquid_feedback_core

annotate update/core-update.v1.2.8-v1.2.9.sql @ 142:54ac8c473263

Use an improved definition for "disqualified" initiatives

"initiative"."disqualified" is TRUE, if the initiative may not win, because it either (a) has no better rank than the status quo, or (b) because there exists a better ranked initiative X, which directly beats this initiative, and either more voters prefer X to this initiative than voters preferring X to the status quo or less voters prefer this initiative to X than voters preferring the status quo to X
author jbe
date Wed Jun 01 16:58:00 2011 +0200 (2011-06-01)
parents e588fdf1676e
children
rev   line source
jbe@87 1 BEGIN;
jbe@87 2
jbe@87 3 CREATE OR REPLACE VIEW "liquid_feedback_version" AS
jbe@87 4 SELECT * FROM (VALUES ('1.2.9', 1, 2, 9))
jbe@87 5 AS "subquery"("string", "major", "minor", "revision");
jbe@87 6
jbe@87 7 CREATE OR REPLACE FUNCTION "close_voting"("issue_id_p" "issue"."id"%TYPE)
jbe@87 8 RETURNS VOID
jbe@87 9 LANGUAGE 'plpgsql' VOLATILE AS $$
jbe@87 10 DECLARE
jbe@87 11 "issue_row" "issue"%ROWTYPE;
jbe@87 12 "member_id_v" "member"."id"%TYPE;
jbe@87 13 BEGIN
jbe@87 14 PERFORM "lock_issue"("issue_id_p");
jbe@87 15 SELECT * INTO "issue_row" FROM "issue" WHERE "id" = "issue_id_p";
jbe@87 16 DELETE FROM "delegating_voter"
jbe@87 17 WHERE "issue_id" = "issue_id_p";
jbe@87 18 DELETE FROM "direct_voter"
jbe@87 19 WHERE "issue_id" = "issue_id_p"
jbe@87 20 AND "autoreject" = TRUE;
jbe@87 21 DELETE FROM "direct_voter" USING "member"
jbe@87 22 WHERE "direct_voter"."member_id" = "member"."id"
jbe@87 23 AND "direct_voter"."issue_id" = "issue_id_p"
jbe@87 24 AND "member"."active" = FALSE;
jbe@87 25 UPDATE "direct_voter" SET "weight" = 1
jbe@87 26 WHERE "issue_id" = "issue_id_p";
jbe@87 27 PERFORM "add_vote_delegations"("issue_id_p");
jbe@87 28 FOR "member_id_v" IN
jbe@87 29 SELECT "interest"."member_id"
jbe@87 30 FROM "interest"
jbe@87 31 JOIN "member"
jbe@87 32 ON "interest"."member_id" = "member"."id"
jbe@87 33 LEFT JOIN "direct_voter"
jbe@87 34 ON "interest"."member_id" = "direct_voter"."member_id"
jbe@87 35 AND "interest"."issue_id" = "direct_voter"."issue_id"
jbe@87 36 LEFT JOIN "delegating_voter"
jbe@87 37 ON "interest"."member_id" = "delegating_voter"."member_id"
jbe@87 38 AND "interest"."issue_id" = "delegating_voter"."issue_id"
jbe@87 39 WHERE "interest"."issue_id" = "issue_id_p"
jbe@87 40 AND "interest"."autoreject" = TRUE
jbe@87 41 AND "member"."active"
jbe@87 42 AND "direct_voter"."member_id" ISNULL
jbe@87 43 AND "delegating_voter"."member_id" ISNULL
jbe@87 44 UNION SELECT "membership"."member_id"
jbe@87 45 FROM "membership"
jbe@87 46 JOIN "member"
jbe@87 47 ON "membership"."member_id" = "member"."id"
jbe@87 48 LEFT JOIN "interest"
jbe@87 49 ON "membership"."member_id" = "interest"."member_id"
jbe@87 50 AND "interest"."issue_id" = "issue_id_p"
jbe@87 51 LEFT JOIN "direct_voter"
jbe@87 52 ON "membership"."member_id" = "direct_voter"."member_id"
jbe@87 53 AND "direct_voter"."issue_id" = "issue_id_p"
jbe@87 54 LEFT JOIN "delegating_voter"
jbe@87 55 ON "membership"."member_id" = "delegating_voter"."member_id"
jbe@87 56 AND "delegating_voter"."issue_id" = "issue_id_p"
jbe@87 57 WHERE "membership"."area_id" = "issue_row"."area_id"
jbe@87 58 AND "membership"."autoreject" = TRUE
jbe@87 59 AND "member"."active"
jbe@87 60 AND "interest"."autoreject" ISNULL
jbe@87 61 AND "direct_voter"."member_id" ISNULL
jbe@87 62 AND "delegating_voter"."member_id" ISNULL
jbe@87 63 LOOP
jbe@87 64 INSERT INTO "direct_voter"
jbe@87 65 ("member_id", "issue_id", "weight", "autoreject") VALUES
jbe@87 66 ("member_id_v", "issue_id_p", 1, TRUE);
jbe@87 67 INSERT INTO "vote" (
jbe@87 68 "member_id",
jbe@87 69 "issue_id",
jbe@87 70 "initiative_id",
jbe@87 71 "grade"
jbe@87 72 ) SELECT
jbe@87 73 "member_id_v" AS "member_id",
jbe@87 74 "issue_id_p" AS "issue_id",
jbe@87 75 "id" AS "initiative_id",
jbe@87 76 -1 AS "grade"
jbe@87 77 FROM "initiative" WHERE "issue_id" = "issue_id_p";
jbe@87 78 END LOOP;
jbe@87 79 PERFORM "add_vote_delegations"("issue_id_p");
jbe@87 80 UPDATE "issue" SET
jbe@87 81 "closed" = now(),
jbe@87 82 "voter_count" = (
jbe@87 83 SELECT coalesce(sum("weight"), 0)
jbe@87 84 FROM "direct_voter" WHERE "issue_id" = "issue_id_p"
jbe@87 85 )
jbe@87 86 WHERE "id" = "issue_id_p";
jbe@87 87 UPDATE "initiative" SET
jbe@87 88 "positive_votes" = "vote_counts"."positive_votes",
jbe@87 89 "negative_votes" = "vote_counts"."negative_votes",
jbe@87 90 "agreed" = CASE WHEN "majority_strict" THEN
jbe@87 91 "vote_counts"."positive_votes" * "majority_den" >
jbe@87 92 "majority_num" *
jbe@87 93 ("vote_counts"."positive_votes"+"vote_counts"."negative_votes")
jbe@87 94 ELSE
jbe@87 95 "vote_counts"."positive_votes" * "majority_den" >=
jbe@87 96 "majority_num" *
jbe@87 97 ("vote_counts"."positive_votes"+"vote_counts"."negative_votes")
jbe@87 98 END
jbe@87 99 FROM
jbe@87 100 ( SELECT
jbe@87 101 "initiative"."id" AS "initiative_id",
jbe@87 102 coalesce(
jbe@87 103 sum(
jbe@87 104 CASE WHEN "grade" > 0 THEN "direct_voter"."weight" ELSE 0 END
jbe@87 105 ),
jbe@87 106 0
jbe@87 107 ) AS "positive_votes",
jbe@87 108 coalesce(
jbe@87 109 sum(
jbe@87 110 CASE WHEN "grade" < 0 THEN "direct_voter"."weight" ELSE 0 END
jbe@87 111 ),
jbe@87 112 0
jbe@87 113 ) AS "negative_votes"
jbe@87 114 FROM "initiative"
jbe@87 115 JOIN "issue" ON "initiative"."issue_id" = "issue"."id"
jbe@87 116 JOIN "policy" ON "issue"."policy_id" = "policy"."id"
jbe@87 117 LEFT JOIN "direct_voter"
jbe@87 118 ON "direct_voter"."issue_id" = "initiative"."issue_id"
jbe@87 119 LEFT JOIN "vote"
jbe@87 120 ON "vote"."initiative_id" = "initiative"."id"
jbe@87 121 AND "vote"."member_id" = "direct_voter"."member_id"
jbe@87 122 WHERE "initiative"."issue_id" = "issue_id_p"
jbe@87 123 AND "initiative"."admitted" -- NOTE: NULL case is handled too
jbe@87 124 GROUP BY "initiative"."id"
jbe@87 125 ) AS "vote_counts",
jbe@87 126 "issue",
jbe@87 127 "policy"
jbe@87 128 WHERE "vote_counts"."initiative_id" = "initiative"."id"
jbe@87 129 AND "issue"."id" = "initiative"."issue_id"
jbe@87 130 AND "policy"."id" = "issue"."policy_id";
jbe@87 131 -- NOTE: "closed" column of issue must be set at this point
jbe@87 132 DELETE FROM "battle" WHERE "issue_id" = "issue_id_p";
jbe@87 133 INSERT INTO "battle" (
jbe@87 134 "issue_id",
jbe@87 135 "winning_initiative_id", "losing_initiative_id",
jbe@87 136 "count"
jbe@87 137 ) SELECT
jbe@87 138 "issue_id",
jbe@87 139 "winning_initiative_id", "losing_initiative_id",
jbe@87 140 "count"
jbe@87 141 FROM "battle_view" WHERE "issue_id" = "issue_id_p";
jbe@87 142 END;
jbe@87 143 $$;
jbe@87 144
jbe@87 145 COMMIT;

Impressum / About Us