Skip to content

Commit

Permalink
hrandfield (#1513)
Browse files Browse the repository at this point in the history
* hrandfield

* use mapping in hset

* skip if version not fit

* remove empty line

* flake8 comments

* new line for each comment
  • Loading branch information
AvitalFineRedis committed Jul 22, 2021
1 parent ad4779e commit 627db54
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 0 deletions.
20 changes: 20 additions & 0 deletions redis/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -1879,6 +1879,26 @@ def pttl(self, name):
"Returns the number of milliseconds until the key ``name`` will expire"
return self.execute_command('PTTL', name)

def hrandfield(self, key, count=None, withvalues=False):
"""
Return a random field from the hash value stored at key.
count: if the argument is positive, return an array of distinct fields.
If called with a negative count, the behavior changes and the command
is allowed to return the same field multiple times. In this case,
the number of returned fields is the absolute value of the
specified count.
withvalues: The optional WITHVALUES modifier changes the reply so it
includes the respective values of the randomly selected hash fields.
"""
params = []
if count is not None:
params.append(count)
if withvalues:
params.append("WITHVALUES")

return self.execute_command("HRANDFIELD", key, *params)

def randomkey(self):
"Returns the name of a random key"
return self.execute_command('RANDOMKEY')
Expand Down
13 changes: 13 additions & 0 deletions tests/test_commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -895,6 +895,19 @@ def test_pttl_no_key(self, r):
"PTTL on servers 2.8 and after return -2 when the key doesn't exist"
assert r.pttl('a') == -2

@skip_if_server_version_lt('6.2.0')
def test_hrandfield(self, r):
assert r.hrandfield('key') is None
r.hset('key', mapping={'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5})
assert r.hrandfield('key') is not None
assert len(r.hrandfield('key', 2)) == 2
# with values
assert len(r.hrandfield('key', 2, True)) == 4
# without duplications
assert len(r.hrandfield('key', 10)) == 5
# with duplications
assert len(r.hrandfield('key', -10)) == 10

def test_randomkey(self, r):
assert r.randomkey() is None
for key in ('a', 'b', 'c'):
Expand Down

0 comments on commit 627db54

Please sign in to comment.