Created
January 2, 2014 16:41
-
-
Save drsnyder/8222047 to your computer and use it in GitHub Desktop.
The schema for counters.py (https://gist.github.com/drsnyder/8222028).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
CREATE TABLE counters ( | |
count_type INTEGER NOT NULL, | |
count_id INTEGER NOT NULL, | |
count INTEGER NOT NULL | |
); | |
-- later to fix the issue | |
ALTER TABLE counters ADD PRIMARY KEY (count_type, count_id); | |
CREATE TABLE primary_relation ( | |
id INTEGER PRIMARY KEY, | |
a_counter INTEGER NOT NULL DEFAULT 0 | |
); | |
INSERT INTO primary_relation | |
SELECT i FROM generate_series(1,5) AS i; | |
CREATE OR REPLACE FUNCTION increment_count(ctype integer, cid integer, i integer) RETURNS VOID | |
AS $$ | |
BEGIN | |
LOOP | |
UPDATE counters | |
SET count = count + i | |
WHERE count_type = ctype AND count_id = cid; | |
IF FOUND THEN | |
RETURN; | |
END IF; | |
BEGIN | |
INSERT INTO counters (count_type, count_id, count) | |
VALUES (ctype, cid, i); | |
RETURN; | |
EXCEPTION WHEN OTHERS THEN | |
END; | |
END LOOP; | |
END; | |
$$ | |
LANGUAGE PLPGSQL; | |
CREATE OR REPLACE FUNCTION update_primary_a_count(ctype integer) RETURNS VOID | |
AS $$ | |
WITH deleted_counts_cte AS ( | |
DELETE | |
FROM counters | |
WHERE count_type = ctype | |
RETURNING * | |
), rollup_cte AS ( | |
SELECT count_id, SUM(count) AS count | |
FROM deleted_counts_cte | |
GROUP BY count_id | |
HAVING SUM(count) <> 0 | |
) | |
UPDATE primary_relation | |
SET a_counter = a_counter + rollup_cte.count | |
FROM rollup_cte | |
WHERE primary_relation.id = rollup_cte.count_id | |
$$ LANGUAGE SQL; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment