diff options
author | Jiekun <2014bduck@gmail.com> | 2021-08-29 16:32:18 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-08-29 11:32:18 +0300 |
commit | 5964d700beb9a6b195d64430b0a655e6aa6fd721 (patch) | |
tree | a5d2d085b4072fd1b12340c53419b21ffd4380cb | |
parent | 295b547fb0fe67cef7c21f84f98bbfad4ca80d08 (diff) | |
download | redis-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-x | redis/client.py | 6 | ||||
-rw-r--r-- | redis/commands.py | 14 | ||||
-rw-r--r-- | tests/test_commands.py | 11 |
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): |