summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES1
-rwxr-xr-xredis/client.py16
-rw-r--r--tests/test_commands.py11
3 files changed, 28 insertions, 0 deletions
diff --git a/CHANGES b/CHANGES
index 44c17df..2aab74d 100644
--- a/CHANGES
+++ b/CHANGES
@@ -19,6 +19,7 @@
get stuck in an endless loop if a specific number of bytes were
delivered from the socket. This fix also increases performance of
parsing large responses from the Redis server.
+ * Added support for ZREVRANGEBYLEX.
* 2.10.3
* Fixed a bug with the bytearray support introduced in 2.10.2. Thanks
Josh Owen.
diff --git a/redis/client.py b/redis/client.py
index 902ccc9..3ac242b 100755
--- a/redis/client.py
+++ b/redis/client.py
@@ -1661,6 +1661,22 @@ class StrictRedis(object):
pieces.extend([Token('LIMIT'), start, num])
return self.execute_command(*pieces)
+ def zrevrangebylex(self, name, max, min, start=None, num=None):
+ """
+ Return the reversed lexicographical range of values from sorted set
+ ``name`` between ``max`` and ``min``.
+
+ If ``start`` and ``num`` are specified, then return a slice of the
+ range.
+ """
+ if (start is not None and num is None) or \
+ (num is not None and start is None):
+ raise RedisError("``start`` and ``num`` must both be specified")
+ pieces = ['ZREVRANGEBYLEX', name, max, min]
+ if start is not None and num is not None:
+ pieces.extend([Token('LIMIT'), start, num])
+ return self.execute_command(*pieces)
+
def zrangebyscore(self, name, min, max, start=None, num=None,
withscores=False, score_cast_func=float):
"""
diff --git a/tests/test_commands.py b/tests/test_commands.py
index c0e56b0..45206b2 100644
--- a/tests/test_commands.py
+++ b/tests/test_commands.py
@@ -959,6 +959,17 @@ class TestRedisCommands(object):
assert r.zrangebylex('a', '[f', '+') == [b('f'), b('g')]
assert r.zrangebylex('a', '-', '+', start=3, num=2) == [b('d'), b('e')]
+ @skip_if_server_version_lt('2.9.9')
+ def test_zrevrangebylex(self, r):
+ r.zadd('a', a=0, b=0, c=0, d=0, e=0, f=0, g=0)
+ assert r.zrevrangebylex('a', '[c', '-') == [b('c'), b('b'), b('a')]
+ assert r.zrevrangebylex('a', '(c', '-') == [b('b'), b('a')]
+ assert r.zrevrangebylex('a', '(g', '[aaa') == \
+ [b('f'), b('e'), b('d'), b('c'), b('b')]
+ assert r.zrevrangebylex('a', '+', '[f') == [b('g'), b('f')]
+ assert r.zrevrangebylex('a', '+', '-', start=3, num=2) == \
+ [b('d'), b('c')]
+
def test_zrangebyscore(self, r):
r.zadd('a', a1=1, a2=2, a3=3, a4=4, a5=5)
assert r.zrangebyscore('a', 2, 4) == [b('a2'), b('a3'), b('a4')]