From f0304f2ca35f607fea99e768bad3ba6e85b0041a Mon Sep 17 00:00:00 2001 From: Seth Call Date: Sun, 31 Aug 2014 22:24:11 -0500 Subject: [PATCH] * VRFS-1981 - delete old scores --- db/manifest | 3 +- db/up/discard_scores.sql | 17 ++++++++ ruby/spec/jam_ruby/models/score_spec.rb | 52 +++++++++++++++++++++++++ 3 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 db/up/discard_scores.sql diff --git a/db/manifest b/db/manifest index 213ea0970..e479e0753 100755 --- a/db/manifest +++ b/db/manifest @@ -204,4 +204,5 @@ define_environment_in_db.sql drop_session_invite_constraint.sql sms_index_single_session.sql fix_current_scores_user_association.sql -undirected_scores.sql \ No newline at end of file +undirected_scores.sql +discard_scores.sql \ No newline at end of file diff --git a/db/up/discard_scores.sql b/db/up/discard_scores.sql new file mode 100644 index 000000000..0c2fd8f93 --- /dev/null +++ b/db/up/discard_scores.sql @@ -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; diff --git a/ruby/spec/jam_ruby/models/score_spec.rb b/ruby/spec/jam_ruby/models/score_spec.rb index 5b1268822..cae8d3475 100644 --- a/ruby/spec/jam_ruby/models/score_spec.rb +++ b/ruby/spec/jam_ruby/models/score_spec.rb @@ -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