summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy McCurdy <andy@andymccurdy.com>2010-03-15 11:35:29 -0700
committerAndy McCurdy <andy@andymccurdy.com>2010-03-15 11:35:29 -0700
commit9ada0de4a3fc25cbba246d63eea674fcce814a54 (patch)
tree280ab4b739827942627b676564bf494ceb3663ff
parenta33431a07c2798b7b1c96e13f8d93582eb309f58 (diff)
downloadredis-py-9ada0de4a3fc25cbba246d63eea674fcce814a54.tar.gz
added ZRANK and ZREVRANK commands.
-rw-r--r--redis/client.py19
-rw-r--r--tests/server_commands.py27
2 files changed, 43 insertions, 3 deletions
diff --git a/redis/client.py b/redis/client.py
index 7862b7c..969f601 100644
--- a/redis/client.py
+++ b/redis/client.py
@@ -181,7 +181,7 @@ class Redis(threading.local):
),
string_keys_to_dict(
'DECRBY INCRBY LLEN SCARD SDIFFSTORE SINTERSTORE SUNIONSTORE '
- 'ZCARD ZREMRANGEBYSCORE',
+ 'ZCARD ZRANK ZREMRANGEBYSCORE ZREVRANK',
int
),
string_keys_to_dict(
@@ -845,7 +845,8 @@ class Redis(threading.local):
pieces.append('withscores')
return self.format_inline(*pieces, **{'withscores': withscores})
- def zrangebyscore(self, name, min, max, start=None, num=None, withscores=False):
+ def zrangebyscore(self, name, min, max,
+ start=None, num=None, withscores=False):
"""
Return a range of values from the sorted set ``name`` with scores
between ``min`` and ``max``.
@@ -865,6 +866,13 @@ class Redis(threading.local):
pieces.append('withscores')
return self.format_inline(*pieces, **{'withscores': withscores})
+ def zrank(self, name, value):
+ """
+ Returns a 0-based value indicating the rank of ``value`` in sorted set
+ ``name``
+ """
+ return self.format_bulk('ZRANK', name, value)
+
def zrem(self, name, value):
"Remove member ``value`` from sorted set ``name``"
return self.format_bulk('ZREM', name, value)
@@ -891,6 +899,13 @@ class Redis(threading.local):
pieces.append('withscores')
return self.format_inline(*pieces, **{'withscores': withscores})
+ def zrevrank(self, name, value):
+ """
+ Returns a 0-based value indicating the descending rank of
+ ``value`` in sorted set ``name``
+ """
+ return self.format_bulk('ZREVRANK', name, value)
+
def zscore(self, name, value):
"Return the score of element ``value`` in sorted set ``name``"
return self.format_bulk('ZSCORE', name, value)
diff --git a/tests/server_commands.py b/tests/server_commands.py
index b7ce7e3..0ddb7cb 100644
--- a/tests/server_commands.py
+++ b/tests/server_commands.py
@@ -611,6 +611,19 @@ class ServerCommandsTestCase(unittest.TestCase):
[('a2', 2.0), ('a3', 3.0), ('a4', 4.0)])
# a non existant key should return None
self.assertEquals(self.client.zrangebyscore('b', 0, 1, withscores=True), None)
+
+ def test_zrank(self):
+ # key is not a zset
+ self.client['a'] = 'a'
+ self.assertRaises(redis.ResponseError, self.client.zrank, 'a', 'a4')
+ del self.client['a']
+ # real logic
+ self.make_zset('a', {'a1': 1, 'a2': 2, 'a3': 3, 'a4': 4, 'a5': 5})
+ self.assertEquals(self.client.zrank('a', 'a1'), 0)
+ self.assertEquals(self.client.zrank('a', 'a2'), 1)
+ self.assertEquals(self.client.zrank('a', 'a3'), 2)
+ self.assertEquals(self.client.zrank('a', 'a4'), 3)
+ self.assertEquals(self.client.zrank('a', 'a5'), 4)
def test_zrem(self):
# key is not a zset
@@ -653,7 +666,19 @@ class ServerCommandsTestCase(unittest.TestCase):
[('a2', 2.0), ('a1', 1.0)])
# a non existant key should return None
self.assertEquals(self.client.zrange('b', 0, 1, withscores=True), None)
-
+
+ def test_zrevrank(self):
+ # key is not a zset
+ self.client['a'] = 'a'
+ self.assertRaises(redis.ResponseError, self.client.zrevrank, 'a', 'a4')
+ del self.client['a']
+ # real logic
+ self.make_zset('a', {'a1': 5, 'a2': 4, 'a3': 3, 'a4': 2, 'a5': 1})
+ self.assertEquals(self.client.zrevrank('a', 'a1'), 0)
+ self.assertEquals(self.client.zrevrank('a', 'a2'), 1)
+ self.assertEquals(self.client.zrevrank('a', 'a3'), 2)
+ self.assertEquals(self.client.zrevrank('a', 'a4'), 3)
+ self.assertEquals(self.client.zrevrank('a', 'a5'), 4)
def test_zscore(self):
# key is not a zset