@@ -21,18 +21,32 @@ type DBDriver interface {
21
21
type Filter struct {
22
22
Glue string `json:"glue"`
23
23
Field string `json:"field"`
24
- Condition Condition `json:"condition"`
24
+ Type string `json:"type"`
25
+ Predicate string `json:"predicate"`
26
+ Filter string `json:"filter"`
27
+ Value interface {} `json:"value"`
25
28
Includes []interface {} `json:"includes"`
26
- Kids []Filter `json:"rules"`
29
+ Rules []Filter `json:"rules"`
30
+ }
31
+
32
+ func (f * Filter ) getValues () []interface {} {
33
+ valueMap , ok := f .Value .(map [string ]interface {})
34
+ if ! ok {
35
+ return []interface {}{f .Value }
36
+ }
37
+
38
+ return []interface {}{valueMap ["start" ], valueMap ["end" ]}
27
39
}
28
40
29
41
type CustomOperation func (string , string , []interface {}) (string , []interface {}, error )
42
+ type CustomPredicate func (string , string ) (string , error )
30
43
31
44
type CheckFunction = func (string ) bool
32
45
type SQLConfig struct {
33
46
WhitelistFunc CheckFunction
34
47
Whitelist map [string ]bool
35
48
Operations map [string ]CustomOperation
49
+ Predicates map [string ]CustomPredicate
36
50
}
37
51
38
52
func FromJSON (text []byte ) (Filter , error ) {
@@ -62,7 +76,7 @@ func GetSQL(data Filter, config *SQLConfig, dbArr ...DBDriver) (string, []interf
62
76
db = MySQL {}
63
77
}
64
78
65
- if data .Kids == nil {
79
+ if data .Rules == nil {
66
80
if data .Field == "" {
67
81
return "" , make ([]interface {}, 0 ), nil
68
82
}
@@ -77,8 +91,21 @@ func GetSQL(data Filter, config *SQLConfig, dbArr ...DBDriver) (string, []interf
77
91
return inSQL (name , data .Includes , db )
78
92
}
79
93
80
- values := data .Condition .getValues ()
81
- switch data .Condition .Rule {
94
+ values := data .getValues ()
95
+
96
+ var err error
97
+ if config != nil && config .Predicates != nil {
98
+ if pr , prOk := config .Predicates [data .Predicate ]; prOk {
99
+ name , err = pr (name , data .Predicate )
100
+ if err != nil {
101
+ return "" , NoValues , err
102
+ }
103
+ } else {
104
+ return "" , NoValues , fmt .Errorf ("unknown predicate: %s" , data .Predicate )
105
+ }
106
+ }
107
+
108
+ switch data .Filter {
82
109
case "" :
83
110
return "" , NoValues , nil
84
111
case "equal" :
@@ -132,19 +159,18 @@ func GetSQL(data Filter, config *SQLConfig, dbArr ...DBDriver) (string, []interf
132
159
}
133
160
134
161
if config != nil && config .Operations != nil {
135
- op , opOk := config .Operations [data .Condition .Rule ]
136
- if opOk {
137
- return op (name , data .Condition .Rule , data .Condition .getValues ())
162
+ if op , opOk := config .Operations [data .Filter ]; opOk {
163
+ return op (name , data .Filter , values )
138
164
}
139
165
}
140
166
141
- return "" , NoValues , fmt .Errorf ("unknown operation: %s" , data .Condition . Rule )
167
+ return "" , NoValues , fmt .Errorf ("unknown operation: %s" , data .Filter )
142
168
}
143
169
144
- out := make ([]string , 0 , len (data .Kids ))
170
+ out := make ([]string , 0 , len (data .Rules ))
145
171
values := make ([]interface {}, 0 )
146
172
147
- for _ , r := range data .Kids {
173
+ for _ , r := range data .Rules {
148
174
subSql , subValues , err := GetSQL (r , config , db )
149
175
if err != nil {
150
176
return "" , nil , err
@@ -161,7 +187,7 @@ func GetSQL(data Filter, config *SQLConfig, dbArr ...DBDriver) (string, []interf
161
187
}
162
188
163
189
outStr := strings .Join (out , glue )
164
- if len (data .Kids ) > 1 {
190
+ if len (data .Rules ) > 1 {
165
191
outStr = "( " + outStr + " )"
166
192
}
167
193
0 commit comments