/
logicFilter.go
73 lines (56 loc) · 1.21 KB
/
logicFilter.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
package filter
import (
"go.mongodb.org/mongo-driver/bson"
)
type logic struct {
operator string
filters []Filter
}
func (l *logic) ToBsonD() *bson.D {
var value []*bson.D
for _, filter := range l.filters {
b, ok := filter.(*logic)
if !ok || b.operator != l.operator {
value = append(value, filter.ToBsonD())
continue
}
// merge operator
for _, filter := range b.filters {
value = append(value, filter.ToBsonD())
}
}
return &bson.D{{l.operator, value}}
}
const (
or = `$or`
and = `$and`
)
func newLogic(operator string, filter1, filter2 Filter, filters ...Filter) *logic {
f := make([]Filter, 2, 2+len(filters))
f[0] = filter1
f[1] = filter2
f = append(f, filters...)
return &logic{
operator: operator,
filters: f,
}
}
type nor struct {
filters []Filter
}
func (l *nor) ToBsonD() *bson.D {
var value []*bson.D
for _, filter := range l.filters {
value = append(value, filter.ToBsonD())
}
return &bson.D{{`$nor`, value}}
}
func newNor(filter1, filter2 Filter, filters ...Filter) *nor {
f := make([]Filter, 2, 2+len(filters))
f[0] = filter1
f[1] = filter2
f = append(f, filters...)
return &nor{
filters: f,
}
}