Class: CompetitionRankingLeaderboard
- Inherits:
-
Leaderboard
- Object
- Leaderboard
- CompetitionRankingLeaderboard
- Defined in:
- lib/competition_ranking_leaderboard.rb
Constant Summary
Constants inherited from Leaderboard
Leaderboard::DEFAULT_LEADERBOARD_REQUEST_OPTIONS, Leaderboard::DEFAULT_OPTIONS, Leaderboard::DEFAULT_PAGE_SIZE, Leaderboard::DEFAULT_REDIS_HOST, Leaderboard::DEFAULT_REDIS_OPTIONS, Leaderboard::DEFAULT_REDIS_PORT, Leaderboard::VERSION
Instance Attribute Summary
Attributes inherited from Leaderboard
#leaderboard_name, #page_size, #reverse
Instance Method Summary collapse
-
#rank_for_in(leaderboard_name, member) ⇒ Object
Retrieve the rank for a member in the named leaderboard.
-
#ranked_in_list_in(leaderboard_name, members, options = {}) ⇒ Object
Retrieve a page of leaders from the named leaderboard for a given list of members.
-
#score_and_rank_for_in(leaderboard_name, member) ⇒ Object
Retrieve the score and rank for a member in the named leaderboard.
Methods inherited from Leaderboard
#all_leaders, #all_leaders_from, #around_me, #around_me_in, #change_score_for, #change_score_for_member_in, #check_member?, #check_member_in?, #delete_leaderboard, #delete_leaderboard_named, #disconnect, #expire_leaderboard, #expire_leaderboard_at, #expire_leaderboard_at_for, #expire_leaderboard_for, #initialize, #intersect_leaderboards, #leaders, #leaders_in, #member_at, #member_at_in, #member_data_for, #member_data_for_in, #members_data_for, #members_data_for_in, #members_from_rank_range, #members_from_rank_range_in, #members_from_score_range, #members_from_score_range_in, #merge_leaderboards, #page_for, #page_for_in, #percentile_for, #percentile_for_in, #rank_for, #rank_member, #rank_member_across, #rank_member_if, #rank_member_if_in, #rank_member_in, #rank_members, #rank_members_in, #ranked_in_list, #remove_member, #remove_member_data, #remove_member_data_in, #remove_member_from, #remove_members_in_score_range, #remove_members_in_score_range_in, #remove_members_outside_rank, #remove_members_outside_rank_in, #score_and_rank_for, #score_for, #score_for_in, #score_for_percentile, #score_for_percentile_in, #top, #top_in, #total_members, #total_members_in, #total_members_in_score_range, #total_members_in_score_range_in, #total_pages, #total_pages_in, #total_scores, #total_scores_in, #update_member_data, #update_member_data_in
Constructor Details
This class inherits a constructor from Leaderboard
Instance Method Details
#rank_for_in(leaderboard_name, member) ⇒ Object
Retrieve the rank for a member in the named leaderboard.
10 11 12 13 14 15 16 17 |
# File 'lib/competition_ranking_leaderboard.rb', line 10 def rank_for_in(leaderboard_name, member) member_score = score_for_in(leaderboard_name, member) if @reverse return @redis_connection.zcount(leaderboard_name, '-inf', "(#{member_score}") + 1 rescue nil else return @redis_connection.zcount(leaderboard_name, "(#{member_score}", '+inf') + 1 rescue nil end end |
#ranked_in_list_in(leaderboard_name, members, options = {}) ⇒ Object
Retrieve a page of leaders from the named leaderboard for a given list of members.
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
# File 'lib/competition_ranking_leaderboard.rb', line 53 def ranked_in_list_in(leaderboard_name, members, = {}) = DEFAULT_LEADERBOARD_REQUEST_OPTIONS.dup .merge!() ranks_for_members = [] responses = @redis_connection.multi do |transaction| members.each do |member| if @reverse transaction.zrank(leaderboard_name, member) else transaction.zrevrank(leaderboard_name, member) end transaction.zscore(leaderboard_name, member) end end unless [:members_only] included_members = [] scores = [] members.each_with_index do |member, index| data = {} data[@member_key] = member unless [:members_only] data[@score_key] = responses[index * 2 + 1].to_f if responses[index * 2 + 1] if data[@score_key] == nil next unless [:include_missing] end end included_members << member scores << data[@score_key] ranks_for_members << data end if [:with_member_data] members_data_for_in(leaderboard_name, included_members).each_with_index do |member_data, index| ranks_for_members[index][@member_data_key] = member_data end end rankings_for_members_having_scores_in(leaderboard_name, included_members, scores).each_with_index do |rank, index| ranks_for_members[index][@rank_key] = rank end case [:sort_by] when :rank ranks_for_members = ranks_for_members.sort_by { |member| member[@rank_key] } when :score ranks_for_members = ranks_for_members.sort_by { |member| member[@score_key] } end ranks_for_members end |
#score_and_rank_for_in(leaderboard_name, member) ⇒ Object
Retrieve the score and rank for a member in the named leaderboard.
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
# File 'lib/competition_ranking_leaderboard.rb', line 25 def score_and_rank_for_in(leaderboard_name, member) responses = @redis_connection.multi do |transaction| transaction.zscore(leaderboard_name, member) if @reverse transaction.zrank(leaderboard_name, member) else transaction.zrevrank(leaderboard_name, member) end end responses[0] = responses[0].to_f if responses[0] responses[1] = if @reverse @redis_connection.zcount(leaderboard_name, '-inf', "(#{responses[0]}") + 1 rescue nil else @redis_connection.zcount(leaderboard_name, "(#{responses[0]}", '+inf') + 1 rescue nil end {@member_key => member, @score_key => responses[0], @rank_key => responses[1]} end |