summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJiekun <2014bduck@gmail.com>2021-08-29 16:32:18 +0800
committerGitHub <noreply@github.com>2021-08-29 11:32:18 +0300
commit5964d700beb9a6b195d64430b0a655e6aa6fd721 (patch)
treea5d2d085b4072fd1b12340c53419b21ffd4380cb
parent295b547fb0fe67cef7c21f84f98bbfad4ca80d08 (diff)
downloadredis-py-5964d700beb9a6b195d64430b0a655e6aa6fd721.tar.gz
#1434 Added support for ZMSCORE new in Redis 6.2 RC (#1437)
* #1434 Added zmscore command support * #1434 Fixed typo and doc * #1434 Set [] as default value for members arg in zmscore func * #1434 Set None as default value for members arg in zmscore func * #1434 Removed default value for members arg in zmscore func * Fixed flake8 formatting Co-authored-by: jiekun.zhu <jiekun.zhu@shopee.com>
-rwxr-xr-xredis/client.py6
-rw-r--r--redis/commands.py14
-rw-r--r--tests/test_commands.py11
3 files changed, 31 insertions, 0 deletions
diff --git a/redis/client.py b/redis/client.py
index f6ca071..939c327 100755
--- a/redis/client.py
+++ b/redis/client.py
@@ -390,6 +390,11 @@ def parse_zscan(response, **options):
return int(cursor), list(zip(it, map(score_cast_func, it)))
+def parse_zmscore(response, **options):
+ # zmscore: list of scores (double precision floating point number) or nil
+ return [float(score) if score is not None else None for score in response]
+
+
def parse_slowlog_get(response, **options):
space = ' ' if options.get('decode_responses', False) else b' '
return [{
@@ -705,6 +710,7 @@ class Redis(Commands, object):
'XPENDING': parse_xpending,
'ZADD': parse_zadd,
'ZSCAN': parse_zscan,
+ 'ZMSCORE': parse_zmscore,
}
@classmethod
diff --git a/redis/commands.py b/redis/commands.py
index 5aae14a..f940bcc 100644
--- a/redis/commands.py
+++ b/redis/commands.py
@@ -2461,6 +2461,20 @@ class Commands:
"""
return self._zaggregate('ZUNIONSTORE', dest, keys, aggregate)
+ def zmscore(self, key, members):
+ """
+ Returns the scores associated with the specified members
+ in the sorted set stored at key.
+ ``members`` should be a list of the member name.
+ Return type is a list of score.
+ If the member does not exist, a None will be returned
+ in corresponding position.
+ """
+ if not members:
+ raise DataError('ZMSCORE members must be a non-empty list')
+ pieces = [key] + members
+ return self.execute_command('ZMSCORE', *pieces)
+
def _zaggregate(self, command, dest, keys, aggregate=None,
**options):
pieces = [command]
diff --git a/tests/test_commands.py b/tests/test_commands.py
index d22d72a..1d829d6 100644
--- a/tests/test_commands.py
+++ b/tests/test_commands.py
@@ -1865,6 +1865,17 @@ class TestRedisCommands:
assert r.zrange('d', 0, -1, withscores=True) == \
[(b'a2', 5), (b'a4', 12), (b'a3', 20), (b'a1', 23)]
+ @skip_if_server_version_lt('6.1.240')
+ def test_zmscore(self, r):
+ with pytest.raises(exceptions.DataError):
+ r.zmscore('invalid_key', [])
+
+ assert r.zmscore('invalid_key', ['invalid_member']) == [None]
+
+ r.zadd('a', {'a1': 1, 'a2': 2, 'a3': 3.5})
+ assert r.zmscore('a', ['a1', 'a2', 'a3', 'a4']) == \
+ [1.0, 2.0, 3.5, None]
+
# HYPERLOGLOG TESTS
@skip_if_server_version_lt('2.8.9')
def test_pfadd(self, r):