Skip to content

Commit 3669beb

Browse files
authored
Merge pull request #1300 from Hugo-Hache/hh/zrevrank-withscore
Add :with_score option to zrank and zrevrank
2 parents 08f3e18 + fb70908 commit 3669beb

File tree

4 files changed

+57
-13
lines changed

4 files changed

+57
-13
lines changed

lib/redis/commands.rb

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,12 +83,14 @@ module Commands
8383
end
8484
}
8585

86+
FloatifyPair = lambda { |(first, score)|
87+
[first, Floatify.call(score)]
88+
}
89+
8690
FloatifyPairs = lambda { |value|
8791
return value unless value.respond_to?(:each_slice)
8892

89-
value.each_slice(2).map do |member, score|
90-
[member, Floatify.call(score)]
91-
end
93+
value.each_slice(2).map(&FloatifyPair)
9294
}
9395

9496
HashifyInfo = lambda { |reply|

lib/redis/commands/sorted_sets.rb

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -454,21 +454,55 @@ def zrevrange(key, start, stop, withscores: false, with_scores: withscores)
454454

455455
# Determine the index of a member in a sorted set.
456456
#
457+
# @example Retrieve member rank
458+
# redis.zrank("zset", "a")
459+
# # => 3
460+
# @example Retrieve member rank with their score
461+
# redis.zrank("zset", "a", :with_score => true)
462+
# # => [3, 32.0]
463+
#
457464
# @param [String] key
458465
# @param [String] member
459-
# @return [Integer]
460-
def zrank(key, member)
461-
send_command([:zrank, key, member])
466+
#
467+
# @return [Integer, [Integer, Float]]
468+
# - when `:with_score` is not specified, an Integer
469+
# - when `:with_score` is specified, a `[rank, score]` pair
470+
def zrank(key, member, withscore: false, with_score: withscore)
471+
args = [:zrank, key, member]
472+
473+
if with_score
474+
args << "WITHSCORE"
475+
block = FloatifyPair
476+
end
477+
478+
send_command(args, &block)
462479
end
463480

464481
# Determine the index of a member in a sorted set, with scores ordered from
465482
# high to low.
466483
#
484+
# @example Retrieve member rank
485+
# redis.zrevrank("zset", "a")
486+
# # => 3
487+
# @example Retrieve member rank with their score
488+
# redis.zrevrank("zset", "a", :with_score => true)
489+
# # => [3, 32.0]
490+
#
467491
# @param [String] key
468492
# @param [String] member
469-
# @return [Integer]
470-
def zrevrank(key, member)
471-
send_command([:zrevrank, key, member])
493+
#
494+
# @return [Integer, [Integer, Float]]
495+
# - when `:with_score` is not specified, an Integer
496+
# - when `:with_score` is specified, a `[rank, score]` pair
497+
def zrevrank(key, member, withscore: false, with_score: withscore)
498+
args = [:zrevrank, key, member]
499+
500+
if with_score
501+
args << "WITHSCORE"
502+
block = FloatifyPair
503+
end
504+
505+
send_command(args, &block)
472506
end
473507

474508
# Remove all members in a sorted set within the given indexes.

lib/redis/distributed.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -752,14 +752,14 @@ def zrevrange(key, start, stop, **options)
752752
end
753753

754754
# Determine the index of a member in a sorted set.
755-
def zrank(key, member)
756-
node_for(key).zrank(key, member)
755+
def zrank(key, member, **options)
756+
node_for(key).zrank(key, member, **options)
757757
end
758758

759759
# Determine the index of a member in a sorted set, with scores ordered from
760760
# high to low.
761-
def zrevrank(key, member)
762-
node_for(key).zrevrank(key, member)
761+
def zrevrank(key, member, **options)
762+
node_for(key).zrevrank(key, member, **options)
763763
end
764764

765765
# Remove all members in a sorted set within the given indexes.

test/lint/sorted_sets.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,10 @@ def test_zrank
226226
r.zadd "foo", 3, "s3"
227227

228228
assert_equal 2, r.zrank("foo", "s3")
229+
target_version "7.2" do
230+
assert_equal [2, 3], r.zrank("foo", "s3", with_score: true)
231+
assert_equal [2, 3], r.zrank("foo", "s3", withscore: true)
232+
end
229233
end
230234

231235
def test_zrevrank
@@ -234,6 +238,10 @@ def test_zrevrank
234238
r.zadd "foo", 3, "s3"
235239

236240
assert_equal 0, r.zrevrank("foo", "s3")
241+
target_version "7.2" do
242+
assert_equal [0, 3], r.zrevrank("foo", "s3", with_score: true)
243+
assert_equal [0, 3], r.zrevrank("foo", "s3", withscore: true)
244+
end
237245
end
238246

239247
def test_zrange

0 commit comments

Comments
 (0)