Skip to content

Commit cd5f39e

Browse files
committed
Add Support for BF.LOADCHUNK BF.SCANDUMP
1 parent 1c2ad0e commit cd5f39e

File tree

3 files changed

+52
-2
lines changed

3 files changed

+52
-2
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,8 @@ func main() {
6565
| [BF.INSERT](https://oss.redislabs.com/redisbloom/Bloom_Commands/#bfinsert) | N/A |
6666
| [BF.EXISTS](https://oss.redislabs.com/redisbloom/Bloom_Commands/#bfexists) | [Exists](https://godoc.org/github.com/RedisBloom/redisbloom-go#Client.Exists) |
6767
| [BF.MEXISTS](https://oss.redislabs.com/redisbloom/Bloom_Commands/#bfmexists) | [BfExistsMulti](https://godoc.org/github.com/RedisBloom/redisbloom-go#Client.BfExistsMulti) |
68-
| [BF.SCANDUMP](https://oss.redislabs.com/redisbloom/Bloom_Commands/#bfscandump) | N/A |
69-
| [BF.LOADCHUNK](https://oss.redislabs.com/redisbloom/Bloom_Commands/#bfloadchunk) | N/A |
68+
| [BF.SCANDUMP](https://oss.redislabs.com/redisbloom/Bloom_Commands/#bfscandump) | [BfScanDump](https://godoc.org/github.com/RedisBloom/redisbloom-go#Client.BfScanDump) |
69+
| [BF.LOADCHUNK](https://oss.redislabs.com/redisbloom/Bloom_Commands/#bfloadchunk) | [BfLoadChunk](https://godoc.org/github.com/RedisBloom/redisbloom-go#Client.BfLoadChunk) |
7070
| [BF.INFO](https://oss.redislabs.com/redisbloom/Bloom_Commands/#bfinfo) | [Info](https://godoc.org/github.com/RedisBloom/redisbloom-go#Client.Info) |
7171

7272
### Cuckoo Filter

client.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,28 @@ func (client *Client) BfExistsMulti(key string, items []string) ([]int64, error)
133133
return redis.Int64s(result, err)
134134
}
135135

136+
// Begins an incremental save of the bloom filter.
137+
func (client *Client) BfScanDump(key string, iter int64) (int64, []byte, error) {
138+
conn := client.Pool.Get()
139+
defer conn.Close()
140+
reply, err := redis.Values(conn.Do("BF.SCANDUMP", key, iter))
141+
if err != nil || len(reply) != 2 {
142+
return 0, nil, err
143+
}
144+
iter = reply[0].(int64)
145+
if reply[1] == nil {
146+
return iter, nil, err
147+
}
148+
return iter, reply[1].([]byte), err
149+
}
150+
151+
// Restores a filter previously saved using SCANDUMP .
152+
func (client *Client) BfLoadChunk(key string, iter int64, data []byte) (string, error) {
153+
conn := client.Pool.Get()
154+
defer conn.Close()
155+
return redis.String(conn.Do("BF.LOADCHUNK", key, iter, data))
156+
}
157+
136158
// Initializes a TopK with specified parameters.
137159
func (client *Client) TopkReserve(key string, topk int64, width int64, depth int64, decay float64) (string, error) {
138160
conn := client.Pool.Get()

client_test.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,3 +394,31 @@ func TestClient_CfInfo(t *testing.T) {
394394
assert.Equal(t, int64(1), info["Number of items inserted"])
395395
assert.Equal(t, int64(0), info["Max iteration"])
396396
}
397+
398+
func TestClient_BfScanDump(t *testing.T) {
399+
client.FlushAll()
400+
key := "test_bf_scandump"
401+
err := client.Reserve(key, 0.01, 1000)
402+
assert.Nil(t, err)
403+
client.Add(key, "1")
404+
curIter := int64(0)
405+
chunks := make([]map[string]interface{}, 0)
406+
for {
407+
iter, data, err := client.BfScanDump(key, curIter)
408+
assert.Nil(t, err)
409+
curIter = iter
410+
if iter == int64(0) {
411+
break
412+
}
413+
chunk := map[string]interface{}{"iter": iter, "data": data}
414+
chunks = append(chunks, chunk)
415+
}
416+
client.FlushAll()
417+
for i := 0; i < len(chunks); i++ {
418+
ret, err := client.BfLoadChunk(key, chunks[i]["iter"].(int64), chunks[i]["data"].([]byte))
419+
assert.Nil(t, err)
420+
assert.Equal(t, "OK", ret)
421+
}
422+
exists, err := client.Exists(key, "1")
423+
assert.True(t, exists)
424+
}

0 commit comments

Comments
 (0)