-
Notifications
You must be signed in to change notification settings - Fork 85
/
filter_builder.go
81 lines (62 loc) · 1.64 KB
/
filter_builder.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
package systemfetcher
import (
"strings"
)
// Expression represents the single check expression
type Expression struct {
Key string
Operation string
Value string
}
func (e *Expression) getValue() string {
return "'" + e.Value + "'"
}
func (e *Expression) buildExpression() string {
return strings.Join([]string{e.Key, e.Operation, e.getValue()}, " ")
}
// Filter is the set of single expressions which will be concatenated when building the query
type Filter struct {
Expressions []Expression
}
func (f *Filter) addExpression(e Expression) {
f.Expressions = append(f.Expressions, e)
}
func (f *Filter) buildFilter() string {
var filter strings.Builder
for i, expr := range f.Expressions {
filter.WriteString(expr.buildExpression())
if i < len(f.Expressions)-1 {
filter.WriteString(" and ")
}
}
return filter.String()
}
// FilterBuilder builds the filter query from given expressions
type FilterBuilder struct {
Filters []Filter
}
// NewExpression returns new filter expression based on the given arguments
func (b *FilterBuilder) NewExpression(key, operation, value string) Expression {
return Expression{
Key: key,
Operation: operation,
Value: value,
}
}
func (b *FilterBuilder) addFilter(expr ...Expression) {
var newFilter Filter
for _, e := range expr {
newFilter.addExpression(e)
}
b.Filters = append(b.Filters, newFilter)
}
func (b *FilterBuilder) buildFilterQuery() string {
var filterQuery strings.Builder
for i, f := range b.Filters {
filterQuery.WriteString("(" + f.buildFilter() + ")")
if i < len(b.Filters)-1 {
filterQuery.WriteString(" or ")
}
}
return filterQuery.String()
}