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_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, #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
# 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]

  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

      if @reverse
        data[@rank_key] = @redis_connection.zcount(leaderboard_name, '-inf', "(#{data[@score_key]}") + 1 rescue nil
      else
        data[@rank_key] = @redis_connection.zcount(leaderboard_name, "(#{data[@score_key]}", '+inf') + 1 rescue nil
      end
    end

    if leaderboard_options[:with_member_data]
      data[@member_data_key] = member_data_for_in(leaderboard_name, member)
    end

    ranks_for_members << data
  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