liquid_feedback_core

changeset 255:a1db85ce10ea

Simulation of default delegation in functions "delegation_chain" and "delegation_info"
author jbe
date Wed Jun 20 20:28:12 2012 +0200 (2012-06-20)
parents 5be836255919
children e818f83e133b
files core.sql
line diff
     1.1 --- a/core.sql	Fri Jun 15 21:16:47 2012 +0200
     1.2 +++ b/core.sql	Wed Jun 20 20:28:12 2012 +0200
     1.3 @@ -7,7 +7,7 @@
     1.4  BEGIN;
     1.5  
     1.6  CREATE VIEW "liquid_feedback_version" AS
     1.7 -  SELECT * FROM (VALUES ('2.0.10', 2, 0, 10))
     1.8 +  SELECT * FROM (VALUES ('2.0.11', 2, 0, 11))
     1.9    AS "subquery"("string", "major", "minor", "revision");
    1.10  
    1.11  
    1.12 @@ -2440,7 +2440,8 @@
    1.13      "unit_id_p"             "unit"."id"%TYPE,
    1.14      "area_id_p"             "area"."id"%TYPE,
    1.15      "issue_id_p"            "issue"."id"%TYPE,
    1.16 -    "simulate_trustee_id_p" "member"."id"%TYPE DEFAULT NULL )
    1.17 +    "simulate_trustee_id_p" "member"."id"%TYPE DEFAULT NULL,
    1.18 +    "simulate_default_p"    BOOLEAN            DEFAULT FALSE )
    1.19    RETURNS SETOF "delegation_chain_row"
    1.20    LANGUAGE 'plpgsql' STABLE AS $$
    1.21      DECLARE
    1.22 @@ -2452,11 +2453,21 @@
    1.23        "loop_member_id_v"   "member"."id"%TYPE;
    1.24        "output_row"         "delegation_chain_row";
    1.25        "output_rows"        "delegation_chain_row"[];
    1.26 +      "simulate_v"         BOOLEAN;
    1.27 +      "simulate_here_v"    BOOLEAN;
    1.28        "delegation_row"     "delegation"%ROWTYPE;
    1.29        "row_count"          INT4;
    1.30        "i"                  INT4;
    1.31        "loop_v"             BOOLEAN;
    1.32      BEGIN
    1.33 +      IF "simulate_trustee_id_p" NOTNULL AND "simulate_default_p" THEN
    1.34 +        RAISE EXCEPTION 'Both "simulate_trustee_id_p" is set, and "simulate_default_p" is true';
    1.35 +      END IF;
    1.36 +      IF "simulate_trustee_id_p" NOTNULL OR "simulate_default_p" THEN
    1.37 +        "simulate_v" := TRUE;
    1.38 +      ELSE
    1.39 +        "simulate_v" := FALSE;
    1.40 +      END IF;
    1.41        IF
    1.42          "unit_id_p" NOTNULL AND
    1.43          "area_id_p" ISNULL AND
    1.44 @@ -2483,7 +2494,7 @@
    1.45            RETURN;
    1.46          END IF;
    1.47          IF "issue_row"."closed" NOTNULL THEN
    1.48 -          IF "simulate_trustee_id_p" NOTNULL THEN
    1.49 +          IF "simulate_v" THEN
    1.50              RAISE EXCEPTION 'Tried to simulate delegation chain for closed issue.';
    1.51            END IF;
    1.52            FOR "output_row" IN
    1.53 @@ -2525,30 +2536,46 @@
    1.54            "output_row"."overridden" := TRUE;
    1.55          END IF;
    1.56          "output_row"."scope_in" := "output_row"."scope_out";
    1.57 -        IF EXISTS (
    1.58 +        "output_row"."member_valid" := EXISTS (
    1.59            SELECT NULL FROM "member" JOIN "privilege"
    1.60            ON "privilege"."member_id" = "member"."id"
    1.61            AND "privilege"."unit_id" = "unit_id_v"
    1.62            WHERE "id" = "output_row"."member_id"
    1.63            AND "member"."active" AND "privilege"."voting_right"
    1.64 -        ) THEN
    1.65 +        );
    1.66 +        "simulate_here_v" := (
    1.67 +          "simulate_v" AND
    1.68 +          "output_row"."member_id" = "member_id_p"
    1.69 +        );
    1.70 +        "delegation_row" := ROW(NULL);
    1.71 +        IF "output_row"."member_valid" OR "simulate_here_v" THEN
    1.72            IF "scope_v" = 'unit' THEN
    1.73 -            SELECT * INTO "delegation_row" FROM "delegation"
    1.74 -              WHERE "truster_id" = "output_row"."member_id"
    1.75 -              AND "unit_id" = "unit_id_v";
    1.76 +            IF NOT "simulate_here_v" THEN
    1.77 +              SELECT * INTO "delegation_row" FROM "delegation"
    1.78 +                WHERE "truster_id" = "output_row"."member_id"
    1.79 +                AND "unit_id" = "unit_id_v";
    1.80 +            END IF;
    1.81            ELSIF "scope_v" = 'area' THEN
    1.82              "output_row"."participation" := EXISTS (
    1.83                SELECT NULL FROM "membership"
    1.84                WHERE "area_id" = "area_id_p"
    1.85                AND "member_id" = "output_row"."member_id"
    1.86              );
    1.87 -            SELECT * INTO "delegation_row" FROM "delegation"
    1.88 -              WHERE "truster_id" = "output_row"."member_id"
    1.89 -              AND (
    1.90 -                "unit_id" = "unit_id_v" OR
    1.91 -                "area_id" = "area_id_v"
    1.92 -              )
    1.93 -              ORDER BY "scope" DESC;
    1.94 +            IF "simulate_here_v" THEN
    1.95 +              IF "simulate_trustee_id_p" ISNULL THEN
    1.96 +                SELECT * INTO "delegation_row" FROM "delegation"
    1.97 +                  WHERE "truster_id" = "output_row"."member_id"
    1.98 +                  AND "unit_id" = "unit_id_v";
    1.99 +              END IF;
   1.100 +            ELSE
   1.101 +              SELECT * INTO "delegation_row" FROM "delegation"
   1.102 +                WHERE "truster_id" = "output_row"."member_id"
   1.103 +                AND (
   1.104 +                  "unit_id" = "unit_id_v" OR
   1.105 +                  "area_id" = "area_id_v"
   1.106 +                )
   1.107 +                ORDER BY "scope" DESC;
   1.108 +            END IF;
   1.109            ELSIF "scope_v" = 'issue' THEN
   1.110              IF "issue_row"."fully_frozen" ISNULL THEN
   1.111                "output_row"."participation" := EXISTS (
   1.112 @@ -2567,25 +2594,31 @@
   1.113                  "output_row"."participation" := NULL;
   1.114                END IF;
   1.115              END IF;
   1.116 -            SELECT * INTO "delegation_row" FROM "delegation"
   1.117 -              WHERE "truster_id" = "output_row"."member_id"
   1.118 -              AND (
   1.119 -                "unit_id" = "unit_id_v" OR
   1.120 -                "area_id" = "area_id_v" OR
   1.121 -                "issue_id" = "issue_id_p"
   1.122 -              )
   1.123 -              ORDER BY "scope" DESC;
   1.124 +            IF "simulate_here_v" THEN
   1.125 +              IF "simulate_trustee_id_p" ISNULL THEN
   1.126 +                SELECT * INTO "delegation_row" FROM "delegation"
   1.127 +                  WHERE "truster_id" = "output_row"."member_id"
   1.128 +                  AND (
   1.129 +                    "unit_id" = "unit_id_v" OR
   1.130 +                    "area_id" = "area_id_v"
   1.131 +                  )
   1.132 +                  ORDER BY "scope" DESC;
   1.133 +              END IF;
   1.134 +            ELSE
   1.135 +              SELECT * INTO "delegation_row" FROM "delegation"
   1.136 +                WHERE "truster_id" = "output_row"."member_id"
   1.137 +                AND (
   1.138 +                  "unit_id" = "unit_id_v" OR
   1.139 +                  "area_id" = "area_id_v" OR
   1.140 +                  "issue_id" = "issue_id_p"
   1.141 +                )
   1.142 +                ORDER BY "scope" DESC;
   1.143 +            END IF;
   1.144            END IF;
   1.145          ELSE
   1.146 -          "output_row"."member_valid"  := FALSE;
   1.147            "output_row"."participation" := FALSE;
   1.148 -          "output_row"."scope_out"     := NULL;
   1.149 -          "delegation_row" := ROW(NULL);
   1.150          END IF;
   1.151 -        IF
   1.152 -          "output_row"."member_id" = "member_id_p" AND
   1.153 -          "simulate_trustee_id_p" NOTNULL
   1.154 -        THEN
   1.155 +        IF "simulate_here_v" AND "simulate_trustee_id_p" NOTNULL THEN
   1.156            "output_row"."scope_out" := "scope_v";
   1.157            "output_rows" := "output_rows" || "output_row";
   1.158            "output_row"."member_id" := "simulate_trustee_id_p";
   1.159 @@ -2639,7 +2672,8 @@
   1.160      "unit"."id"%TYPE,
   1.161      "area"."id"%TYPE,
   1.162      "issue"."id"%TYPE,
   1.163 -    "member"."id"%TYPE )
   1.164 +    "member"."id"%TYPE,
   1.165 +    BOOLEAN )
   1.166    IS 'Shows a delegation chain for unit, area, or issue; See "delegation_chain_row" type for more information';
   1.167  
   1.168  
   1.169 @@ -2686,7 +2720,8 @@
   1.170      "unit_id_p"             "unit"."id"%TYPE,
   1.171      "area_id_p"             "area"."id"%TYPE,
   1.172      "issue_id_p"            "issue"."id"%TYPE,
   1.173 -    "simulate_trustee_id_p" "member"."id"%TYPE DEFAULT NULL )
   1.174 +    "simulate_trustee_id_p" "member"."id"%TYPE DEFAULT NULL,
   1.175 +    "simulate_default_p"    BOOLEAN            DEFAULT FALSE )
   1.176    RETURNS "delegation_info_type"
   1.177    LANGUAGE 'plpgsql' STABLE AS $$
   1.178      DECLARE
   1.179 @@ -2698,7 +2733,7 @@
   1.180          SELECT * FROM "delegation_chain"(
   1.181            "member_id_p",
   1.182            "unit_id_p", "area_id_p", "issue_id_p",
   1.183 -          "simulate_trustee_id_p")
   1.184 +          "simulate_trustee_id_p", "simulate_default_p")
   1.185        LOOP
   1.186          IF
   1.187            "result"."participating_member_id" ISNULL AND
   1.188 @@ -2755,7 +2790,8 @@
   1.189      "unit"."id"%TYPE,
   1.190      "area"."id"%TYPE,
   1.191      "issue"."id"%TYPE,
   1.192 -    "member"."id"%TYPE )
   1.193 +    "member"."id"%TYPE,
   1.194 +    BOOLEAN )
   1.195    IS 'Notable information about a delegation chain for unit, area, or issue; See "delegation_info_type" for more information';
   1.196  
   1.197  

Impressum / About Us