-
Notifications
You must be signed in to change notification settings - Fork 6
/
bloom.go
112 lines (92 loc) · 1.7 KB
/
bloom.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package cli
import (
"errors"
"flag"
"fmt"
"io"
"os"
"github.com/dsa0x/sprout"
)
var (
pathFlag string
errFlag string
capFlag int
)
var writer io.Writer = os.Stderr
var errHelp = `
# Usage:
# sprout new [flags]
# -path <path>
# Path to the filter
# -err_rate <float>
# The desired false positive rate
# -capacity <int>
# The number of items intended to be added to the bloom filter (n)
# sprout set [flags] element
# -path <path>
# Path to the filter
# sprout get [flags] element
# -path <path>
# Path to the filter
# sprout reset [flags]
# -path <path>
# Path to the filter
`
func init() {
flag.StringVar(&pathFlag, "path", "", "Path to the filter")
flag.ErrHelp = errors.New(errHelp)
flag.Usage = func() {
fmt.Fprint(writer, errHelp)
}
}
func Execute() {
flag.Parse()
if len(os.Args) < 1 {
flag.Usage()
os.Exit(1)
}
command := os.Args[1]
var element string
flag.CommandLine.Parse(os.Args[2:])
if command != "new" {
if len(os.Args) <= 2 {
flag.Usage()
os.Exit(1)
} else {
element = os.Args[2]
}
}
if command == "reset" && pathFlag == "" {
flag.Usage()
os.Exit(1)
}
if pathFlag == "" {
pathFlag = "bloom.db"
}
bf := NewBloom()
switch command {
case "new":
fmt.Fprintf(writer, "Filter %s created\n", pathFlag)
case "set":
bf.Add([]byte(element))
case "get":
resp := bf.Contains([]byte(element))
fmt.Println(resp)
case "reset":
bf.Clear()
fmt.Fprintf(writer, "Filter %s reset\n", pathFlag)
case "stats":
fmt.Printf("%+v\n", bf.Stats())
default:
flag.Usage()
}
}
func NewBloom() *sprout.BloomFilter {
opts := &sprout.BloomOptions{
Path: pathFlag,
Capacity: 100,
Err_rate: 0.001,
}
bf := sprout.NewBloom(opts)
return bf
}