Skip to content

Commit

Permalink
Add rank_members and rank_members_in methods
Browse files Browse the repository at this point in the history
* Added `rank_members(members_and_scores)` and `rank_members_in(leaderboard_name, members_and_scores)` allowing you to pass in an array of `member_name, score, member_name, score` and so on. Use this method to do bulk insert of data, but be mindful of the amount of data you are inserting since a single transaction can get quite large.
* Bump version to 2.0.5
  • Loading branch information
David Czarnecki committed Mar 15, 2012
1 parent 1628827 commit e07ea14
Show file tree
Hide file tree
Showing 7 changed files with 40 additions and 3 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.markdown
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# CHANGELOG

## leaderboard 2.0.5 (2012-03-14)

* Added `rank_members(members_and_scores)` and `rank_members_in(leaderboard_name, members_and_scores)` allowing you to pass in an array of `member_name, score, member_name, score` and so on. Use this method to do bulk insert of data, but be mindful of the amount of data you are inserting since a single transaction can get quite large.

## leaderboard 2.0.4 (2012-02-29)

* Added `page_for(member, page_size = DEFAULT_PAGE_SIZE)` and `page_for_in(leaderboard_name, member, page_size = DEFAULT_PAGE_SIZE)` calls to allow you to determine the page where a member falls in the leaderboard
Expand Down
2 changes: 1 addition & 1 deletion README.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,7 @@ Average time to request an arbitrary page from the leaderboard:

## Future Ideas

* Bulk insert
* Ideas?

## Ports

Expand Down
19 changes: 19 additions & 0 deletions lib/leaderboard.rb
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,25 @@ def rank_member(member, score)
def rank_member_in(leaderboard_name, member, score)
@redis_connection.zadd(leaderboard_name, score, member)
end

# Rank an array of members in the leaderboard.
#
# @param members_and_scores [Splat] Variable list of members and scores
def rank_members(*members_and_scores)
rank_members_in(@leaderboard_name, *members_and_scores)
end

# Rank an array of members in the named leaderboard.
#
# @param leaderboard_name [String] Name of the leaderboard.
# @param members_and_scores [Splat] Variable list of members and scores
def rank_members_in(leaderboard_name, *members_and_scores)
@redis_connection.multi do |transaction|
members_and_scores.each_slice(2) do |member_and_score|
transaction.zadd(leaderboard_name, member_and_score[1], member_and_score[0])
end
end
end

# Remove a member from the leaderboard.
#
Expand Down
2 changes: 1 addition & 1 deletion lib/leaderboard/version.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
class Leaderboard
VERSION = '2.0.4'.freeze
VERSION = '2.0.5'.freeze
end
2 changes: 1 addition & 1 deletion test/test_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
class LeaderboardTest < Test::Unit::TestCase

def test_version
assert_equal '2.0.4', Leaderboard::VERSION
assert_equal '2.0.5', Leaderboard::VERSION
end

private
Expand Down
7 changes: 7 additions & 0 deletions test/test_leaderboard.rb
Original file line number Diff line number Diff line change
Expand Up @@ -467,4 +467,11 @@ def test_page_for
assert_equal 2, @leaderboard.page_for('member_10', 10)
assert_equal 2, @leaderboard.page_for('member_1', 10)
end

def test_rank_members
assert_equal 0, @leaderboard.total_members
@leaderboard.rank_members('member_1', 1, 'member_10', 10)
assert_equal 2, @leaderboard.total_members
assert_equal 'member_10', @leaderboard.leaders(1).first[:member]
end
end
7 changes: 7 additions & 0 deletions test/test_rev_leaderboard.rb
Original file line number Diff line number Diff line change
Expand Up @@ -467,4 +467,11 @@ def test_page_for
assert_equal 2, @leaderboard.page_for('member_17', 10)
assert_equal 2, @leaderboard.page_for('member_11', 10)
end

def test_rank_members
assert_equal 0, @leaderboard.total_members
@leaderboard.rank_members('member_1', 1, 'member_10', 10)
assert_equal 2, @leaderboard.total_members
assert_equal 'member_1', @leaderboard.leaders(1).first[:member]
end
end

0 comments on commit e07ea14

Please sign in to comment.