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