Skip to content

Commit

Permalink
Merge pull request #56 from agoragames/add-include_missing-option
Browse files Browse the repository at this point in the history
Add :include missing option in leaderboard request options
  • Loading branch information
czarneckid committed Mar 20, 2015
2 parents 10cb3c8 + 0f8f125 commit 3818878
Show file tree
Hide file tree
Showing 7 changed files with 67 additions and 1 deletion.
2 changes: 2 additions & 0 deletions CHANGELOG.markdown
Expand Up @@ -4,6 +4,8 @@

* Fixes TieRankingLeaderboard doesn't rank if the score is 0 [#53](https://github.com/agoragames/leaderboard/issues/53).
* Allow member data to be set in the `change_score_for(...)` method.
* Add `:include_missing` option in leaderboard request options to change
whether or not to include missing members in the result.

## 3.9.0 (2015-02-15)

Expand Down
4 changes: 4 additions & 0 deletions lib/competition_ranking_leaderboard.rb
Expand Up @@ -72,6 +72,10 @@ def ranked_in_list_in(leaderboard_name, members, options = {})
data[@member_key] = member
unless leaderboard_options[:members_only]
data[@score_key] = responses[index * 2 + 1].to_f if responses[index * 2 + 1]
if data[@score_key] == nil
next unless leaderboard_options[:include_missing]
end

if @reverse
data[@rank_key] = @redis_connection.zcount(leaderboard_name, '-inf', "(#{data[@score_key]}") + 1 rescue nil
else
Expand Down
6 changes: 5 additions & 1 deletion lib/leaderboard.rb
Expand Up @@ -41,7 +41,8 @@ class Leaderboard
:with_member_data => false,
:page_size => nil,
:members_only => false,
:sort_by => :none
:sort_by => :none,
:include_missing => true
}

# Name of the leaderboard.
Expand Down Expand Up @@ -957,6 +958,9 @@ def ranked_in_list_in(leaderboard_name, members, options = {})
data[@member_key] = member
unless leaderboard_options[:members_only]
data[@rank_key] = responses[index * 2] + 1 rescue nil
if data[@rank_key] == nil
next unless leaderboard_options[:include_missing]
end
data[@score_key] = responses[index * 2 + 1].to_f if responses[index * 2 + 1]
end

Expand Down
4 changes: 4 additions & 0 deletions lib/tie_ranking_leaderboard.rb
Expand Up @@ -243,6 +243,10 @@ def ranked_in_list_in(leaderboard_name, members, options = {})
else
data[@rank_key] = @redis_connection.zrevrank(ties_leaderboard_key(leaderboard_name), data[@score_key].to_s) + 1 rescue nil
end

if data[@rank_key] == nil
next unless leaderboard_options[:include_missing]
end
end

if leaderboard_options[:with_member_data]
Expand Down
17 changes: 17 additions & 0 deletions spec/competition_ranking_leaderboard_spec.rb
Expand Up @@ -166,5 +166,22 @@
expect(members[24][:member]).to eql('member_1')
end

it 'should allow you to include or exclude missing members using the :include_missing option' do
@leaderboard = CompetitionRankingLeaderboard.new('ties', Leaderboard::DEFAULT_OPTIONS, {:host => "127.0.0.1", :db => 15})
rank_members_in_leaderboard(25)

leaders = @leaderboard.ranked_in_list(['member_1', 'member_15', 'member_25', 'member_200'])
expect(leaders.size).to be(4)
expect(leaders[0][:member]).to eql('member_1')
expect(leaders[1][:member]).to eql('member_15')
expect(leaders[2][:member]).to eql('member_25')
expect(leaders[3][:member]).to eql('member_200')

leaders = @leaderboard.ranked_in_list(['member_1', 'member_15', 'member_25', 'member_200'], :include_missing => false)
expect(leaders.size).to be(3)
expect(leaders[0][:member]).to eql('member_1')
expect(leaders[1][:member]).to eql('member_15')
expect(leaders[2][:member]).to eql('member_25')
end
end
end
17 changes: 17 additions & 0 deletions spec/leaderboard_spec.rb
Expand Up @@ -821,4 +821,21 @@
expect(@redis_connection.exists("member_data")).to be_truthy
expect(@redis_connection.exists("name:member_data")).to be_falsey
end

it 'should allow you to include or exclude missing members using the :include_missing option' do
rank_members_in_leaderboard(25)

leaders = @leaderboard.ranked_in_list(['member_1', 'member_15', 'member_25', 'member_200'])
expect(leaders.size).to be(4)
expect(leaders[0][:member]).to eql('member_1')
expect(leaders[1][:member]).to eql('member_15')
expect(leaders[2][:member]).to eql('member_25')
expect(leaders[3][:member]).to eql('member_200')

leaders = @leaderboard.ranked_in_list(['member_1', 'member_15', 'member_25', 'member_200'], :include_missing => false)
expect(leaders.size).to be(3)
expect(leaders[0][:member]).to eql('member_1')
expect(leaders[1][:member]).to eql('member_15')
expect(leaders[2][:member]).to eql('member_25')
end
end
18 changes: 18 additions & 0 deletions spec/tie_ranking_leaderboard_spec.rb
Expand Up @@ -328,5 +328,23 @@
expect(leaderboard.rank_for('member_1')).to eq(2)
expect(leaderboard.rank_for('member_2')).to eq(2)
end

it 'should allow you to include or exclude missing members using the :include_missing option' do
@leaderboard = TieRankingLeaderboard.new('ties', Leaderboard::DEFAULT_OPTIONS, {:host => "127.0.0.1", :db => 15})
rank_members_in_leaderboard(25)

leaders = @leaderboard.ranked_in_list(['member_1', 'member_15', 'member_25', 'member_200'])
expect(leaders.size).to be(4)
expect(leaders[0][:member]).to eql('member_1')
expect(leaders[1][:member]).to eql('member_15')
expect(leaders[2][:member]).to eql('member_25')
expect(leaders[3][:member]).to eql('member_200')

leaders = @leaderboard.ranked_in_list(['member_1', 'member_15', 'member_25', 'member_200'], :include_missing => false)
expect(leaders.size).to be(3)
expect(leaders[0][:member]).to eql('member_1')
expect(leaders[1][:member]).to eql('member_15')
expect(leaders[2][:member]).to eql('member_25')
end
end
end

0 comments on commit 3818878

Please sign in to comment.