lib/leaderboard.rb in leaderboard-1.0.4 vs lib/leaderboard.rb in leaderboard-1.0.5

- old
+ new

@@ -1,9 +1,9 @@ require 'redis' class Leaderboard - VERSION = '1.0.4'.freeze + VERSION = '1.0.5'.freeze DEFAULT_PAGE_SIZE = 25 DEFAULT_REDIS_HOST = 'localhost' DEFAULT_REDIS_PORT = 6379 @@ -58,12 +58,13 @@ def total_pages total_pages_in(@leaderboard_name) end - def total_pages_in(leaderboard_name) - (total_members_in(leaderboard_name) / @page_size.to_f).ceil + def total_pages_in(leaderboard_name, page_size = nil) + page_size ||= @page_size.to_f + (total_members_in(leaderboard_name) / page_size.to_f).ceil end def total_members_in_score_range(min_score, max_score) total_members_in_score_range_in(@leaderboard_name, min_score, max_score) end @@ -122,52 +123,56 @@ def remove_members_in_score_range_in(leaderboard_name, min_score, max_score) @redis_connection.zremrangebyscore(leaderboard_name, min_score, max_score) end - def leaders(current_page, with_scores = true, with_rank = true, use_zero_index_for_rank = false) - leaders_in(@leaderboard_name, current_page, with_scores, with_rank, use_zero_index_for_rank) + def leaders(current_page, with_scores = true, with_rank = true, use_zero_index_for_rank = false, page_size = nil) + leaders_in(@leaderboard_name, current_page, with_scores, with_rank, use_zero_index_for_rank, page_size) end - def leaders_in(leaderboard_name, current_page, with_scores = true, with_rank = true, use_zero_index_for_rank = false) + def leaders_in(leaderboard_name, current_page, with_scores = true, with_rank = true, use_zero_index_for_rank = false, page_size = nil) if current_page < 1 current_page = 1 end - if current_page > total_pages_in(leaderboard_name) - current_page = total_pages_in(leaderboard_name) + page_size ||= @page_size + + if current_page > total_pages_in(leaderboard_name, page_size) + current_page = total_pages_in(leaderboard_name, page_size) end index_for_redis = current_page - 1 - starting_offset = (index_for_redis * @page_size) + starting_offset = (index_for_redis * page_size) if starting_offset < 0 starting_offset = 0 end - ending_offset = (starting_offset + @page_size) - 1 + ending_offset = (starting_offset + page_size) - 1 raw_leader_data = @redis_connection.zrevrange(leaderboard_name, starting_offset, ending_offset, :with_scores => with_scores) if raw_leader_data massage_leader_data(leaderboard_name, raw_leader_data, with_scores, with_rank, use_zero_index_for_rank) else return nil end end - def around_me(member, with_scores = true, with_rank = true, use_zero_index_for_rank = false) - around_me_in(@leaderboard_name, member, with_scores, with_rank, use_zero_index_for_rank) + def around_me(member, with_scores = true, with_rank = true, use_zero_index_for_rank = false, page_size = nil) + around_me_in(@leaderboard_name, member, with_scores, with_rank, use_zero_index_for_rank, page_size) end - def around_me_in(leaderboard_name, member, with_scores = true, with_rank = true, use_zero_index_for_rank = false) + def around_me_in(leaderboard_name, member, with_scores = true, with_rank = true, use_zero_index_for_rank = false, page_size = nil) reverse_rank_for_member = @redis_connection.zrevrank(leaderboard_name, member) - starting_offset = reverse_rank_for_member - (@page_size / 2) + page_size ||= @page_size + + starting_offset = reverse_rank_for_member - (page_size / 2) if starting_offset < 0 starting_offset = 0 end - - ending_offset = (starting_offset + @page_size) - 1 + + ending_offset = (starting_offset + page_size) - 1 raw_leader_data = @redis_connection.zrevrange(leaderboard_name, starting_offset, ending_offset, :with_scores => with_scores) if raw_leader_data massage_leader_data(leaderboard_name, raw_leader_data, with_scores, with_rank, use_zero_index_for_rank) else \ No newline at end of file