liquid_feedback_core

annotate update/core-update.v1.2.1-v1.2.2.sql @ 610:22c6d1da7d78

Bugfix regarding "issue_privilege"."voting_right" in "delegation_chain" function
author jbe
date Sat May 16 17:59:54 2020 +0200 (2020-05-16)
parents 598af132a6f9
children
rev   line source
jbe@61 1 BEGIN;
jbe@61 2
jbe@61 3 CREATE OR REPLACE VIEW "liquid_feedback_version" AS
jbe@61 4 SELECT * FROM (VALUES ('1.2.2', 1, 2, 2))
jbe@61 5 AS "subquery"("string", "major", "minor", "revision");
jbe@61 6
jbe@61 7 ALTER TABLE "issue" DROP CONSTRAINT "clean_restriction";
jbe@61 8
jbe@61 9 ALTER TABLE "issue" ADD CONSTRAINT "only_closed_issues_may_be_cleaned"
jbe@61 10 CHECK ("cleaned" ISNULL OR "closed" NOTNULL);
jbe@61 11
jbe@61 12 ALTER VIEW "battle" RENAME TO "battle_view";
jbe@61 13
jbe@61 14 CREATE TABLE "battle" (
jbe@61 15 PRIMARY KEY ("issue_id", "winning_initiative_id", "losing_initiative_id"),
jbe@61 16 "issue_id" INT4,
jbe@61 17 "winning_initiative_id" INT4,
jbe@61 18 FOREIGN KEY ("issue_id", "winning_initiative_id") REFERENCES "initiative" ("issue_id", "id") ON DELETE CASCADE ON UPDATE CASCADE,
jbe@61 19 "losing_initiative_id" INT4,
jbe@61 20 FOREIGN KEY ("issue_id", "losing_initiative_id") REFERENCES "initiative" ("issue_id", "id") ON DELETE CASCADE ON UPDATE CASCADE,
jbe@61 21 "count" INT4 NOT NULL);
jbe@61 22
jbe@61 23 COMMENT ON TABLE "battle" IS 'Number of members preferring one initiative to another; Filled by "battle_view" when closing an issue';
jbe@61 24
jbe@61 25 CREATE OR REPLACE VIEW "battle_view" AS
jbe@61 26 SELECT
jbe@61 27 "issue"."id" AS "issue_id",
jbe@61 28 "winning_initiative"."id" AS "winning_initiative_id",
jbe@61 29 "losing_initiative"."id" AS "losing_initiative_id",
jbe@61 30 sum(
jbe@61 31 CASE WHEN
jbe@61 32 coalesce("better_vote"."grade", 0) >
jbe@61 33 coalesce("worse_vote"."grade", 0)
jbe@61 34 THEN "direct_voter"."weight" ELSE 0 END
jbe@61 35 ) AS "count"
jbe@61 36 FROM "issue"
jbe@61 37 LEFT JOIN "direct_voter"
jbe@61 38 ON "issue"."id" = "direct_voter"."issue_id"
jbe@61 39 JOIN "initiative" AS "winning_initiative"
jbe@61 40 ON "issue"."id" = "winning_initiative"."issue_id"
jbe@61 41 AND "winning_initiative"."agreed"
jbe@61 42 JOIN "initiative" AS "losing_initiative"
jbe@61 43 ON "issue"."id" = "losing_initiative"."issue_id"
jbe@61 44 AND "losing_initiative"."agreed"
jbe@61 45 LEFT JOIN "vote" AS "better_vote"
jbe@61 46 ON "direct_voter"."member_id" = "better_vote"."member_id"
jbe@61 47 AND "winning_initiative"."id" = "better_vote"."initiative_id"
jbe@61 48 LEFT JOIN "vote" AS "worse_vote"
jbe@61 49 ON "direct_voter"."member_id" = "worse_vote"."member_id"
jbe@61 50 AND "losing_initiative"."id" = "worse_vote"."initiative_id"
jbe@61 51 WHERE "issue"."closed" NOTNULL
jbe@61 52 AND "issue"."cleaned" ISNULL
jbe@61 53 AND "winning_initiative"."id" != "losing_initiative"."id"
jbe@61 54 GROUP BY
jbe@61 55 "issue"."id",
jbe@61 56 "winning_initiative"."id",
jbe@61 57 "losing_initiative"."id";
jbe@61 58
jbe@61 59 COMMENT ON VIEW "battle_view" IS 'Number of members preferring one initiative to another; Used to fill "battle" table';
jbe@61 60
jbe@61 61 INSERT INTO "battle" (
jbe@61 62 "issue_id",
jbe@61 63 "winning_initiative_id",
jbe@61 64 "losing_initiative_id",
jbe@61 65 "count"
jbe@61 66 ) SELECT
jbe@61 67 "issue_id",
jbe@61 68 "winning_initiative_id", "losing_initiative_id",
jbe@61 69 "count"
jbe@61 70 FROM "battle_view";
jbe@61 71
jbe@61 72 CREATE OR REPLACE FUNCTION "close_voting"("issue_id_p" "issue"."id"%TYPE)
jbe@61 73 RETURNS VOID
jbe@61 74 LANGUAGE 'plpgsql' VOLATILE AS $$
jbe@61 75 DECLARE
jbe@61 76 "issue_row" "issue"%ROWTYPE;
jbe@61 77 "member_id_v" "member"."id"%TYPE;
jbe@61 78 BEGIN
jbe@61 79 PERFORM "global_lock"();
jbe@61 80 SELECT * INTO "issue_row" FROM "issue" WHERE "id" = "issue_id_p";
jbe@61 81 DELETE FROM "delegating_voter"
jbe@61 82 WHERE "issue_id" = "issue_id_p";
jbe@61 83 DELETE FROM "direct_voter"
jbe@61 84 WHERE "issue_id" = "issue_id_p"
jbe@61 85 AND "autoreject" = TRUE;
jbe@61 86 DELETE FROM "direct_voter" USING "member"
jbe@61 87 WHERE "direct_voter"."member_id" = "member"."id"
jbe@61 88 AND "direct_voter"."issue_id" = "issue_id_p"
jbe@61 89 AND "member"."active" = FALSE;
jbe@61 90 UPDATE "direct_voter" SET "weight" = 1
jbe@61 91 WHERE "issue_id" = "issue_id_p";
jbe@61 92 PERFORM "add_vote_delegations"("issue_id_p");
jbe@61 93 FOR "member_id_v" IN
jbe@61 94 SELECT "interest"."member_id"
jbe@61 95 FROM "interest"
jbe@61 96 LEFT JOIN "direct_voter"
jbe@61 97 ON "interest"."member_id" = "direct_voter"."member_id"
jbe@61 98 AND "interest"."issue_id" = "direct_voter"."issue_id"
jbe@61 99 LEFT JOIN "delegating_voter"
jbe@61 100 ON "interest"."member_id" = "delegating_voter"."member_id"
jbe@61 101 AND "interest"."issue_id" = "delegating_voter"."issue_id"
jbe@61 102 WHERE "interest"."issue_id" = "issue_id_p"
jbe@61 103 AND "interest"."autoreject" = TRUE
jbe@61 104 AND "direct_voter"."member_id" ISNULL
jbe@61 105 AND "delegating_voter"."member_id" ISNULL
jbe@61 106 UNION SELECT "membership"."member_id"
jbe@61 107 FROM "membership"
jbe@61 108 LEFT JOIN "interest"
jbe@61 109 ON "membership"."member_id" = "interest"."member_id"
jbe@61 110 AND "interest"."issue_id" = "issue_id_p"
jbe@61 111 LEFT JOIN "direct_voter"
jbe@61 112 ON "membership"."member_id" = "direct_voter"."member_id"
jbe@61 113 AND "direct_voter"."issue_id" = "issue_id_p"
jbe@61 114 LEFT JOIN "delegating_voter"
jbe@61 115 ON "membership"."member_id" = "delegating_voter"."member_id"
jbe@61 116 AND "delegating_voter"."issue_id" = "issue_id_p"
jbe@61 117 WHERE "membership"."area_id" = "issue_row"."area_id"
jbe@61 118 AND "membership"."autoreject" = TRUE
jbe@61 119 AND "interest"."autoreject" ISNULL
jbe@61 120 AND "direct_voter"."member_id" ISNULL
jbe@61 121 AND "delegating_voter"."member_id" ISNULL
jbe@61 122 LOOP
jbe@61 123 INSERT INTO "direct_voter"
jbe@61 124 ("member_id", "issue_id", "weight", "autoreject") VALUES
jbe@61 125 ("member_id_v", "issue_id_p", 1, TRUE);
jbe@61 126 INSERT INTO "vote" (
jbe@61 127 "member_id",
jbe@61 128 "issue_id",
jbe@61 129 "initiative_id",
jbe@61 130 "grade"
jbe@61 131 ) SELECT
jbe@61 132 "member_id_v" AS "member_id",
jbe@61 133 "issue_id_p" AS "issue_id",
jbe@61 134 "id" AS "initiative_id",
jbe@61 135 -1 AS "grade"
jbe@61 136 FROM "initiative" WHERE "issue_id" = "issue_id_p";
jbe@61 137 END LOOP;
jbe@61 138 PERFORM "add_vote_delegations"("issue_id_p");
jbe@61 139 UPDATE "issue" SET
jbe@61 140 "closed" = now(),
jbe@61 141 "voter_count" = (
jbe@61 142 SELECT coalesce(sum("weight"), 0)
jbe@61 143 FROM "direct_voter" WHERE "issue_id" = "issue_id_p"
jbe@61 144 )
jbe@61 145 WHERE "id" = "issue_id_p";
jbe@61 146 UPDATE "initiative" SET
jbe@61 147 "positive_votes" = "vote_counts"."positive_votes",
jbe@61 148 "negative_votes" = "vote_counts"."negative_votes",
jbe@61 149 "agreed" = CASE WHEN "majority_strict" THEN
jbe@61 150 "vote_counts"."positive_votes" * "majority_den" >
jbe@61 151 "majority_num" *
jbe@61 152 ("vote_counts"."positive_votes"+"vote_counts"."negative_votes")
jbe@61 153 ELSE
jbe@61 154 "vote_counts"."positive_votes" * "majority_den" >=
jbe@61 155 "majority_num" *
jbe@61 156 ("vote_counts"."positive_votes"+"vote_counts"."negative_votes")
jbe@61 157 END
jbe@61 158 FROM
jbe@61 159 ( SELECT
jbe@61 160 "initiative"."id" AS "initiative_id",
jbe@61 161 coalesce(
jbe@61 162 sum(
jbe@61 163 CASE WHEN "grade" > 0 THEN "direct_voter"."weight" ELSE 0 END
jbe@61 164 ),
jbe@61 165 0
jbe@61 166 ) AS "positive_votes",
jbe@61 167 coalesce(
jbe@61 168 sum(
jbe@61 169 CASE WHEN "grade" < 0 THEN "direct_voter"."weight" ELSE 0 END
jbe@61 170 ),
jbe@61 171 0
jbe@61 172 ) AS "negative_votes"
jbe@61 173 FROM "initiative"
jbe@61 174 JOIN "issue" ON "initiative"."issue_id" = "issue"."id"
jbe@61 175 JOIN "policy" ON "issue"."policy_id" = "policy"."id"
jbe@61 176 LEFT JOIN "direct_voter"
jbe@61 177 ON "direct_voter"."issue_id" = "initiative"."issue_id"
jbe@61 178 LEFT JOIN "vote"
jbe@61 179 ON "vote"."initiative_id" = "initiative"."id"
jbe@61 180 AND "vote"."member_id" = "direct_voter"."member_id"
jbe@61 181 WHERE "initiative"."issue_id" = "issue_id_p"
jbe@61 182 AND "initiative"."admitted" -- NOTE: NULL case is handled too
jbe@61 183 GROUP BY "initiative"."id"
jbe@61 184 ) AS "vote_counts",
jbe@61 185 "issue",
jbe@61 186 "policy"
jbe@61 187 WHERE "vote_counts"."initiative_id" = "initiative"."id"
jbe@61 188 AND "issue"."id" = "initiative"."issue_id"
jbe@61 189 AND "policy"."id" = "issue"."policy_id";
jbe@61 190 -- NOTE: "closed" column of issue must be set at this point
jbe@61 191 DELETE FROM "battle" WHERE "issue_id" = "issue_id_p";
jbe@61 192 INSERT INTO "battle" (
jbe@61 193 "issue_id",
jbe@61 194 "winning_initiative_id", "losing_initiative_id",
jbe@61 195 "count"
jbe@61 196 ) SELECT
jbe@61 197 "issue_id",
jbe@61 198 "winning_initiative_id", "losing_initiative_id",
jbe@61 199 "count"
jbe@61 200 FROM "battle_view" WHERE "issue_id" = "issue_id_p";
jbe@61 201 END;
jbe@61 202 $$;
jbe@61 203
jbe@61 204 COMMIT;

Impressum / About Us