Skip to content

Commit 4100c24

Browse files
committed
Add BF.INFO and BF.RESERVE
1 parent 67cb62b commit 4100c24

File tree

2 files changed

+71
-0
lines changed

2 files changed

+71
-0
lines changed

client.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package redis_bloom_go
22

33
import (
4+
"errors"
45
"strings"
6+
"strconv"
57
"github.com/gomodule/redigo/redis"
68
)
79

@@ -33,6 +35,19 @@ func NewClient(addr, name string, authPass *string) *Client {
3335
return ret
3436
}
3537

38+
// Reserve - Creates an empty Bloom Filter with a given desired error ratio and initial capacity.
39+
// args:
40+
// key - the name of the filter
41+
// error_rate - the desired probability for false positives
42+
// capacity - the number of entries you intend to add to the filter
43+
func (client *Client) Reserve(key string, error_rate float64, capacity uint64) (err error) {
44+
conn := client.Pool.Get()
45+
defer conn.Close()
46+
_, err = conn.Do("BF.RESERVE", key, strconv.FormatFloat(error_rate, 'g', 16, 64), capacity)
47+
return err
48+
}
49+
50+
3651
// Add - Add (or create and add) a new value to the filter
3752
// args:
3853
// key - the name of the filter
@@ -52,3 +67,35 @@ func (client *Client) Exists(key string, item string) (exists bool, err error) {
5267
defer conn.Close()
5368
return redis.Bool(conn.Do("BF.EXISTS", key, item))
5469
}
70+
71+
// Info - Return information about key
72+
// args:
73+
// key - the name of the filter
74+
func (client *Client) Info(key string) (info map[string]int64, err error) {
75+
conn := client.Pool.Get()
76+
defer conn.Close()
77+
result, err := conn.Do("BF.INFO", key)
78+
if err != nil {
79+
return nil, err
80+
}
81+
82+
values, err := redis.Values(result, nil)
83+
if err != nil {
84+
return nil, err
85+
}
86+
if len(values)%2 != 0 {
87+
return nil, errors.New("Info expects even number of values result")
88+
}
89+
info = map[string]int64{}
90+
for i := 0; i < len(values); i += 2 {
91+
key, err = redis.String(values[i], nil)
92+
if err != nil {
93+
return nil, err
94+
}
95+
info[key], err = redis.Int64(values[i+1], nil)
96+
if err != nil {
97+
return nil, err
98+
}
99+
}
100+
return info, nil
101+
}

client_test.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,26 @@ func (client *Client) FlushAll() (err error) {
4141
return err
4242
}
4343

44+
func TestReserve(t *testing.T) {
45+
client.FlushAll()
46+
key := "test_RESERVE"
47+
err := client.Reserve(key, 0.1, 1000)
48+
assert.Nil(t, err)
49+
50+
info, err := client.Info(key)
51+
assert.Nil(t, err)
52+
assert.Equal(t, info, map[string]int64{
53+
"Capacity": 1000,
54+
"Expansion rate": 2,
55+
"Number of filters": 1,
56+
"Number of items inserted": 0,
57+
"Size": 932,
58+
})
59+
60+
err = client.Reserve(key, 0.1, 1000)
61+
assert.NotNil(t, err)
62+
}
63+
4464
func TestAdd(t *testing.T) {
4565
client.FlushAll()
4666
key := "test_ADD"
@@ -49,6 +69,10 @@ func TestAdd(t *testing.T) {
4969
assert.Nil(t, err)
5070
assert.True(t, exists)
5171

72+
info, err := client.Info(key)
73+
assert.Nil(t, err)
74+
assert.NotNil(t, info)
75+
5276
exists, err = client.Add(key, value)
5377
assert.Nil(t, err)
5478
assert.False(t, exists)

0 commit comments

Comments
 (0)