diff options
author | Yorhel <git@yorhel.nl> | 2009-10-18 18:06:14 +0200 |
---|---|---|
committer | Yorhel <git@yorhel.nl> | 2009-10-18 18:06:14 +0200 |
commit | 62cb41c3b8780bffe5a8ea58a6a7b5053d9e1059 (patch) | |
tree | 46d3cf89bb4149b014f970f117ba195342269fcf /util | |
parent | ee96a4381fa187eede8374601d0c06cd861eb66c (diff) |
SQL: Fixed calculation of tags_vn_bayesian.spoiler
Diffstat (limited to 'util')
-rw-r--r-- | util/dump.sql | 2 | ||||
-rw-r--r-- | util/updates/update_2.8.sql | 34 |
2 files changed, 35 insertions, 1 deletions
diff --git a/util/dump.sql b/util/dump.sql index 145c09e8..9fbff0a2 100644 --- a/util/dump.sql +++ b/util/dump.sql @@ -589,7 +589,7 @@ BEGIN SELECT * FROM tags_vn UNION SELECT * FROM tag_vn_childs(); -- grouped by (tag, vid, uid), so only one user votes on one parent tag per VN entry CREATE OR REPLACE TEMPORARY VIEW tags_vn_grouped AS - SELECT tag, vid, uid, MAX(vote)::real AS vote, COALESCE(AVG(spoiler), 0)::real AS spoiler + SELECT tag, vid, uid, MAX(vote)::real AS vote, AVG(spoiler)::real AS spoiler FROM tags_vn_all GROUP BY tag, vid, uid; -- grouped by (tag, vid) and serialized into a table DROP INDEX IF EXISTS tags_vn_bayesian_tag; diff --git a/util/updates/update_2.8.sql b/util/updates/update_2.8.sql index c8bcda38..54367c9b 100644 --- a/util/updates/update_2.8.sql +++ b/util/updates/update_2.8.sql @@ -137,3 +137,37 @@ BEGIN END; $$ LANGUAGE plpgsql; + + +-- fix calculation of the tags_vn_bayesian.spoiler column + +CREATE OR REPLACE FUNCTION tag_vn_calc() RETURNS void AS $$ +BEGIN + -- all votes for all tags + CREATE OR REPLACE TEMPORARY VIEW tags_vn_all AS + SELECT * FROM tags_vn UNION SELECT * FROM tag_vn_childs(); + -- grouped by (tag, vid, uid), so only one user votes on one parent tag per VN entry + CREATE OR REPLACE TEMPORARY VIEW tags_vn_grouped AS + SELECT tag, vid, uid, MAX(vote)::real AS vote, AVG(spoiler)::real AS spoiler + FROM tags_vn_all GROUP BY tag, vid, uid; + -- grouped by (tag, vid) and serialized into a table + DROP INDEX IF EXISTS tags_vn_bayesian_tag; + TRUNCATE tags_vn_bayesian; + INSERT INTO tags_vn_bayesian + SELECT tag, vid, COUNT(uid) AS users, AVG(vote)::real AS rating, + (CASE WHEN AVG(spoiler) < 0.7 THEN 0 WHEN AVG(spoiler) > 1.3 THEN 2 ELSE 1 END)::smallint AS spoiler + FROM tags_vn_grouped + GROUP BY tag, vid + HAVING AVG(vote) > 0; + CREATE INDEX tags_vn_bayesian_tag ON tags_vn_bayesian (tag); + -- now perform the bayesian ranking calculation + UPDATE tags_vn_bayesian tvs SET rating = + ((SELECT AVG(users)::real * AVG(rating)::real FROM tags_vn_bayesian WHERE tag = tvs.tag) + users*rating) + / ((SELECT AVG(users)::real FROM tags_vn_bayesian WHERE tag = tvs.tag) + users)::real; + -- and update the VN count in the tags table as well + UPDATE tags SET c_vns = (SELECT COUNT(*) FROM tags_vn_bayesian WHERE tag = id); + RETURN; +END; +$$ LANGUAGE plpgsql; +SELECT tag_vn_calc(); + |