• RoundSparrow @ BT@bulletintree.comOPM
    link
    fedilink
    arrow-up
    1
    ·
    1 year ago
    CREATE OR REPLACE FUNCTION post_aggregates_score ()
        RETURNS TRIGGER
        LANGUAGE plpgsql
        AS $$
    BEGIN
        IF (TG_OP = 'INSERT') THEN
            UPDATE
                post_aggregates pa
            SET
                score = score + NEW.score,
                upvotes = CASE WHEN NEW.score = 1 THEN
                    upvotes + 1
                ELSE
                    upvotes
                END,
                downvotes = CASE WHEN NEW.score = - 1 THEN
                    downvotes + 1
                ELSE
                    downvotes
                END,
                controversy_rank = controversy_rank (pa.upvotes + CASE WHEN NEW.score = 1 THEN
                        1
                    ELSE
                        0
                    END::numeric, pa.downvotes + CASE WHEN NEW.score = - 1 THEN
                        1
                    ELSE
                        0
                    END::numeric)
            WHERE
                pa.post_id = NEW.post_id;
        ELSIF (TG_OP = 'DELETE') THEN
            -- Join to post because that post may not exist anymore
            UPDATE
                post_aggregates pa
            SET
                score = score - OLD.score,
                upvotes = CASE WHEN OLD.score = 1 THEN
                    upvotes - 1
                ELSE
                    upvotes
                END,
                downvotes = CASE WHEN OLD.score = - 1 THEN
                    downvotes - 1
                ELSE
                    downvotes
                END,
                controversy_rank = controversy_rank (pa.upvotes + CASE WHEN NEW.score = 1 THEN
                        1
                    ELSE
                        0
                    END::numeric, pa.downvotes + CASE WHEN NEW.score = - 1 THEN
                        1
                    ELSE
                        0
                    END::numeric)
            FROM
                post p
            WHERE
                pa.post_id = p.id
                AND pa.post_id = OLD.post_id;
        END IF;
        RETURN NULL;
    END
    $$;