liquid_feedback_core

annotate update/core-update.v2.1.0-v2.1.1.sql @ 322:fd58f487e1d0

Calculate "harmonc_weight" after all other calculations in an issue (as calculation depends on the "admitted" flag now)
author jbe
date Fri Feb 08 19:20:17 2013 +0100 (2013-02-08)
parents 48a5036d5eb1
children 4c7a864829b0
rev   line source
jbe@315 1 BEGIN;
jbe@315 2
jbe@315 3 CREATE OR REPLACE VIEW "liquid_feedback_version" AS
jbe@315 4 SELECT * FROM (VALUES ('2.1.1', 2, 1, 1))
jbe@315 5 AS "subquery"("string", "major", "minor", "revision");
jbe@315 6
jbe@315 7 ALTER TABLE "initiative" ADD COLUMN "harmonic_weight" NUMERIC(12, 3);
jbe@320 8 COMMENT ON COLUMN "initiative"."harmonic_weight" IS 'Indicates the relevancy of the initiative, calculated from the potential supporters weighted with the harmonic series to avoid a large number of clones affecting other initiative''s sorting positions too much; shall be used as secondary sorting key after "admitted" as primary sorting key';
jbe@315 9
jbe@315 10 ALTER TABLE "suggestion" ADD COLUMN "harmonic_weight" NUMERIC(12, 3);
jbe@315 11 COMMENT ON COLUMN "suggestion"."harmonic_weight" IS 'Indicates the relevancy of the suggestion, calculated from the supporters (positive "degree") of the suggestion weighted with the harmonic series to avoid a large number of clones affecting other suggestion''s sortings position too much';
jbe@315 12
jbe@315 13 CREATE VIEW "remaining_harmonic_supporter_weight" AS
jbe@315 14 SELECT
jbe@315 15 "direct_interest_snapshot"."issue_id",
jbe@315 16 "direct_interest_snapshot"."event",
jbe@315 17 "direct_interest_snapshot"."member_id",
jbe@315 18 "direct_interest_snapshot"."weight" AS "weight_num",
jbe@315 19 count("initiative"."id") AS "weight_den"
jbe@315 20 FROM "issue"
jbe@315 21 JOIN "direct_interest_snapshot"
jbe@315 22 ON "issue"."id" = "direct_interest_snapshot"."issue_id"
jbe@315 23 AND "issue"."latest_snapshot_event" = "direct_interest_snapshot"."event"
jbe@315 24 JOIN "direct_supporter_snapshot"
jbe@315 25 ON "direct_interest_snapshot"."issue_id" = "direct_supporter_snapshot"."issue_id"
jbe@315 26 AND "direct_interest_snapshot"."event" = "direct_supporter_snapshot"."event"
jbe@315 27 AND "direct_interest_snapshot"."member_id" = "direct_supporter_snapshot"."member_id"
jbe@315 28 JOIN "initiative"
jbe@315 29 ON "direct_supporter_snapshot"."initiative_id" = "initiative"."id"
jbe@321 30 AND (
jbe@321 31 "direct_supporter_snapshot"."satisfied" = TRUE OR
jbe@321 32 coalesce("initiative"."admitted", FALSE) = FALSE
jbe@321 33 )
jbe@315 34 AND "initiative"."harmonic_weight" ISNULL
jbe@315 35 GROUP BY
jbe@315 36 "direct_interest_snapshot"."issue_id",
jbe@315 37 "direct_interest_snapshot"."event",
jbe@315 38 "direct_interest_snapshot"."member_id",
jbe@315 39 "direct_interest_snapshot"."weight";
jbe@315 40
jbe@315 41 COMMENT ON VIEW "remaining_harmonic_supporter_weight" IS 'Helper view for function "set_harmonic_initiative_weights"';
jbe@315 42
jbe@315 43 CREATE VIEW "remaining_harmonic_initiative_weight_summands" AS
jbe@315 44 SELECT
jbe@315 45 "initiative"."issue_id",
jbe@315 46 "initiative"."id" AS "initiative_id",
jbe@320 47 "initiative"."admitted",
jbe@315 48 sum("remaining_harmonic_supporter_weight"."weight_num") AS "weight_num",
jbe@315 49 "remaining_harmonic_supporter_weight"."weight_den"
jbe@315 50 FROM "remaining_harmonic_supporter_weight"
jbe@315 51 JOIN "direct_supporter_snapshot"
jbe@315 52 ON "remaining_harmonic_supporter_weight"."issue_id" = "direct_supporter_snapshot"."issue_id"
jbe@315 53 AND "remaining_harmonic_supporter_weight"."event" = "direct_supporter_snapshot"."event"
jbe@315 54 AND "remaining_harmonic_supporter_weight"."member_id" = "direct_supporter_snapshot"."member_id"
jbe@315 55 JOIN "initiative"
jbe@315 56 ON "direct_supporter_snapshot"."initiative_id" = "initiative"."id"
jbe@321 57 AND (
jbe@321 58 "direct_supporter_snapshot"."satisfied" = TRUE OR
jbe@321 59 coalesce("initiative"."admitted", FALSE) = FALSE
jbe@321 60 )
jbe@315 61 AND "initiative"."harmonic_weight" ISNULL
jbe@315 62 GROUP BY
jbe@315 63 "initiative"."issue_id",
jbe@315 64 "initiative"."id",
jbe@320 65 "initiative"."admitted",
jbe@315 66 "remaining_harmonic_supporter_weight"."weight_den";
jbe@315 67
jbe@315 68 COMMENT ON VIEW "remaining_harmonic_initiative_weight_summands" IS 'Helper view for function "set_harmonic_initiative_weights"';
jbe@315 69
jbe@315 70 CREATE FUNCTION "set_harmonic_initiative_weights"
jbe@315 71 ( "issue_id_p" "issue"."id"%TYPE )
jbe@315 72 RETURNS VOID
jbe@315 73 LANGUAGE 'plpgsql' VOLATILE AS $$
jbe@315 74 DECLARE
jbe@315 75 "weight_row" "remaining_harmonic_initiative_weight_summands"%ROWTYPE;
jbe@315 76 "i" INT4;
jbe@315 77 "count_v" INT4;
jbe@315 78 "summand_v" FLOAT;
jbe@315 79 "id_ary" INT4[];
jbe@315 80 "weight_ary" FLOAT[];
jbe@315 81 "min_weight_v" FLOAT;
jbe@315 82 BEGIN
jbe@315 83 UPDATE "initiative" SET "harmonic_weight" = NULL
jbe@315 84 WHERE "issue_id" = "issue_id_p";
jbe@315 85 LOOP
jbe@315 86 "min_weight_v" := NULL;
jbe@315 87 "i" := 0;
jbe@315 88 "count_v" := 0;
jbe@315 89 FOR "weight_row" IN
jbe@315 90 SELECT * FROM "remaining_harmonic_initiative_weight_summands"
jbe@315 91 WHERE "issue_id" = "issue_id_p"
jbe@320 92 AND (
jbe@320 93 coalesce("admitted", FALSE) = FALSE OR NOT EXISTS (
jbe@320 94 SELECT NULL FROM "initiative"
jbe@320 95 WHERE "issue_id" = "issue_id_p"
jbe@320 96 AND "harmonic_weight" ISNULL
jbe@320 97 AND coalesce("admitted", FALSE) = FALSE
jbe@320 98 )
jbe@320 99 )
jbe@315 100 ORDER BY "initiative_id" DESC, "weight_den" DESC
jbe@320 101 -- NOTE: non-admitted initiatives placed first (at last positions),
jbe@320 102 -- latest initiatives treated worse in case of tie
jbe@315 103 LOOP
jbe@315 104 "summand_v" := "weight_row"."weight_num"::FLOAT / "weight_row"."weight_den"::FLOAT;
jbe@315 105 IF "i" = 0 OR "weight_row"."initiative_id" != "id_ary"["i"] THEN
jbe@315 106 "i" := "i" + 1;
jbe@315 107 "count_v" := "i";
jbe@315 108 "id_ary"["i"] := "weight_row"."initiative_id";
jbe@315 109 "weight_ary"["i"] := "summand_v";
jbe@315 110 ELSE
jbe@315 111 "weight_ary"["i"] := "weight_ary"["i"] + "summand_v";
jbe@315 112 END IF;
jbe@315 113 END LOOP;
jbe@315 114 EXIT WHEN "count_v" = 0;
jbe@315 115 "i" := 1;
jbe@315 116 LOOP
jbe@315 117 "weight_ary"["i"] := "weight_ary"["i"]::NUMERIC(18,9)::NUMERIC(12,3);
jbe@315 118 IF "min_weight_v" ISNULL OR "weight_ary"["i"] < "min_weight_v" THEN
jbe@315 119 "min_weight_v" := "weight_ary"["i"];
jbe@315 120 END IF;
jbe@315 121 "i" := "i" + 1;
jbe@315 122 EXIT WHEN "i" > "count_v";
jbe@315 123 END LOOP;
jbe@315 124 "i" := 1;
jbe@315 125 LOOP
jbe@315 126 IF "weight_ary"["i"] = "min_weight_v" THEN
jbe@315 127 UPDATE "initiative" SET "harmonic_weight" = "min_weight_v"
jbe@315 128 WHERE "id" = "id_ary"["i"];
jbe@315 129 EXIT;
jbe@315 130 END IF;
jbe@315 131 "i" := "i" + 1;
jbe@315 132 END LOOP;
jbe@315 133 END LOOP;
jbe@316 134 UPDATE "initiative" SET "harmonic_weight" = 0
jbe@316 135 WHERE "issue_id" = "issue_id_p" AND "harmonic_weight" ISNULL;
jbe@315 136 END;
jbe@315 137 $$;
jbe@315 138
jbe@315 139 COMMENT ON FUNCTION "set_harmonic_initiative_weights"
jbe@315 140 ( "issue"."id"%TYPE )
jbe@315 141 IS 'Calculates and sets "harmonic_weight" of initiatives in a given issue';
jbe@315 142
jbe@315 143 CREATE VIEW "remaining_harmonic_opinion_weight" AS
jbe@315 144 SELECT
jbe@315 145 "initiative"."issue_id",
jbe@315 146 "opinion"."initiative_id",
jbe@315 147 "direct_interest_snapshot"."member_id",
jbe@315 148 "direct_interest_snapshot"."weight" AS "weight_num",
jbe@315 149 count("opinion"."suggestion_id") AS "weight_den"
jbe@315 150 FROM "issue"
jbe@315 151 JOIN "direct_interest_snapshot"
jbe@315 152 ON "issue"."id" = "direct_interest_snapshot"."issue_id"
jbe@315 153 AND "issue"."latest_snapshot_event" = "direct_interest_snapshot"."event"
jbe@315 154 JOIN "initiative"
jbe@315 155 ON "direct_interest_snapshot"."issue_id" = "initiative"."issue_id"
jbe@315 156 JOIN "opinion"
jbe@315 157 ON "direct_interest_snapshot"."member_id" = "opinion"."member_id"
jbe@315 158 AND "initiative"."id" = "opinion"."initiative_id"
jbe@317 159 AND (
jbe@317 160 ("opinion"."degree" > 0 AND "opinion"."fulfilled" = FALSE) OR
jbe@317 161 ("opinion"."degree" < 0 AND "opinion"."fulfilled" = TRUE)
jbe@317 162 )
jbe@318 163 JOIN "suggestion"
jbe@318 164 ON "opinion"."suggestion_id" = "suggestion"."id"
jbe@318 165 AND "suggestion"."harmonic_weight" ISNULL
jbe@315 166 GROUP BY
jbe@315 167 "initiative"."issue_id",
jbe@315 168 "opinion"."initiative_id",
jbe@315 169 "direct_interest_snapshot"."member_id",
jbe@315 170 "direct_interest_snapshot"."weight";
jbe@315 171
jbe@315 172 COMMENT ON VIEW "remaining_harmonic_opinion_weight" IS 'Helper view for function "set_harmonic_suggestion_weights"';
jbe@315 173
jbe@315 174 CREATE VIEW "remaining_harmonic_suggestion_weight_summands" AS
jbe@315 175 SELECT
jbe@315 176 "suggestion"."initiative_id",
jbe@315 177 "opinion"."suggestion_id",
jbe@315 178 sum("remaining_harmonic_opinion_weight"."weight_num") AS "weight_num",
jbe@315 179 "remaining_harmonic_opinion_weight"."weight_den"
jbe@315 180 FROM "remaining_harmonic_opinion_weight"
jbe@315 181 JOIN "opinion"
jbe@315 182 ON "remaining_harmonic_opinion_weight"."initiative_id" = "opinion"."initiative_id"
jbe@315 183 AND "remaining_harmonic_opinion_weight"."member_id" = "opinion"."member_id"
jbe@319 184 AND (
jbe@319 185 ("opinion"."degree" > 0 AND "opinion"."fulfilled" = FALSE) OR
jbe@319 186 ("opinion"."degree" < 0 AND "opinion"."fulfilled" = TRUE)
jbe@319 187 )
jbe@315 188 JOIN "suggestion"
jbe@315 189 ON "opinion"."suggestion_id" = "suggestion"."id"
jbe@315 190 AND "suggestion"."harmonic_weight" ISNULL
jbe@315 191 GROUP BY
jbe@315 192 "suggestion"."initiative_id",
jbe@315 193 "opinion"."suggestion_id",
jbe@315 194 "remaining_harmonic_opinion_weight"."weight_den";
jbe@315 195
jbe@315 196 COMMENT ON VIEW "remaining_harmonic_suggestion_weight_summands" IS 'Helper view for function "set_harmonic_suggestion_weights"';
jbe@315 197
jbe@315 198 CREATE FUNCTION "set_harmonic_suggestion_weights"
jbe@315 199 ( "initiative_id_p" "initiative"."id"%TYPE )
jbe@315 200 RETURNS VOID
jbe@315 201 LANGUAGE 'plpgsql' VOLATILE AS $$
jbe@315 202 DECLARE
jbe@315 203 "weight_row" "remaining_harmonic_suggestion_weight_summands"%ROWTYPE;
jbe@315 204 "i" INT4;
jbe@315 205 "count_v" INT4;
jbe@315 206 "summand_v" FLOAT;
jbe@315 207 "id_ary" INT4[];
jbe@315 208 "weight_ary" FLOAT[];
jbe@315 209 "min_weight_v" FLOAT;
jbe@315 210 BEGIN
jbe@315 211 UPDATE "suggestion" SET "harmonic_weight" = NULL
jbe@315 212 WHERE "initiative_id" = "initiative_id_p";
jbe@315 213 LOOP
jbe@315 214 "min_weight_v" := NULL;
jbe@315 215 "i" := 0;
jbe@315 216 "count_v" := 0;
jbe@315 217 FOR "weight_row" IN
jbe@315 218 SELECT * FROM "remaining_harmonic_suggestion_weight_summands"
jbe@315 219 WHERE "initiative_id" = "initiative_id_p"
jbe@315 220 ORDER BY "suggestion_id" DESC, "weight_den" DESC
jbe@320 221 -- NOTE: latest suggestions treated worse in case of tie
jbe@315 222 LOOP
jbe@315 223 "summand_v" := "weight_row"."weight_num"::FLOAT / "weight_row"."weight_den"::FLOAT;
jbe@315 224 IF "i" = 0 OR "weight_row"."suggestion_id" != "id_ary"["i"] THEN
jbe@315 225 "i" := "i" + 1;
jbe@315 226 "count_v" := "i";
jbe@315 227 "id_ary"["i"] := "weight_row"."suggestion_id";
jbe@315 228 "weight_ary"["i"] := "summand_v";
jbe@315 229 ELSE
jbe@315 230 "weight_ary"["i"] := "weight_ary"["i"] + "summand_v";
jbe@315 231 END IF;
jbe@315 232 END LOOP;
jbe@315 233 EXIT WHEN "count_v" = 0;
jbe@315 234 "i" := 1;
jbe@315 235 LOOP
jbe@315 236 "weight_ary"["i"] := "weight_ary"["i"]::NUMERIC(18,9)::NUMERIC(12,3);
jbe@315 237 IF "min_weight_v" ISNULL OR "weight_ary"["i"] < "min_weight_v" THEN
jbe@315 238 "min_weight_v" := "weight_ary"["i"];
jbe@315 239 END IF;
jbe@315 240 "i" := "i" + 1;
jbe@315 241 EXIT WHEN "i" > "count_v";
jbe@315 242 END LOOP;
jbe@315 243 "i" := 1;
jbe@315 244 LOOP
jbe@315 245 IF "weight_ary"["i"] = "min_weight_v" THEN
jbe@315 246 UPDATE "suggestion" SET "harmonic_weight" = "min_weight_v"
jbe@315 247 WHERE "id" = "id_ary"["i"];
jbe@315 248 EXIT;
jbe@315 249 END IF;
jbe@315 250 "i" := "i" + 1;
jbe@315 251 END LOOP;
jbe@315 252 END LOOP;
jbe@316 253 UPDATE "suggestion" SET "harmonic_weight" = 0
jbe@316 254 WHERE "initiative_id" = "initiative_id_p" AND "harmonic_weight" ISNULL;
jbe@315 255 END;
jbe@315 256 $$;
jbe@315 257
jbe@315 258 COMMENT ON FUNCTION "set_harmonic_suggestion_weights"
jbe@315 259 ( "issue"."id"%TYPE )
jbe@315 260 IS 'Calculates and sets "harmonic_weight" of suggestions in a given initiative';
jbe@315 261
jbe@322 262 CREATE OR REPLACE FUNCTION "manual_freeze"("issue_id_p" "issue"."id"%TYPE)
jbe@322 263 RETURNS VOID
jbe@322 264 LANGUAGE 'plpgsql' VOLATILE AS $$
jbe@322 265 DECLARE
jbe@322 266 "issue_row" "issue"%ROWTYPE;
jbe@322 267 BEGIN
jbe@322 268 PERFORM "create_snapshot"("issue_id_p");
jbe@322 269 PERFORM "freeze_after_snapshot"("issue_id_p");
jbe@322 270 PERFORM "set_harmonic_initiative_weights"("issue_id_p");
jbe@322 271 PERFORM "set_harmonic_suggestion_weights"("id")
jbe@322 272 FROM "initiative" WHERE "issue_id" = "issue_id_p";
jbe@322 273 RETURN;
jbe@322 274 END;
jbe@322 275 $$;
jbe@322 276
jbe@322 277 CREATE OR REPLACE FUNCTION "check_issue"
jbe@315 278 ( "issue_id_p" "issue"."id"%TYPE )
jbe@315 279 RETURNS VOID
jbe@315 280 LANGUAGE 'plpgsql' VOLATILE AS $$
jbe@315 281 DECLARE
jbe@322 282 "issue_row" "issue"%ROWTYPE;
jbe@322 283 "policy_row" "policy"%ROWTYPE;
jbe@322 284 "new_snapshot_v" BOOLEAN;
jbe@315 285 BEGIN
jbe@315 286 PERFORM "lock_issue"("issue_id_p");
jbe@322 287 SELECT * INTO "issue_row" FROM "issue" WHERE "id" = "issue_id_p";
jbe@322 288 -- only process open issues:
jbe@322 289 IF "issue_row"."closed" ISNULL THEN
jbe@322 290 SELECT * INTO "policy_row" FROM "policy"
jbe@322 291 WHERE "id" = "issue_row"."policy_id";
jbe@322 292 -- create a snapshot, unless issue is already fully frozen:
jbe@322 293 IF "issue_row"."fully_frozen" ISNULL THEN
jbe@322 294 PERFORM "create_snapshot"("issue_id_p");
jbe@322 295 "new_snapshot_v" := TRUE;
jbe@322 296 SELECT * INTO "issue_row" FROM "issue" WHERE "id" = "issue_id_p";
jbe@322 297 ELSE
jbe@322 298 "new_snapshot_v" := FALSE;
jbe@322 299 END IF;
jbe@322 300 -- eventually close or accept issues, which have not been accepted:
jbe@322 301 IF "issue_row"."accepted" ISNULL THEN
jbe@322 302 IF EXISTS (
jbe@322 303 SELECT NULL FROM "initiative"
jbe@322 304 WHERE "issue_id" = "issue_id_p"
jbe@322 305 AND "supporter_count" > 0
jbe@322 306 AND "supporter_count" * "policy_row"."issue_quorum_den"
jbe@322 307 >= "issue_row"."population" * "policy_row"."issue_quorum_num"
jbe@322 308 ) THEN
jbe@322 309 -- accept issues, if supporter count is high enough
jbe@322 310 PERFORM "set_snapshot_event"("issue_id_p", 'end_of_admission');
jbe@322 311 -- NOTE: "issue_row" used later
jbe@322 312 "issue_row"."state" := 'discussion';
jbe@322 313 "issue_row"."accepted" := now();
jbe@322 314 UPDATE "issue" SET
jbe@322 315 "state" = "issue_row"."state",
jbe@322 316 "accepted" = "issue_row"."accepted"
jbe@322 317 WHERE "id" = "issue_row"."id";
jbe@322 318 ELSIF
jbe@322 319 now() >= "issue_row"."created" + "issue_row"."admission_time"
jbe@322 320 THEN
jbe@322 321 -- close issues, if admission time has expired
jbe@322 322 PERFORM "set_snapshot_event"("issue_id_p", 'end_of_admission');
jbe@322 323 UPDATE "issue" SET
jbe@322 324 "state" = 'canceled_issue_not_accepted',
jbe@322 325 "closed" = now()
jbe@322 326 WHERE "id" = "issue_row"."id";
jbe@322 327 END IF;
jbe@322 328 END IF;
jbe@322 329 -- eventually half freeze issues:
jbe@322 330 IF
jbe@322 331 -- NOTE: issue can't be closed at this point, if it has been accepted
jbe@322 332 "issue_row"."accepted" NOTNULL AND
jbe@322 333 "issue_row"."half_frozen" ISNULL
jbe@322 334 THEN
jbe@322 335 IF
jbe@322 336 now() >= "issue_row"."accepted" + "issue_row"."discussion_time"
jbe@322 337 THEN
jbe@322 338 PERFORM "set_snapshot_event"("issue_id_p", 'half_freeze');
jbe@322 339 -- NOTE: "issue_row" used later
jbe@322 340 "issue_row"."state" := 'verification';
jbe@322 341 "issue_row"."half_frozen" := now();
jbe@322 342 UPDATE "issue" SET
jbe@322 343 "state" = "issue_row"."state",
jbe@322 344 "half_frozen" = "issue_row"."half_frozen"
jbe@322 345 WHERE "id" = "issue_row"."id";
jbe@322 346 END IF;
jbe@322 347 END IF;
jbe@322 348 -- close issues after some time, if all initiatives have been revoked:
jbe@322 349 IF
jbe@322 350 "issue_row"."closed" ISNULL AND
jbe@322 351 NOT EXISTS (
jbe@322 352 -- all initiatives are revoked
jbe@322 353 SELECT NULL FROM "initiative"
jbe@322 354 WHERE "issue_id" = "issue_id_p" AND "revoked" ISNULL
jbe@322 355 ) AND (
jbe@322 356 -- and issue has not been accepted yet
jbe@322 357 "issue_row"."accepted" ISNULL OR
jbe@322 358 NOT EXISTS (
jbe@322 359 -- or no initiatives have been revoked lately
jbe@322 360 SELECT NULL FROM "initiative"
jbe@322 361 WHERE "issue_id" = "issue_id_p"
jbe@322 362 AND now() < "revoked" + "issue_row"."verification_time"
jbe@322 363 ) OR (
jbe@322 364 -- or verification time has elapsed
jbe@322 365 "issue_row"."half_frozen" NOTNULL AND
jbe@322 366 "issue_row"."fully_frozen" ISNULL AND
jbe@322 367 now() >= "issue_row"."half_frozen" + "issue_row"."verification_time"
jbe@322 368 )
jbe@315 369 )
jbe@322 370 THEN
jbe@322 371 -- NOTE: "issue_row" used later
jbe@322 372 IF "issue_row"."accepted" ISNULL THEN
jbe@322 373 "issue_row"."state" := 'canceled_revoked_before_accepted';
jbe@322 374 ELSIF "issue_row"."half_frozen" ISNULL THEN
jbe@322 375 "issue_row"."state" := 'canceled_after_revocation_during_discussion';
jbe@322 376 ELSE
jbe@322 377 "issue_row"."state" := 'canceled_after_revocation_during_verification';
jbe@322 378 END IF;
jbe@322 379 "issue_row"."closed" := now();
jbe@322 380 UPDATE "issue" SET
jbe@322 381 "state" = "issue_row"."state",
jbe@322 382 "closed" = "issue_row"."closed"
jbe@322 383 WHERE "id" = "issue_row"."id";
jbe@322 384 END IF;
jbe@322 385 -- fully freeze issue after verification time:
jbe@322 386 IF
jbe@322 387 "issue_row"."half_frozen" NOTNULL AND
jbe@322 388 "issue_row"."fully_frozen" ISNULL AND
jbe@322 389 "issue_row"."closed" ISNULL AND
jbe@322 390 now() >= "issue_row"."half_frozen" + "issue_row"."verification_time"
jbe@322 391 THEN
jbe@322 392 PERFORM "freeze_after_snapshot"("issue_id_p");
jbe@322 393 -- NOTE: "issue" might change, thus "issue_row" has to be updated below
jbe@322 394 END IF;
jbe@322 395 SELECT * INTO "issue_row" FROM "issue" WHERE "id" = "issue_id_p";
jbe@322 396 -- close issue by calling close_voting(...) after voting time:
jbe@322 397 IF
jbe@322 398 "issue_row"."closed" ISNULL AND
jbe@322 399 "issue_row"."fully_frozen" NOTNULL AND
jbe@322 400 now() >= "issue_row"."fully_frozen" + "issue_row"."voting_time"
jbe@322 401 THEN
jbe@322 402 PERFORM "close_voting"("issue_id_p");
jbe@322 403 -- calculate ranks will not consume much time and can be done now
jbe@322 404 PERFORM "calculate_ranks"("issue_id_p");
jbe@322 405 END IF;
jbe@322 406 -- if a new shapshot has been created, then recalculate harmonic weights:
jbe@322 407 IF "new_snapshot_v" THEN
jbe@322 408 PERFORM "set_harmonic_initiative_weights"("issue_id_p");
jbe@322 409 PERFORM "set_harmonic_suggestion_weights"("id")
jbe@322 410 FROM "initiative" WHERE "issue_id" = "issue_id_p";
jbe@322 411 END IF;
jbe@322 412 END IF;
jbe@315 413 RETURN;
jbe@315 414 END;
jbe@315 415 $$;
jbe@315 416
jbe@315 417 SELECT "set_harmonic_initiative_weights"("id") FROM "issue";
jbe@315 418 SELECT "set_harmonic_suggestion_weights"("id") FROM "initiative";
jbe@315 419
jbe@315 420 COMMIT;

Impressum / About Us