diff --git a/redis/commands/bf/__init__.py b/redis/commands/bf/__init__.py index a448def46d..4da060e995 100644 --- a/redis/commands/bf/__init__.py +++ b/redis/commands/bf/__init__.py @@ -198,6 +198,7 @@ def __init__(self, client, **kwargs): # BF_MEXISTS: spaceHolder, # BF_SCANDUMP: spaceHolder, # BF_LOADCHUNK: spaceHolder, + # BF_CARD: spaceHolder, BF_INFO: BFInfo, } diff --git a/redis/commands/bf/commands.py b/redis/commands/bf/commands.py index f6bf281639..c45523c99b 100644 --- a/redis/commands/bf/commands.py +++ b/redis/commands/bf/commands.py @@ -11,6 +11,7 @@ BF_SCANDUMP = "BF.SCANDUMP" BF_LOADCHUNK = "BF.LOADCHUNK" BF_INFO = "BF.INFO" +BF_CARD = "BF.CARD" CF_RESERVE = "CF.RESERVE" CF_ADD = "CF.ADD" @@ -165,6 +166,14 @@ def info(self, key): """ # noqa return self.execute_command(BF_INFO, key) + def card(self, key): + """ + Returns the cardinality of a Bloom filter - number of items that were added to a Bloom filter and detected as unique + (items that caused at least one bit to be set in at least one sub-filter). + For more information see `BF.CARD `_. + """ # noqa + return self.execute_command(BF_CARD, key) + class CFCommands: """Cuckoo Filter commands.""" diff --git a/tests/test_asyncio/test_bloom.py b/tests/test_asyncio/test_bloom.py index cac989f913..9f4a805c4c 100644 --- a/tests/test_asyncio/test_bloom.py +++ b/tests/test_asyncio/test_bloom.py @@ -149,6 +149,21 @@ async def test_bf_info(modclient: redis.Redis): assert True +@pytest.mark.redismod +async def test_bf_card(modclient: redis.Redis): + # return 0 if the key does not exist + assert await modclient.bf().card("not_exist") == 0 + + # Store a filter + assert await modclient.bf().add("bf1", "item_foo") == 1 + assert await modclient.bf().card("bf1") == 1 + + # Error when key is of a type other than Bloom filter. + with pytest.raises(redis.ResponseError): + await modclient.set("setKey", "value") + await modclient.bf().card("setKey") + + # region Test Cuckoo Filter @pytest.mark.redismod async def test_cf_add_and_insert(modclient: redis.Redis): diff --git a/tests/test_bloom.py b/tests/test_bloom.py index 13921bfbd1..30d3219404 100644 --- a/tests/test_bloom.py +++ b/tests/test_bloom.py @@ -165,6 +165,21 @@ def test_bf_info(client): assert True +@pytest.mark.redismod +def test_bf_card(client): + # return 0 if the key does not exist + assert client.bf().card("not_exist") == 0 + + # Store a filter + assert client.bf().add("bf1", "item_foo") == 1 + assert client.bf().card("bf1") == 1 + + # Error when key is of a type other than Bloom filter. + with pytest.raises(redis.ResponseError): + client.set("setKey", "value") + client.bf().card("setKey") + + # region Test Cuckoo Filter @pytest.mark.redismod def test_cf_add_and_insert(client):