diff options
-rw-r--r-- | redis/client.py | 19 | ||||
-rw-r--r-- | tests/server_commands.py | 27 |
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 |