-
Notifications
You must be signed in to change notification settings - Fork 7
/
valuefilter.go
117 lines (98 loc) · 2.77 KB
/
valuefilter.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
113
114
115
116
117
package yaormfilter
import (
"fmt"
"github.com/geoffreybauduin/yaorm/_vendor/github.com/lann/squirrel"
)
type RawFilterFunc func(string) interface{}
type ValueFilter interface {
Apply(statement squirrel.SelectBuilder, tableName, fieldName string) squirrel.SelectBuilder
Equals(v interface{}) ValueFilter
NotEquals(v interface{}) ValueFilter
Like(v interface{}) ValueFilter
Lt(v interface{}) ValueFilter
Lte(v interface{}) ValueFilter
Gt(v interface{}) ValueFilter
Gte(v interface{}) ValueFilter
Nil(v bool) ValueFilter
In(v ...interface{}) ValueFilter
NotIn(v ...interface{}) ValueFilter
Raw(fn RawFilterFunc) ValueFilter
IsEquality() bool
GetEquality() interface{}
}
type valuefilterimpl struct {
filterFn RawFilterFunc
shouldEqual bool
equals_ interface{}
}
func (f valuefilterimpl) IsEquality() bool {
return f.shouldEqual
}
func (f valuefilterimpl) GetEquality() interface{} {
return f.equals_
}
func (f *valuefilterimpl) nil(v bool) *valuefilterimpl {
f.raw(func(field string) interface{} {
if v {
return squirrel.Eq{field: nil}
}
return squirrel.NotEq{field: nil}
})
return f
}
func (f *valuefilterimpl) equals(e interface{}) *valuefilterimpl {
f.shouldEqual = true
f.equals_ = e
return f.raw(func(field string) interface{} {
return squirrel.Eq{field: e}
})
}
func (f *valuefilterimpl) notEquals(e interface{}) *valuefilterimpl {
return f.raw(func(field string) interface{} {
return squirrel.NotEq{field: e}
})
}
func (f *valuefilterimpl) like(e interface{}) *valuefilterimpl {
return f.raw(func(field string) interface{} {
return squirrel.Expr(fmt.Sprintf("%s LIKE ?", field), e)
})
}
func (f *valuefilterimpl) in(e []interface{}) *valuefilterimpl {
return f.equals(e)
}
func (f *valuefilterimpl) notIn(e []interface{}) *valuefilterimpl {
return f.notEquals(e)
}
func (f *valuefilterimpl) lte(e interface{}) *valuefilterimpl {
return f.raw(func(field string) interface{} {
return squirrel.LtOrEq{field: e}
})
}
func (f *valuefilterimpl) gte(e interface{}) *valuefilterimpl {
return f.raw(func(field string) interface{} {
return squirrel.GtOrEq{field: e}
})
}
func (f *valuefilterimpl) lt(e interface{}) *valuefilterimpl {
return f.raw(func(field string) interface{} {
return squirrel.Lt{field: e}
})
}
func (f *valuefilterimpl) gt(e interface{}) *valuefilterimpl {
return f.raw(func(field string) interface{} {
return squirrel.Gt{field: e}
})
}
func (f *valuefilterimpl) raw(fn RawFilterFunc) *valuefilterimpl {
f.filterFn = fn
return f
}
func (f *valuefilterimpl) Apply(statement squirrel.SelectBuilder, tableName, fieldName string) squirrel.SelectBuilder {
computedField := fmt.Sprintf(`%s.%s`, tableName, fieldName)
if f.filterFn != nil {
statement = statement.Where(
f.filterFn(computedField),
)
}
return statement
}