Class: CompetitionRankingLeaderboard

Inherits:
Leaderboard show all
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

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.

Parameters:

  • leaderboard_name (String)

    Name of the leaderboard.

  • member (String)

    Member name.

Returns:

  • the rank for a member in the 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.

Parameters:

  • leaderboard_name (String)

    Name of the leaderboard.

  • members (Array)

    Member names.

  • options (Hash) (defaults to: {})

    Options to be used when retrieving the page from the named leaderboard.

Returns:

  • 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, options = {})
  leaderboard_options = DEFAULT_LEADERBOARD_REQUEST_OPTIONS.dup
  leaderboard_options.merge!(options)

  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 leaderboard_options[:members_only]

  included_members = []
  scores = []

  members.each_with_index do |member, index|
    data = {}
    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
    end

    included_members << member
    scores << data[@score_key]

    ranks_for_members << data
  end

  if leaderboard_options[: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 leaderboard_options[: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.

Parameters:

  • leaderboard_name (String)

    Name of the leaderboard.

  • member (String)

    Member name.

Returns:

  • the score and rank for a member in the named leaderboard as a Hash.



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