liquid_feedback_core
view update/core-update.v2.0.0-v2.0.1.sql @ 211:b52a65f5b1d3
Update script from v2.0.0 to v2.0.1
| author | jbe | 
|---|---|
| date | Sat Jan 21 01:47:09 2012 +0100 (2012-01-21) | 
| parents | eee75cff3e5a | 
| children | c23b288fd771 | 
 line source
     1 BEGIN;
     3 CREATE OR REPLACE VIEW "liquid_feedback_version" AS
     4   SELECT * FROM (VALUES ('2.0.1', 2, 0, 1))
     5   AS "subquery"("string", "major", "minor", "revision");
     7 ALTER TABLE "issue" ALTER "state" SET DEFAULT 'admission';  -- fixes wrong update script from v1.3.1 to v1.4.0
     9 COMMENT ON COLUMN "member"."activated" IS 'Timestamp of first activation of account (i.e. usage of "invite_code"); required to be set for "active" members';
    10 COMMENT ON COLUMN "member"."statement" IS 'Freely chosen text of the member for his/her profile';
    12 COMMENT ON COLUMN "policy"."admission_time"    IS 'Maximum duration of issue state ''admission''; Maximum time an issue stays open without being "accepted"';
    13 COMMENT ON COLUMN "policy"."discussion_time"   IS 'Duration of issue state ''discussion''; Regular time until an issue is "half_frozen" after being "accepted"';
    14 COMMENT ON COLUMN "policy"."verification_time" IS 'Duration of issue state ''verification''; Regular time until an issue is "fully_frozen" (e.g. entering issue state ''voting'') after being "half_frozen"';
    15 COMMENT ON COLUMN "policy"."voting_time"       IS 'Duration of issue state ''voting''; Time after an issue is "fully_frozen" but not "closed" (duration of issue state ''voting'')';
    16 COMMENT ON COLUMN "policy"."issue_quorum_num"  IS   'Numerator of potential supporter quorum to be reached by one initiative of an issue to be "accepted" and enter issue state ''discussion''';
    17 COMMENT ON COLUMN "policy"."issue_quorum_den"  IS 'Denominator of potential supporter quorum to be reached by one initiative of an issue to be "accepted" and enter issue state ''discussion''';
    19 COMMENT ON COLUMN "unit"."active" IS 'TRUE means new issues can be created in areas of this area';
    21 CREATE TABLE "unit_setting" (
    22         PRIMARY KEY ("member_id", "key", "unit_id"),
    23         "member_id"             INT4            REFERENCES "member" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
    24         "key"                   TEXT            NOT NULL,
    25         "unit_id"               INT4            REFERENCES "unit" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
    26         "value"                 TEXT            NOT NULL );
    28 COMMENT ON TABLE "unit_setting" IS 'Place for frontend to store unit specific settings of members as strings';
    30 COMMENT ON COLUMN "initiative"."discussion_url"         IS 'URL pointing to a discussion platform for this initiative';
    31 COMMENT ON COLUMN "initiative"."revoked"                IS 'Point in time, when one initiator decided to revoke the initiative';
    32 COMMENT ON COLUMN "initiative"."revoked_by_member_id"   IS 'Member, who decided to revoke the initiative';
    33 COMMENT ON COLUMN "initiative"."admitted"               IS 'TRUE, if initiative reaches the "initiative_quorum" when freezing the issue';
    34 COMMENT ON COLUMN "initiative"."positive_votes"         IS 'Calculated from table "direct_voter"';
    35 COMMENT ON COLUMN "initiative"."negative_votes"         IS 'Calculated from table "direct_voter"';
    36 COMMENT ON COLUMN "initiative"."direct_majority"        IS 'TRUE, if "positive_votes"/("positive_votes"+"negative_votes") is strictly greater or greater-equal than "direct_majority_num"/"direct_majority_den", and "positive_votes" is greater-equal than "direct_majority_positive", and ("positive_votes"+abstentions) is greater-equal than "direct_majority_non_negative"';
    37 COMMENT ON COLUMN "initiative"."indirect_majority"      IS 'Same as "direct_majority", but also considering indirect beat paths';
    38 COMMENT ON COLUMN "initiative"."schulze_rank"           IS 'Schulze-Ranking without tie-breaking';
    39 COMMENT ON COLUMN "initiative"."better_than_status_quo" IS 'TRUE, if initiative has a schulze-ranking better than the status quo (without tie-breaking)';
    40 COMMENT ON COLUMN "initiative"."worse_than_status_quo"  IS 'TRUE, if initiative has a schulze-ranking worse than the status quo (without tie-breaking)';
    41 COMMENT ON COLUMN "initiative"."reverse_beat_path"      IS 'TRUE, if there is a beat path (may include ties) from this initiative to the status quo';
    42 COMMENT ON COLUMN "initiative"."multistage_majority"    IS 'TRUE, if either (a) this initiative has no better rank than the status quo, or (b) 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';
    43 COMMENT ON COLUMN "initiative"."eligible"               IS 'Initiative has a "direct_majority" and an "indirect_majority", is "better_than_status_quo" and depending on selected policy the initiative has no "reverse_beat_path" or "multistage_majority"';
    44 COMMENT ON COLUMN "initiative"."winner"                 IS 'Winner is the "eligible" initiative with best "schulze_rank" and in case of ties with lowest "id"';
    45 COMMENT ON COLUMN "initiative"."rank"                   IS 'Unique ranking for all "admitted" initiatives per issue; lower rank is better; a winner always has rank 1, but rank 1 does not imply that an initiative is winner; initiatives with "direct_majority" AND "indirect_majority" always have a better (lower) rank than other initiatives';
    47 COMMENT ON COLUMN "privilege"."admin_manager"        IS 'Grant/revoke admin privileges to/from other members';
    48 COMMENT ON COLUMN "privilege"."unit_manager"         IS 'Create and disable sub units';
    49 COMMENT ON COLUMN "privilege"."area_manager"         IS 'Create and disable areas and set area parameters';
    50 COMMENT ON COLUMN "privilege"."voting_right_manager" IS 'Select which members are allowed to discuss and vote within the unit';
    52 COMMENT ON COLUMN "supporter"."issue_id" IS 'WARNING: No index: For selections use column "initiative_id" and join via table "initiative" where neccessary';
    54 ALTER TABLE "direct_supporter_snapshot" ADD COLUMN "draft_id" INT8;
    56 UPDATE "direct_supporter_snapshot" SET "draft_id" = "supporter"."draft_id" FROM "supporter" WHERE "direct_supporter_snapshot"."initiative_id" = "supporter"."initiative_id" AND "direct_supporter_snapshot"."member_id" = "supporter"."member_id";
    57 UPDATE "direct_supporter_snapshot" SET "draft_id" = "current_draft"."id" FROM "current_draft" WHERE "direct_supporter_snapshot"."initiative_id" = "current_draft"."initiative_id" AND "direct_supporter_snapshot"."draft_id" ISNULL;
    59 ALTER TABLE "direct_supporter_snapshot" ADD FOREIGN KEY ("initiative_id", "draft_id") REFERENCES "draft" ("initiative_id", "id") ON DELETE NO ACTION ON UPDATE CASCADE;
    60 ALTER TABLE "direct_supporter_snapshot" ALTER COLUMN "draft_id" SET NOT NULL;
    62 COMMENT ON COLUMN "direct_supporter_snapshot"."issue_id"  IS 'WARNING: No index: For selections use column "initiative_id" and join via table "initiative" where neccessary';
    64 COMMENT ON COLUMN "direct_voter"."weight" IS 'Weight of member (1 or higher) according to "delegating_voter" table';
    66 COMMENT ON COLUMN "vote"."issue_id" IS 'WARNING: No index: For selections use column "initiative_id" and join via table "initiative" where neccessary';
    67 COMMENT ON COLUMN "vote"."grade"    IS 'Values smaller than zero mean reject, values greater than zero mean acceptance, zero or missing row means abstention. Preferences are expressed by different positive or negative numbers.';
    69 CREATE OR REPLACE FUNCTION "create_interest_snapshot"
    70   ( "issue_id_p" "issue"."id"%TYPE )
    71   RETURNS VOID
    72   LANGUAGE 'plpgsql' VOLATILE AS $$
    73     DECLARE
    74       "member_id_v" "member"."id"%TYPE;
    75     BEGIN
    76       DELETE FROM "direct_interest_snapshot"
    77         WHERE "issue_id" = "issue_id_p"
    78         AND "event" = 'periodic';
    79       DELETE FROM "delegating_interest_snapshot"
    80         WHERE "issue_id" = "issue_id_p"
    81         AND "event" = 'periodic';
    82       DELETE FROM "direct_supporter_snapshot"
    83         WHERE "issue_id" = "issue_id_p"
    84         AND "event" = 'periodic';
    85       INSERT INTO "direct_interest_snapshot"
    86         ("issue_id", "event", "member_id")
    87         SELECT
    88           "issue_id_p"  AS "issue_id",
    89           'periodic'    AS "event",
    90           "member"."id" AS "member_id"
    91         FROM "issue"
    92         JOIN "area" ON "issue"."area_id" = "area"."id"
    93         JOIN "interest" ON "issue"."id" = "interest"."issue_id"
    94         JOIN "member" ON "interest"."member_id" = "member"."id"
    95         JOIN "privilege"
    96           ON "privilege"."unit_id" = "area"."unit_id"
    97           AND "privilege"."member_id" = "member"."id"
    98         WHERE "issue"."id" = "issue_id_p"
    99         AND "member"."active" AND "privilege"."voting_right";
   100       FOR "member_id_v" IN
   101         SELECT "member_id" FROM "direct_interest_snapshot"
   102         WHERE "issue_id" = "issue_id_p"
   103         AND "event" = 'periodic'
   104       LOOP
   105         UPDATE "direct_interest_snapshot" SET
   106           "weight" = 1 +
   107             "weight_of_added_delegations_for_interest_snapshot"(
   108               "issue_id_p",
   109               "member_id_v",
   110               '{}'
   111             )
   112           WHERE "issue_id" = "issue_id_p"
   113           AND "event" = 'periodic'
   114           AND "member_id" = "member_id_v";
   115       END LOOP;
   116        INSERT INTO "direct_supporter_snapshot"
   117         ( "issue_id", "initiative_id", "event", "member_id",
   118           "draft_id", "informed", "satisfied" )
   119         SELECT
   120           "issue_id_p"            AS "issue_id",
   121           "initiative"."id"       AS "initiative_id",
   122           'periodic'              AS "event",
   123           "supporter"."member_id" AS "member_id",
   124           "supporter"."draft_id"  AS "draft_id",
   125           "supporter"."draft_id" = "current_draft"."id" AS "informed",
   126           NOT EXISTS (
   127             SELECT NULL FROM "critical_opinion"
   128             WHERE "initiative_id" = "initiative"."id"
   129             AND "member_id" = "supporter"."member_id"
   130           ) AS "satisfied"
   131         FROM "initiative"
   132         JOIN "supporter"
   133         ON "supporter"."initiative_id" = "initiative"."id"
   134         JOIN "current_draft"
   135         ON "initiative"."id" = "current_draft"."initiative_id"
   136         JOIN "direct_interest_snapshot"
   137         ON "supporter"."member_id" = "direct_interest_snapshot"."member_id"
   138         AND "initiative"."issue_id" = "direct_interest_snapshot"."issue_id"
   139         AND "event" = 'periodic'
   140         WHERE "initiative"."issue_id" = "issue_id_p";
   141       RETURN;
   142     END;
   143   $$;
   145 CREATE OR REPLACE FUNCTION "delete_private_data"()
   146   RETURNS VOID
   147   LANGUAGE 'plpgsql' VOLATILE AS $$
   148     BEGIN
   149       UPDATE "member" SET
   150         "invite_code"                  = NULL,
   151         "last_login"                   = NULL,
   152         "login"                        = NULL,
   153         "password"                     = NULL,
   154         "notify_email"                 = NULL,
   155         "notify_email_unconfirmed"     = NULL,
   156         "notify_email_secret"          = NULL,
   157         "notify_email_secret_expiry"   = NULL,
   158         "notify_email_lock_expiry"     = NULL,
   159         "password_reset_secret"        = NULL,
   160         "password_reset_secret_expiry" = NULL,
   161         "organizational_unit"          = NULL,
   162         "internal_posts"               = NULL,
   163         "realname"                     = NULL,
   164         "birthday"                     = NULL,
   165         "address"                      = NULL,
   166         "email"                        = NULL,
   167         "xmpp_address"                 = NULL,
   168         "website"                      = NULL,
   169         "phone"                        = NULL,
   170         "mobile_phone"                 = NULL,
   171         "profession"                   = NULL,
   172         "external_memberships"         = NULL,
   173         "external_posts"               = NULL,
   174         "statement"                    = NULL;
   175       -- "text_search_data" is updated by triggers
   176       DELETE FROM "setting";
   177       DELETE FROM "setting_map";
   178       DELETE FROM "member_relation_setting";
   179       DELETE FROM "member_image";
   180       DELETE FROM "contact";
   181       DELETE FROM "ignored_member";
   182       DELETE FROM "area_setting";
   183       DELETE FROM "issue_setting";
   184       DELETE FROM "ignored_initiative";
   185       DELETE FROM "initiative_setting";
   186       DELETE FROM "suggestion_setting";
   187       DELETE FROM "non_voter";
   188       DELETE FROM "direct_voter" USING "issue"
   189         WHERE "direct_voter"."issue_id" = "issue"."id"
   190         AND "issue"."closed" ISNULL;
   191       RETURN;
   192     END;
   193   $$;
   195 COMMIT;
