Skip to content

Commit e018d7b

Browse files
authored
Support CF.INFO BF.INFO command (#15)
1 parent 1cd6dd1 commit e018d7b

File tree

2 files changed

+63
-1
lines changed

2 files changed

+63
-1
lines changed

redisbloom/client.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,42 @@
66
def bool_ok(response):
77
return nativestr(response) == 'OK'
88

9+
class BFInfo(object):
10+
capacity = None
11+
size = None
12+
filterNum = None
13+
insertedNum = None
14+
expansionRate = None
15+
16+
def __init__(self, args):
17+
response = dict(zip(map(nativestr, args[::2]), args[1::2]))
18+
self.capacity = response['Capacity']
19+
self.size = response['Size']
20+
self.filterNum = response['Number of filters']
21+
self.insertedNum = response['Number of items inserted']
22+
self.expansionRate = response['Expansion rate']
23+
24+
class CFInfo(object):
25+
size = None
26+
bucketNum = None
27+
filterNum = None
28+
insertedNum = None
29+
deletedNum = None
30+
bucketSize = None
31+
expansionRate = None
32+
maxIteration = None
33+
34+
def __init__(self, args):
35+
response = dict(zip(map(nativestr, args[::2]), args[1::2]))
36+
self.size = response['Size']
37+
self.bucketNum = response['Number of buckets']
38+
self.filterNum = response['Number of filters']
39+
self.insertedNum = response['Number of items inserted']
40+
self.deletedNum = response['Number of items deleted']
41+
self.bucketSize = response['Bucket size']
42+
self.expansionRate = response['Expansion rate']
43+
self.maxIteration = response['Max iterations']
44+
945
class CMSInfo(object):
1046
width = None
1147
depth = None
@@ -63,6 +99,7 @@ class Client(Redis): #changed from StrictRedis
6399
BF_MEXISTS = 'BF.MEXISTS'
64100
BF_SCANDUMP = 'BF.SCANDUMP'
65101
BF_LOADCHUNK = 'BF.LOADCHUNK'
102+
BF_INFO = 'BF.INFO'
66103

67104
CF_RESERVE = 'CF.RESERVE'
68105
CF_ADD = 'CF.ADD'
@@ -74,6 +111,7 @@ class Client(Redis): #changed from StrictRedis
74111
CF_COUNT = 'CF.COUNT'
75112
CF_SCANDUMP = 'CF.SCANDUMP'
76113
CF_LOADDUMP = 'CF.LOADDUMP'
114+
CF_INFO = 'CF.INFO'
77115

78116
CMS_INITBYDIM = 'CMS.INITBYDIM'
79117
CMS_INITBYPROB = 'CMS.INITBYPROB'
@@ -105,6 +143,7 @@ def __init__(self, *args, **kwargs):
105143
#self.BF_MEXISTS : spaceHolder,
106144
#self.BF_SCANDUMP : spaceHolder,
107145
#self.BF_LOADCHUNK : spaceHolder,
146+
self.BF_INFO : BFInfo,
108147

109148
self.CF_RESERVE : bool_ok,
110149
#self.CF_ADD : spaceHolder,
@@ -116,6 +155,7 @@ def __init__(self, *args, **kwargs):
116155
#self.CF_COUNT : spaceHolder,
117156
#self.CF_SCANDUMP : spaceHolder,
118157
#self.CF_LOADDUMP : spaceHolder,
158+
self.CF_INFO : CFInfo,
119159

120160

121161
self.CMS_INITBYDIM : bool_ok,
@@ -276,6 +316,13 @@ def bfLoadChunk(self, key, iter, data):
276316

277317
return self.execute_command(self.BF_LOADCHUNK, *params)
278318

319+
def bfInfo(self, key):
320+
"""
321+
Returns capacity, size, number of filters, number of items inserted, and expansion rate.
322+
"""
323+
324+
return self.execute_command(self.BF_INFO, key)
325+
279326

280327
################## Cuckoo Filter Functions ######################
281328

@@ -381,6 +428,13 @@ def cfLoadChunk(self, key, iter, data):
381428

382429
return self.execute_command(self.CF_LOADDUMP, *params)
383430

431+
def cfInfo(self, key):
432+
"""
433+
Returns size, number of buckets, number of filter, number of items inserted, number of items deleted,
434+
bucket size, expansion rate, and max iteration.
435+
"""
436+
437+
return self.execute_command(self.CF_INFO, key)
384438

385439
################## Count-Min Sketch Functions ######################
386440

test_commands.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,10 @@ def testBFInsert(self):
5555
self.assertEqual(1, rb.bfExists('bloom', 'foo'))
5656
self.assertEqual(0, rb.bfExists('bloom', 'noexist'))
5757
self.assertEqual([1, 0], i(rb.bfMExists('bloom', 'foo', 'noexist')))
58+
info = rb.bfInfo('bloom')
59+
self.assertEqual(2, info.insertedNum)
60+
self.assertEqual(1000, info.capacity)
61+
self.assertEqual(1, info.filterNum)
5862

5963
def testBFDumpLoad(self):
6064
# Store a filter
@@ -116,6 +120,10 @@ def testCFAddInsert(self):
116120
self.assertEqual([1], rb.cfInsert('empty1', ['foo'], capacity=1000))
117121
self.assertEqual([1], rb.cfInsertNX('empty2', ['bar'], capacity=1000))
118122
self.assertRaises(ResponseError, run_func(rb.cfInsert, 'noexist', ['foo']))
123+
info = rb.cfInfo('captest')
124+
self.assertEqual(5, info.insertedNum)
125+
self.assertEqual(0, info.deletedNum)
126+
self.assertEqual(1, info.filterNum)
119127

120128
def testCFExistsDel(self):
121129
self.assertTrue(rb.cfCreate('cuckoo', 1000))
@@ -137,7 +145,7 @@ def testCMS(self):
137145
self.assertEqual([10, 15], rb.cmsIncrBy('dim', ['foo', 'bar'], [5, 15]))
138146
self.assertEqual([10, 15], rb.cmsQuery('dim', 'foo', 'bar'))
139147
info = rb.cmsInfo('dim')
140-
self.assertEqual(1000, info.width)
148+
self.assertEqual(1000, info.width)
141149
self.assertEqual(5, info.depth)
142150
self.assertEqual(25, info.count)
143151

0 commit comments

Comments
 (0)