1 -- Add comment aggregates
2 CREATE TABLE comment_aggregates (
4 comment_id int REFERENCES COMMENT ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
5 score bigint NOT NULL DEFAULT 0,
6 upvotes bigint NOT NULL DEFAULT 0,
7 downvotes bigint NOT NULL DEFAULT 0,
8 published timestamp NOT NULL DEFAULT now(),
12 INSERT INTO comment_aggregates (comment_id, score, upvotes, downvotes, published)
15 COALESCE(cl.total, 0::bigint) AS score,
16 COALESCE(cl.up, 0::bigint) AS upvotes,
17 COALESCE(cl.down, 0::bigint) AS downvotes,
24 sum(l.score) AS total,
26 CASE WHEN l.score = 1 THEN
32 CASE WHEN l.score = '-1'::integer THEN
40 l.comment_id) cl ON cl.id = c.id;
42 -- Add comment aggregate triggers
43 -- initial comment add
44 CREATE FUNCTION comment_aggregates_comment ()
49 IF (TG_OP = 'INSERT') THEN
50 INSERT INTO comment_aggregates (comment_id)
52 ELSIF (TG_OP = 'DELETE') THEN
53 DELETE FROM comment_aggregates
54 WHERE comment_id = OLD.id;
60 CREATE TRIGGER comment_aggregates_comment
61 AFTER INSERT OR DELETE ON comment
63 EXECUTE PROCEDURE comment_aggregates_comment ();
66 CREATE FUNCTION comment_aggregates_score ()
71 IF (TG_OP = 'INSERT') THEN
75 score = score + NEW.score,
76 upvotes = CASE WHEN NEW.score = 1 THEN
81 downvotes = CASE WHEN NEW.score = - 1 THEN
87 ca.comment_id = NEW.comment_id;
88 ELSIF (TG_OP = 'DELETE') THEN
89 -- Join to comment because that comment may not exist anymore
93 score = score - OLD.score,
94 upvotes = CASE WHEN OLD.score = 1 THEN
99 downvotes = CASE WHEN OLD.score = - 1 THEN
108 AND ca.comment_id = OLD.comment_id;
114 CREATE TRIGGER comment_aggregates_score
115 AFTER INSERT OR DELETE ON comment_like
117 EXECUTE PROCEDURE comment_aggregates_score ();