liquid_feedback_core
diff core.sql @ 285:4868a7d591de
Moved voting comment to table "direct_voter"
author | jbe |
---|---|
date | Sun Aug 19 20:29:44 2012 +0200 (2012-08-19) |
parents | 4f935e989ff6 |
children | f2292b94fc58 |
line diff
1.1 --- a/core.sql Sun Aug 19 19:04:22 2012 +0200 1.2 +++ b/core.sql Sun Aug 19 20:29:44 2012 +0200 1.3 @@ -1020,12 +1020,37 @@ 1.4 PRIMARY KEY ("issue_id", "member_id"), 1.5 "issue_id" INT4 REFERENCES "issue" ("id") ON DELETE CASCADE ON UPDATE CASCADE, 1.6 "member_id" INT4 REFERENCES "member" ("id") ON DELETE RESTRICT ON UPDATE RESTRICT, 1.7 - "weight" INT4 ); 1.8 + "weight" INT4, 1.9 + "comment_changed" TIMESTAMPTZ, 1.10 + "formatting_engine" TEXT, 1.11 + "comment" TEXT, 1.12 + "text_search_data" TSVECTOR ); 1.13 CREATE INDEX "direct_voter_member_id_idx" ON "direct_voter" ("member_id"); 1.14 +CREATE INDEX "direct_voter_text_search_data_idx" ON "direct_voter" USING gin ("text_search_data"); 1.15 +CREATE TRIGGER "update_text_search_data" 1.16 + BEFORE INSERT OR UPDATE ON "direct_voter" 1.17 + FOR EACH ROW EXECUTE PROCEDURE 1.18 + tsvector_update_trigger('text_search_data', 'pg_catalog.simple', "comment"); 1.19 1.20 COMMENT ON TABLE "direct_voter" IS 'Members having directly voted for/against initiatives of an issue; Frontends must ensure that no voters are added or removed to/from this table when the issue has been closed.'; 1.21 1.22 -COMMENT ON COLUMN "direct_voter"."weight" IS 'Weight of member (1 or higher) according to "delegating_voter" table'; 1.23 +COMMENT ON COLUMN "direct_voter"."weight" IS 'Weight of member (1 or higher) according to "delegating_voter" table'; 1.24 +COMMENT ON COLUMN "direct_voter"."comment_changed" IS 'Shall be set on comment change, to indicate a comment being modified after voting has been finished; Automatically set to NULL after voting phase; Automatically set to NULL by trigger, if "comment" is set to NULL'; 1.25 +COMMENT ON COLUMN "direct_voter"."formatting_engine" IS 'Allows different formatting engines (i.e. wiki formats) to be used for "direct_voter"."comment"; Automatically set to NULL by trigger, if "comment" is set to NULL'; 1.26 +COMMENT ON COLUMN "direct_voter"."comment" IS 'Is to be set or updated by the frontend, if comment was inserted or updated AFTER the issue has been closed. Otherwise it shall be set to NULL.'; 1.27 + 1.28 + 1.29 +CREATE TABLE "rendered_voter_comment" ( 1.30 + PRIMARY KEY ("issue_id", "member_id", "format"), 1.31 + FOREIGN KEY ("issue_id", "member_id") 1.32 + REFERENCES "direct_voter" ("issue_id", "member_id") 1.33 + ON DELETE CASCADE ON UPDATE CASCADE, 1.34 + "issue_id" INT4, 1.35 + "member_id" INT4, 1.36 + "format" TEXT, 1.37 + "content" TEXT NOT NULL ); 1.38 + 1.39 +COMMENT ON TABLE "rendered_voter_comment" IS 'This table may be used by frontends to cache "rendered" voter comments (e.g. HTML output generated from wiki text)'; 1.40 1.41 1.42 CREATE TABLE "delegating_voter" ( 1.43 @@ -1060,39 +1085,6 @@ 1.44 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.'; 1.45 1.46 1.47 -CREATE TABLE "voting_comment" ( 1.48 - PRIMARY KEY ("issue_id", "member_id"), 1.49 - "issue_id" INT4 REFERENCES "issue" ("id") ON DELETE CASCADE ON UPDATE CASCADE, 1.50 - "member_id" INT4 REFERENCES "member" ("id") ON DELETE CASCADE ON UPDATE CASCADE, 1.51 - "changed" TIMESTAMPTZ, 1.52 - "formatting_engine" TEXT, 1.53 - "content" TEXT NOT NULL, 1.54 - "text_search_data" TSVECTOR ); 1.55 -CREATE INDEX "voting_comment_member_id_idx" ON "voting_comment" ("member_id"); 1.56 -CREATE INDEX "voting_comment_text_search_data_idx" ON "voting_comment" USING gin ("text_search_data"); 1.57 -CREATE TRIGGER "update_text_search_data" 1.58 - BEFORE INSERT OR UPDATE ON "voting_comment" 1.59 - FOR EACH ROW EXECUTE PROCEDURE 1.60 - tsvector_update_trigger('text_search_data', 'pg_catalog.simple', "content"); 1.61 - 1.62 -COMMENT ON TABLE "voting_comment" IS 'Storage for comments of voters to be published after voting has finished.'; 1.63 - 1.64 -COMMENT ON COLUMN "voting_comment"."changed" IS 'Is to be set or updated by the frontend, if comment was inserted or updated AFTER the issue has been closed. Otherwise it shall be set to NULL.'; 1.65 - 1.66 - 1.67 -CREATE TABLE "rendered_voting_comment" ( 1.68 - PRIMARY KEY ("issue_id", "member_id", "format"), 1.69 - FOREIGN KEY ("issue_id", "member_id") 1.70 - REFERENCES "voting_comment" ("issue_id", "member_id") 1.71 - ON DELETE CASCADE ON UPDATE CASCADE, 1.72 - "issue_id" INT4, 1.73 - "member_id" INT4, 1.74 - "format" TEXT, 1.75 - "content" TEXT NOT NULL ); 1.76 - 1.77 -COMMENT ON TABLE "rendered_voting_comment" IS 'This table may be used by frontends to cache "rendered" voting comments (e.g. HTML output generated from wiki text)'; 1.78 - 1.79 - 1.80 CREATE TYPE "event_type" AS ENUM ( 1.81 'issue_state_changed', 1.82 'initiative_created_in_new_issue', 1.83 @@ -1548,6 +1540,26 @@ 1.84 COMMENT ON TRIGGER "direct_voter_deletes_non_voter" ON "direct_voter" IS 'An entry in the "direct_voter" table deletes an entry in the "non_voter" table (and vice versa due to trigger "non_voter_deletes_direct_voter" on table "non_voter")'; 1.85 1.86 1.87 +CREATE FUNCTION "voter_comment_fields_only_set_when_voter_comment_is_set_trigger"() 1.88 + RETURNS TRIGGER 1.89 + LANGUAGE 'plpgsql' VOLATILE AS $$ 1.90 + BEGIN 1.91 + IF NEW."comment" ISNULL THEN 1.92 + NEW."comment_changed" := NULL; 1.93 + NEW."formatting_engine" := NULL; 1.94 + END IF; 1.95 + RETURN NEW; 1.96 + END; 1.97 + $$; 1.98 + 1.99 +CREATE TRIGGER "voter_comment_fields_only_set_when_voter_comment_is_set" 1.100 + BEFORE INSERT OR UPDATE ON "direct_voter" 1.101 + FOR EACH ROW EXECUTE PROCEDURE 1.102 + "voter_comment_fields_only_set_when_voter_comment_is_set_trigger"(); 1.103 + 1.104 +COMMENT ON FUNCTION "voter_comment_fields_only_set_when_voter_comment_is_set_trigger"() IS 'Implementation of trigger "voter_comment_fields_only_set_when_voter_comment_is_set" ON table "direct_voter"'; 1.105 +COMMENT ON TRIGGER "voter_comment_fields_only_set_when_voter_comment_is_set" ON "direct_voter" IS 'If "comment" is set to NULL, then other comment related fields are also set to NULL.'; 1.106 + 1.107 1.108 --------------------------------------------------------------- 1.109 -- Ensure that votes are not modified when issues are frozen -- 1.110 @@ -3735,6 +3747,9 @@ 1.111 PERFORM "lock_issue"("issue_id_p"); 1.112 SELECT "area_id" INTO "area_id_v" FROM "issue" WHERE "id" = "issue_id_p"; 1.113 SELECT "unit_id" INTO "unit_id_v" FROM "area" WHERE "id" = "area_id_v"; 1.114 + -- delete timestamp of voting comment: 1.115 + UPDATE "direct_voter" SET "comment_changed" = NULL 1.116 + WHERE "issue_id" = "issue_id_p"; 1.117 -- delete delegating votes (in cases of manual reset of issue state): 1.118 DELETE FROM "delegating_voter" 1.119 WHERE "issue_id" = "issue_id_p"; 1.120 @@ -4312,8 +4327,6 @@ 1.121 "closed" = NULL, 1.122 "ranks_available" = FALSE 1.123 WHERE "id" = "issue_id_p"; 1.124 - DELETE FROM "voting_comment" 1.125 - WHERE "issue_id" = "issue_id_p"; 1.126 DELETE FROM "delegating_voter" 1.127 WHERE "issue_id" = "issue_id_p"; 1.128 DELETE FROM "direct_voter"