@@ -32,7 +32,7 @@ class Leaderboard(object):
3232 RANK_KEY = 'rank'
3333
3434 @classmethod
35- def pool (self , host , port , db , pools = {}, ** options ):
35+ def pool (cls , host , port , db , pools = {}, ** options ):
3636 '''
3737 Fetch a redis connection pool for the unique combination of host
3838 and port. Will create a new one if there isn't one already.
@@ -74,7 +74,7 @@ def __init__(self, leaderboard_name, **options):
7474 self .DEFAULT_GLOBAL_MEMBER_DATA )
7575
7676 self .order = self .options .pop ('order' , self .DESC ).lower ()
77- if not self .order in [self .ASC , self .DESC ]:
77+ if self .order not in [self .ASC , self .DESC ]:
7878 raise ValueError (
7979 "%s is not one of [%s]" % (self .order , "," .join ([self .ASC , self .DESC ])))
8080
@@ -778,7 +778,7 @@ def leaders(self, current_page, **options):
778778 '''
779779 return self .leaders_in (self .leaderboard_name , current_page , ** options )
780780
781- def leaders_in (self , leaderboard_name , current_page , members_only = False , ** options ):
781+ def leaders_in (self , leaderboard_name , current_page , ** options ):
782782 '''
783783 Retrieve a page of leaders from the named leaderboard.
784784
@@ -800,33 +800,11 @@ def leaders_in(self, leaderboard_name, current_page, members_only=False, **optio
800800
801801 ending_offset = (starting_offset + page_size ) - 1
802802
803- response = self ._range_method (
804- self .redis_connection ,
803+ return self ._members_from_rank_range_internal (
805804 leaderboard_name ,
806805 int (starting_offset ),
807806 int (ending_offset ),
808- withscores = not members_only )
809-
810- if members_only :
811- return [{self .MEMBER_KEY : member } for member in response ]
812-
813- members = []
814- ranks_for_members = []
815- for i , (member , score ) in enumerate (response ):
816- members .append (member )
817- ranks_for_members .append ({
818- self .MEMBER_KEY : member ,
819- self .RANK_KEY : starting_offset + i + 1 ,
820- self .SCORE_KEY : score ,
821- })
822-
823- if options .get ('with_member_data' , False ):
824- self ._with_member_data (leaderboard_name , members , ranks_for_members )
825-
826- if 'sort_by' in options :
827- self ._sort_by (ranks_for_members , options ['sort_by' ])
828-
829- return ranks_for_members
807+ ** options )
830808
831809 def all_leaders (self , ** options ):
832810 '''
@@ -845,10 +823,8 @@ def all_leaders_from(self, leaderboard_name, **options):
845823 @param options [Hash] Options to be used when retrieving the leaders from the named leaderboard.
846824 @return the named leaderboard.
847825 '''
848- raw_leader_data = self ._range_method (
849- self .redis_connection , leaderboard_name , 0 , - 1 , withscores = False )
850- return self ._parse_raw_members (
851- leaderboard_name , raw_leader_data , ** options )
826+ return self ._members_from_rank_range_internal (
827+ leaderboard_name , 0 , - 1 , ** options )
852828
853829 def members_from_score_range (
854830 self , minimum_score , maximum_score , ** options ):
@@ -919,22 +895,8 @@ def members_from_rank_range_in(
919895 if ending_rank > self .total_members_in (leaderboard_name ):
920896 ending_rank = self .total_members_in (leaderboard_name ) - 1
921897
922- raw_leader_data = []
923- if self .order == self .DESC :
924- raw_leader_data = self .redis_connection .zrevrange (
925- leaderboard_name ,
926- starting_rank ,
927- ending_rank ,
928- withscores = False )
929- else :
930- raw_leader_data = self .redis_connection .zrange (
931- leaderboard_name ,
932- starting_rank ,
933- ending_rank ,
934- withscores = False )
935-
936- return self ._parse_raw_members (
937- leaderboard_name , raw_leader_data , ** options )
898+ return self ._members_from_rank_range_internal (
899+ leaderboard_name , starting_rank , ending_rank , ** options )
938900
939901 def top (self , number , ** options ):
940902 '''
@@ -1031,14 +993,11 @@ def around_me_in(self, leaderboard_name, member, **options):
1031993
1032994 ending_offset = (starting_offset + page_size ) - 1
1033995
1034- raw_leader_data = self ._range_method (
1035- self .redis_connection ,
996+ return self ._members_from_rank_range_internal (
1036997 leaderboard_name ,
1037998 int (starting_offset ),
1038999 int (ending_offset ),
1039- withscores = False )
1040- return self ._parse_raw_members (
1041- leaderboard_name , raw_leader_data , ** options )
1000+ ** options )
10421001
10431002 def ranked_in_list (self , members , ** options ):
10441003 '''
@@ -1177,3 +1136,39 @@ def _parse_raw_members(
11771136 return self .ranked_in_list_in (leaderboard_name , members , ** options )
11781137 else :
11791138 return []
1139+
1140+ def _members_from_rank_range_internal (
1141+ self , leaderboard_name , start_rank , end_rank , members_only = False , ** options ):
1142+ '''
1143+ Format ordered members with score as efficiently as possible.
1144+ '''
1145+ response = self ._range_method (
1146+ self .redis_connection ,
1147+ leaderboard_name ,
1148+ start_rank ,
1149+ end_rank ,
1150+ withscores = not members_only )
1151+
1152+ if members_only or not response :
1153+ return [{self .MEMBER_KEY : member } for member in response ]
1154+
1155+ current_rank = start_rank
1156+ members = []
1157+ ranks_for_members = []
1158+ for index , (member , score ) in enumerate (response ):
1159+ members .append (member )
1160+ current_rank += 1
1161+ member_entry = {
1162+ self .MEMBER_KEY : member ,
1163+ self .RANK_KEY : current_rank ,
1164+ self .SCORE_KEY : score ,
1165+ }
1166+ ranks_for_members .append (member_entry )
1167+
1168+ if options .get ('with_member_data' , False ):
1169+ self ._with_member_data (leaderboard_name , members , ranks_for_members )
1170+
1171+ if 'sort_by' in options :
1172+ self ._sort_by (ranks_for_members , options ['sort_by' ])
1173+
1174+ return ranks_for_members
0 commit comments