liquid_feedback_core

diff core.sql @ 568:b1326d149247

New columns "issue_quorum" and "initiative_quorum" for "issue" table
author jbe
date Fri Sep 29 01:57:43 2017 +0200 (2017-09-29)
parents 797282760db4
children 622c71ca6428
line diff
     1.1 --- a/core.sql	Thu Sep 28 20:12:23 2017 +0200
     1.2 +++ b/core.sql	Fri Sep 29 01:57:43 2017 +0200
     1.3 @@ -769,6 +769,8 @@
     1.4          "full_freeze_snapshot_id" INT8,
     1.5          FOREIGN KEY ("id", "full_freeze_snapshot_id")
     1.6            REFERENCES "snapshot" ("issue_id", "id") ON DELETE RESTRICT ON UPDATE CASCADE,
     1.7 +        "issue_quorum"          INT4,
     1.8 +        "initiative_quorum"     INT4,
     1.9          "population"            INT4,
    1.10          "voter_count"           INT4,
    1.11          "status_quo_schulze_rank" INT4,
    1.12 @@ -841,6 +843,8 @@
    1.13  COMMENT ON COLUMN "issue"."admission_snapshot_id"   IS 'Snapshot id when issue as accepted or canceled in admission phase';
    1.14  COMMENT ON COLUMN "issue"."half_freeze_snapshot_id" IS 'Snapshot id at end of discussion phase';
    1.15  COMMENT ON COLUMN "issue"."full_freeze_snapshot_id" IS 'Snapshot id at end of verification phase';
    1.16 +COMMENT ON COLUMN "issue"."issue_quorum"            IS 'Calculated number of supporters needed by an initiative of the issue to be "accepted", i.e. pass from ''admission'' to ''discussion'' state';
    1.17 +COMMENT ON COLUMN "issue"."initiative_quorum"       IS 'Calculated number of satisfied supporters to be reached by an initiative to be "admitted" for voting';
    1.18  COMMENT ON COLUMN "issue"."population"              IS 'Count of members in "snapshot_population" table with "snapshot_id" equal to "issue"."latest_snapshot_id"';
    1.19  COMMENT ON COLUMN "issue"."voter_count"             IS 'Total number of direct and delegating voters; This value is related to the final voting, while "population" is related to snapshots before the final voting';
    1.20  COMMENT ON COLUMN "issue"."status_quo_schulze_rank" IS 'Schulze rank of status quo, as calculated by "calculate_ranks" function';
    1.21 @@ -3324,6 +3328,30 @@
    1.22  COMMENT ON VIEW "area_quorum" IS 'Area-based quorum considering number of open (accepted) issues';
    1.23  
    1.24  
    1.25 +CREATE VIEW "issue_quorum" AS
    1.26 +  SELECT DISTINCT ON ("issue_id")
    1.27 +    "issue"."id" AS "issue_id",
    1.28 +    "subquery"."issue_quorum"
    1.29 +  FROM "issue"
    1.30 +  CROSS JOIN LATERAL (
    1.31 +    SELECT "area_quorum"."issue_quorum"
    1.32 +    FROM "area_quorum" WHERE "area_quorum"."area_id" = "issue"."area_id"
    1.33 +    UNION ALL
    1.34 +    SELECT "policy"."issue_quorum"
    1.35 +    FROM "policy" WHERE "policy"."id" = "issue"."policy_id"
    1.36 +    UNION ALL
    1.37 +    SELECT
    1.38 +      ceil(
    1.39 +        ("issue"."population"::INT8 * "policy"."issue_quorum_num"::INT8) /
    1.40 +        "policy"."issue_quorum_den"::FLOAT8
    1.41 +      )::INT4
    1.42 +    FROM "policy" WHERE "policy"."id" = "issue"."policy_id"
    1.43 +  ) AS "subquery"
    1.44 +  ORDER BY "issue_id", "issue_quorum" DESC;
    1.45 +
    1.46 +COMMENT ON VIEW "issue_quorum" IS 'Effective quorum for issue admission';
    1.47 +
    1.48 +
    1.49  CREATE VIEW "area_with_unaccepted_issues" AS
    1.50    SELECT DISTINCT ON ("area"."id") "area".*
    1.51    FROM "area" JOIN "issue" ON "area"."id" = "issue"."area_id"
    1.52 @@ -5122,10 +5150,26 @@
    1.53        UPDATE "issue" SET
    1.54          "calculated" = "snapshot"."calculated",
    1.55          "latest_snapshot_id" = "snapshot_id_v",
    1.56 -        "population" = "snapshot"."population"
    1.57 -        FROM "snapshot"
    1.58 +        "population" = "snapshot"."population",
    1.59 +        "initiative_quorum" = CASE WHEN
    1.60 +          "policy"."initiative_quorum" > ceil(
    1.61 +            ( "issue"."population"::INT8 *
    1.62 +              "policy"."initiative_quorum_num"::INT8 ) /
    1.63 +            "policy"."initiative_quorum_den"::FLOAT8
    1.64 +          )::INT4
    1.65 +        THEN
    1.66 +          "policy"."initiative_quorum"
    1.67 +        ELSE
    1.68 +          ceil(
    1.69 +            ( "issue"."population"::INT8 *
    1.70 +              "policy"."initiative_quorum_num"::INT8 ) /
    1.71 +            "policy"."initiative_quorum_den"::FLOAT8
    1.72 +          )::INT4
    1.73 +        END
    1.74 +        FROM "snapshot", "policy"
    1.75          WHERE "issue"."id" = "issue_id_p"
    1.76 -        AND "snapshot"."id" = "snapshot_id_v";
    1.77 +        AND "snapshot"."id" = "snapshot_id_v"
    1.78 +        AND "policy"."id" = "issue"."policy_id";
    1.79        UPDATE "initiative" SET
    1.80          "supporter_count" = (
    1.81            SELECT coalesce(sum("di"."weight"), 0)
    1.82 @@ -5944,8 +5988,11 @@
    1.83          "admission_snapshot_id" = "latest_snapshot_id",
    1.84          "state"                 = 'discussion',
    1.85          "accepted"              = now(),
    1.86 -        "phase_finished"        = NULL
    1.87 -        WHERE "id" = "issue_id_v";
    1.88 +        "phase_finished"        = NULL,
    1.89 +        "issue_quorum"          = "issue_quorum"."issue_quorum"
    1.90 +        FROM "issue_quorum"
    1.91 +        WHERE "id" = "issue_id_v"
    1.92 +        AND "issue_quorum"."issue_id" = "issue_id_v";
    1.93        RETURN TRUE;
    1.94      END;
    1.95    $$;
    1.96 @@ -6046,6 +6093,11 @@
    1.97          IF "persist"."state" != 'admission' THEN
    1.98            PERFORM "take_snapshot"("issue_id_p");
    1.99            PERFORM "finish_snapshot"("issue_id_p");
   1.100 +        ELSE
   1.101 +          UPDATE "issue" SET "issue_quorum" = "issue_quorum"."issue_quorum"
   1.102 +            FROM "issue_quorum"
   1.103 +            WHERE "id" = "issue_id_p"
   1.104 +            AND "issue_quorum"."issue_id" = "issue_id_p";
   1.105          END IF;
   1.106          "persist"."snapshot_created" = TRUE;
   1.107          IF "persist"."phase_finished" THEN
   1.108 @@ -6059,21 +6111,15 @@
   1.109              UPDATE "issue" SET "full_freeze_snapshot_id" = "latest_snapshot_id"
   1.110                WHERE "id" = "issue_id_p";
   1.111              SELECT * INTO "issue_row" FROM "issue" WHERE "id" = "issue_id_p";
   1.112 -            SELECT * INTO "policy_row" FROM "policy"
   1.113 -              WHERE "id" = "issue_row"."policy_id";
   1.114              FOR "initiative_row" IN
   1.115                SELECT * FROM "initiative"
   1.116                WHERE "issue_id" = "issue_id_p" AND "revoked" ISNULL
   1.117                FOR UPDATE
   1.118              LOOP
   1.119                IF
   1.120 -                "initiative_row"."polling" OR (
   1.121 -                  "initiative_row"."satisfied_supporter_count" >=
   1.122 -                  "policy_row"."initiative_quorum" AND
   1.123 -                  "initiative_row"."satisfied_supporter_count" *
   1.124 -                  "policy_row"."initiative_quorum_den" >=
   1.125 -                  "issue_row"."population" * "policy_row"."initiative_quorum_num"
   1.126 -                )
   1.127 +                "initiative_row"."polling" OR
   1.128 +                "initiative_row"."satisfied_supporter_count" >=
   1.129 +                "issue_row"."initiative_quorum"
   1.130                THEN
   1.131                  UPDATE "initiative" SET "admitted" = TRUE
   1.132                    WHERE "id" = "initiative_row"."id";

Impressum / About Us