@@ -14,12 +14,7 @@ type Filter struct {
14
14
Kids []Filter `json:"rules"`
15
15
}
16
16
17
- type Condition struct {
18
- Rule string `json:"type"`
19
- Value interface {} `json:"filter"`
20
- }
21
-
22
- type CustomOperation func (string , Condition ) (string , []interface {}, error )
17
+ type CustomOperation func (string , string , []interface {}) (string , []interface {}, error )
23
18
24
19
type SQLConfig struct {
25
20
Whitelist map [string ]bool
@@ -54,43 +49,68 @@ func GetSQL(data Filter, config *SQLConfig) (string, []interface{}, error) {
54
49
return inSQL (data .Field , data .Includes )
55
50
}
56
51
52
+ values := data .Condition .getValues ()
57
53
switch data .Condition .Rule {
58
54
case "" :
59
55
return "" , NoValues , nil
60
56
case "equal" :
61
- return fmt .Sprintf ("%s = ?" , data .Field ), [] interface {}{ data . Condition . Value } , nil
57
+ return fmt .Sprintf ("%s = ?" , data .Field ), values , nil
62
58
case "notEqual" :
63
- return fmt .Sprintf ("%s <> ?" , data .Field ), [] interface {}{ data . Condition . Value } , nil
59
+ return fmt .Sprintf ("%s <> ?" , data .Field ), values , nil
64
60
case "contains" :
65
- return fmt .Sprintf ("INSTR(%s, ?) > 0" , data .Field ), [] interface {}{ data . Condition . Value } , nil
61
+ return fmt .Sprintf ("INSTR(%s, ?) > 0" , data .Field ), values , nil
66
62
case "notContains" :
67
- return fmt .Sprintf ("INSTR(%s, ?) < 0" , data .Field ), [] interface {}{ data . Condition . Value } , nil
63
+ return fmt .Sprintf ("INSTR(%s, ?) < 0" , data .Field ), values , nil
68
64
case "lessOrEqual" :
69
- return fmt .Sprintf ("%s <= ?" , data .Field ), [] interface {}{ data . Condition . Value } , nil
65
+ return fmt .Sprintf ("%s <= ?" , data .Field ), values , nil
70
66
case "greaterOrEqual" :
71
- return fmt .Sprintf ("%s >= ?" , data .Field ), [] interface {}{ data . Condition . Value } , nil
67
+ return fmt .Sprintf ("%s >= ?" , data .Field ), values , nil
72
68
case "less" :
73
- return fmt .Sprintf ("%s < ?" , data .Field ), []interface {}{data .Condition .Value }, nil
69
+ return fmt .Sprintf ("%s < ?" , data .Field ), values , nil
70
+ case "notBetween" :
71
+ if len (values ) != 2 {
72
+ return "" , nil , fmt .Errorf ("wrong number of parameters for notBetween operation: %d" , len (values ))
73
+ }
74
+
75
+ if values [0 ] == nil {
76
+ return fmt .Sprintf ("%s > ?" , data .Field ), values [1 :], nil
77
+ } else if values [1 ] == nil {
78
+ return fmt .Sprintf ("%s < ?" , data .Field ), values [:1 ], nil
79
+ } else {
80
+ return fmt .Sprintf ("( %s < ? OR %s > ? )" , data .Field , data .Field ), values , nil
81
+ }
82
+ case "between" :
83
+ if len (values ) != 2 {
84
+ return "" , nil , fmt .Errorf ("wrong number of parameters for notBetween operation: %d" , len (values ))
85
+ }
86
+
87
+ if values [0 ] == nil {
88
+ return fmt .Sprintf ("%s < ?" , data .Field ), values [1 :], nil
89
+ } else if values [1 ] == nil {
90
+ return fmt .Sprintf ("%s > ?" , data .Field ), values [:1 ], nil
91
+ } else {
92
+ return fmt .Sprintf ("( %s > ? AND %s < ? )" , data .Field , data .Field ), values , nil
93
+ }
74
94
case "greater" :
75
- return fmt .Sprintf ("%s > ?" , data .Field ), [] interface {}{ data . Condition . Value } , nil
95
+ return fmt .Sprintf ("%s > ?" , data .Field ), values , nil
76
96
case "beginsWith" :
77
97
search := "CONCAT(?, '%')"
78
- return fmt .Sprintf ("%s LIKE %s" , data .Field , search ), [] interface {}{ data . Condition . Value } , nil
98
+ return fmt .Sprintf ("%s LIKE %s" , data .Field , search ), values , nil
79
99
case "notBeginsWith" :
80
100
search := "CONCAT(?, '%')"
81
- return fmt .Sprintf ("%s NOT LIKE %s" , data .Field , search ), [] interface {}{ data . Condition . Value } , nil
101
+ return fmt .Sprintf ("%s NOT LIKE %s" , data .Field , search ), values , nil
82
102
case "endsWith" :
83
103
search := "CONCAT('%', ?)"
84
- return fmt .Sprintf ("%s LIKE %s" , data .Field , search ), [] interface {}{ data . Condition . Value } , nil
104
+ return fmt .Sprintf ("%s LIKE %s" , data .Field , search ), values , nil
85
105
case "notEndsWith" :
86
106
search := "CONCAT('%', ?)"
87
- return fmt .Sprintf ("%s NOT LIKE %s" , data .Field , search ), [] interface {}{ data . Condition . Value } , nil
107
+ return fmt .Sprintf ("%s NOT LIKE %s" , data .Field , search ), values , nil
88
108
}
89
109
90
110
if config != nil && config .Operations != nil {
91
111
op , opOk := config .Operations [data .Condition .Rule ]
92
112
if opOk {
93
- return op (data .Field , data .Condition )
113
+ return op (data .Field , data .Condition . Rule , data . Condition . getValues () )
94
114
}
95
115
}
96
116
0 commit comments