* VRFS-1981 - delete old scores

This commit is contained in:
Seth Call 2014-08-31 22:24:11 -05:00
parent cf061aa055
commit f0304f2ca3
3 changed files with 71 additions and 1 deletions

View File

@ -205,3 +205,4 @@ drop_session_invite_constraint.sql
sms_index_single_session.sql
fix_current_scores_user_association.sql
undirected_scores.sql
discard_scores.sql

17
db/up/discard_scores.sql Normal file
View File

@ -0,0 +1,17 @@
-- get rid of excessive scores
--SELECT score_history_last_imported_at FROM generic_state LIMIT 1;
DROP FUNCTION IF EXISTS discard_scores();
CREATE FUNCTION discard_scores () RETURNS VOID AS $$
BEGIN
WITH scores_to_delete AS (
SELECT alocidispid, blocidispid, scorer, created_at FROM (SELECT *, row_number() OVER (PARTITION BY alocidispid, blocidispid, scorer ORDER BY scores.created_at DESC) AS rownum FROM scores) tmp WHERE rownum >= 6
)
DELETE FROM scores USING scores_to_delete WHERE
scores.alocidispid = scores_to_delete.alocidispid AND
scores.blocidispid = scores_to_delete.blocidispid AND
scores.scorer = scores_to_delete.scorer AND
scores.created_at = scores_to_delete.created_at;
RETURN;
END;
$$ LANGUAGE plpgsql;

View File

@ -344,4 +344,56 @@ describe Score do
result[7]['full_score'].to_i.should == user2.last_jam_audio_latency + user1.last_jam_audio_latency + 22
end
end
describe "discard_scores" do
it "works" do
Score.createx(1234, 'anodeid', 0x01020304, 2345, 'bnodeid', 0x02030405, 20, nil, 'foo')
Score.count.should == 2
Score.connection.execute("SELECT discard_scores()").check
Score.count.should == 2
end
it "discards over 5 items" do
Score.createx(1234, 'anodeid', 0x01020304, 2345, 'bnodeid', 0x02030405, 20, nil, 'foo')
Score.createx(1234, 'anodeid', 0x01020304, 2345, 'bnodeid', 0x02030405, 20, nil, 'foo')
Score.createx(1234, 'anodeid', 0x01020304, 2345, 'bnodeid', 0x02030405, 20, nil, 'foo')
Score.createx(1234, 'anodeid', 0x01020304, 2345, 'bnodeid', 0x02030405, 20, nil, 'foo')
Score.createx(1234, 'anodeid', 0x01020304, 2345, 'bnodeid', 0x02030405, 20, nil, 'foo')
Score.count.should == 10
Score.connection.execute("SELECT discard_scores()").check
Score.count.should == 10
Score.createx(1234, 'anodeid', 0x01020304, 2345, 'bnodeid', 0x02030405, 26, nil, 'foo')
Score.connection.execute("UPDATE scores set created_at = TIMESTAMP '#{2.days.ago}' WHERE score = 26").cmdtuples.should == 2
Score.connection.execute("SELECT discard_scores()").check
Score.count.should == 10
Score.connection.execute("SELECT * FROM scores WHERE score = 20").ntuples.should == 10
Score.connection.execute("SELECT * FROM scores WHERE scorer = 0").ntuples.should == 5
Score.connection.execute("SELECT * FROM scores WHERE scorer = 1").ntuples.should == 5
Score.createx(2345, 'bnodeid', 0x02030405, 1234, 'anodeid', 0x01020304, 22, nil, 'foo')
Score.createx(2345, 'bnodeid', 0x02030405, 1234, 'anodeid', 0x01020304, 22, nil, 'foo')
Score.createx(2345, 'bnodeid', 0x02030405, 1234, 'anodeid', 0x01020304, 22, nil, 'foo')
Score.createx(2345, 'bnodeid', 0x02030405, 1234, 'anodeid', 0x01020304, 22, nil, 'foo')
Score.createx(2345, 'bnodeid', 0x02030405, 1234, 'anodeid', 0x01020304, 22, nil, 'foo')
Score.count.should == 20
Score.connection.execute("SELECT discard_scores()").check
Score.count.should == 20
Score.createx(2345, 'bnodeid', 0x02030405, 1234, 'anodeid', 0x01020304, 36, nil, 'foo')
Score.connection.execute("UPDATE scores set created_at = TIMESTAMP '#{2.days.ago}' WHERE score = 36").cmdtuples.should == 2
Score.connection.execute("SELECT discard_scores()").check
Score.count.should == 20
Score.connection.execute("SELECT * FROM scores WHERE score = 22").ntuples.should == 10
Score.connection.execute("SELECT * FROM scores WHERE score = 22 AND scorer = 0").ntuples.should == 5
Score.connection.execute("SELECT * FROM scores WHERE score = 22 AND scorer = 1").ntuples.should == 5
end
end
end