@@ -13,120 +13,143 @@ var cOrC = `{ "glue":"or", "rules":[{ "field": "a", "condition":{ "type":"is nul
13
13
var JSONaAndB = `{ "glue":"and", "rules":[{ "field": "json:cfg.a", "condition":{ "type":"less", "filter":1}}, { "field": "json:cfg.b", "condition":{ "type":"greater", "filter":"abc" }}]}`
14
14
15
15
var cases = [][]string {
16
- {`{}` , "" , "" },
16
+ {`{}` , "" , "" , "" },
17
17
{
18
18
`{ "glue":"and", "rules":[{ "field": "a", "condition":{ "type":"equal", "filter":1 }}]}` ,
19
19
"a = ?" ,
20
+ "a = $1" ,
20
21
"1" ,
21
22
},
22
23
{
23
24
`{ "glue":"and", "rules":[{ "field": "a", "condition":{ "type":"notEqual", "filter":1 }}]}` ,
24
25
"a <> ?" ,
26
+ "a <> $1" ,
25
27
"1" ,
26
28
},
27
29
{
28
30
`{ "glue":"and", "rules":[{ "field": "a", "condition":{ "type":"less", "filter":1 }}]}` ,
29
31
"a < ?" ,
32
+ "a < $1" ,
30
33
"1" ,
31
34
},
32
35
{
33
36
`{ "glue":"and", "rules":[{ "field": "a", "condition":{ "type":"lessOrEqual", "filter":1 }}]}` ,
34
37
"a <= ?" ,
38
+ "a <= $1" ,
35
39
"1" ,
36
40
},
37
41
{
38
42
`{ "glue":"and", "rules":[{ "field": "a", "condition":{ "type":"greater", "filter":1 }}]}` ,
39
43
"a > ?" ,
44
+ "a > $1" ,
40
45
"1" ,
41
46
},
42
47
{
43
48
`{ "glue":"and", "rules":[{ "field": "a", "condition":{ "type":"greaterOrEqual", "filter":1 }}]}` ,
44
49
"a >= ?" ,
50
+ "a >= $1" ,
45
51
"1" ,
46
52
},
47
53
{
48
54
`{ "glue":"and", "rules":[{ "field": "a", "condition":{ "type":"contains", "filter":1 }}]}` ,
49
55
"INSTR(a, ?) > 0" ,
56
+ "a LIKE '%' || $1 || '%'" ,
50
57
"1" ,
51
58
},
52
59
{
53
60
`{ "glue":"and", "rules":[{ "field": "a", "condition":{ "type":"notContains", "filter":1 }}]}` ,
54
61
"INSTR(a, ?) = 0" ,
62
+ "a NOT LIKE '%' || $1 || '%'" ,
55
63
"1" ,
56
64
},
57
65
{
58
66
`{ "glue":"and", "rules":[{ "field": "a", "condition":{ "type":"beginsWith", "filter":"1" }}]}` ,
59
67
"a LIKE CONCAT(?, '%')" ,
68
+ "a LIKE $1 || '%'" ,
60
69
"1" ,
61
70
},
62
71
{
63
72
`{ "glue":"and", "rules":[{ "field": "a", "condition":{ "type":"notBeginsWith", "filter":"1" }}]}` ,
64
73
"a NOT LIKE CONCAT(?, '%')" ,
74
+ "a NOT LIKE $1 || '%'" ,
65
75
"1" ,
66
76
},
67
77
{
68
78
`{ "glue":"and", "rules":[{ "field": "a", "condition":{ "type":"endsWith", "filter":"1" }}]}` ,
69
79
"a LIKE CONCAT('%', ?)" ,
80
+ "a LIKE '%' || $1" ,
70
81
"1" ,
71
82
},
72
83
{
73
84
`{ "glue":"and", "rules":[{ "field": "a", "condition":{ "type":"notEndsWith", "filter":"1" }}]}` ,
74
85
"a NOT LIKE CONCAT('%', ?)" ,
86
+ "a NOT LIKE '%' || $1" ,
75
87
"1" ,
76
88
},
77
89
{
78
90
`{ "glue":"and", "rules":[{ "field": "a", "condition":{ "type":"between", "filter":{ "start":1, "end":2 } }}]}` ,
79
91
"( a > ? AND a < ? )" ,
92
+ "( a > $1 AND a < $2 )" ,
80
93
"1,2" ,
81
94
},
82
95
{
83
96
`{ "glue":"and", "rules":[{ "field": "a", "condition":{ "type":"between", "filter":{ "start":1 } }}]}` ,
84
97
"a > ?" ,
98
+ "a > $1" ,
85
99
"1" ,
86
100
},
87
101
{
88
102
`{ "glue":"and", "rules":[{ "field": "a", "condition":{ "type":"between", "filter":{ "end":2 } }}]}` ,
89
103
"a < ?" ,
104
+ "a < $1" ,
90
105
"2" ,
91
106
},
92
107
{
93
108
`{ "glue":"and", "rules":[{ "field": "a", "condition":{ "type":"notBetween", "filter":{ "start":1, "end":2 } }}]}` ,
94
109
"( a < ? OR a > ? )" ,
110
+ "( a < $1 OR a > $2 )" ,
95
111
"1,2" ,
96
112
},
97
113
{
98
114
`{ "glue":"and", "rules":[{ "field": "a", "condition":{ "type":"notBetween", "filter":{ "start":1 } }}]}` ,
99
115
"a < ?" ,
116
+ "a < $1" ,
100
117
"1" ,
101
118
},
102
119
{
103
120
`{ "glue":"and", "rules":[{ "field": "a", "condition":{ "type":"notBetween", "filter":{ "end":2 } }}]}` ,
104
121
"a > ?" ,
122
+ "a > $1" ,
105
123
"2" ,
106
124
},
107
125
{
108
126
aAndB ,
109
127
"( a < ? AND b > ? )" ,
128
+ "( a < $1 AND b > $2 )" ,
110
129
"1,abc" ,
111
130
},
112
131
{
113
132
aOrB ,
114
133
"( a < ? OR b > ? )" ,
134
+ "( a < $1 OR b > $2 )" ,
115
135
"1,abc" ,
116
136
},
117
137
{
118
138
`{ "glue":"AND", "rules":[` + aAndB + `,` + aOrB + `,{ "field":"c", "condition": { "type":"equal", "filter":3 } }]}` ,
119
139
"( ( a < ? AND b > ? ) AND ( a < ? OR b > ? ) AND c = ? )" ,
140
+ "( ( a < $1 AND b > $2 ) AND ( a < $3 OR b > $4 ) AND c = $5 )" ,
120
141
"1,abc,1,abc,3" ,
121
142
},
122
143
{
123
144
`{ "glue":"and", "rules":[{ "field": "a", "includes":[1,2,3]}]}` ,
124
145
"a IN(?,?,?)" ,
146
+ "a IN($1,$2,$3)" ,
125
147
"1,2,3" ,
126
148
},
127
149
{
128
150
`{ "glue":"and", "rules":[{ "field": "a", "includes":["a","b","c"]}]}` ,
129
151
"a IN(?,?,?)" ,
152
+ "a IN($1,$2,$3)" ,
130
153
"a,b,c" ,
131
154
},
132
155
}
@@ -234,14 +257,52 @@ func TestSQL(t *testing.T) {
234
257
continue
235
258
}
236
259
237
- if valsStr != line [2 ] {
238
- t .Errorf ("wrong sql generated\n j: %s\n s: %s\n r: %s" , line [0 ], line [2 ], valsStr )
260
+ if valsStr != line [3 ] {
261
+ t .Errorf ("wrong sql generated (values)\n j: %s\n s: %s\n r: %s" , line [0 ], line [3 ], valsStr )
262
+ continue
263
+ }
264
+ }
265
+ }
266
+
267
+ func TestPostgre (t * testing.T ) {
268
+ queryConfig := SQLConfig {
269
+ // Whitelist: map[string]bool{
270
+ // "a": true,
271
+ // "b": true,
272
+ // "c": true,
273
+ // }
274
+ }
275
+ for _ , line := range cases {
276
+ format , err := FromJSON ([]byte (line [0 ]))
277
+ if err != nil {
278
+ t .Errorf ("can't parse json\n j: %s\n %f" , line [0 ], err )
279
+ continue
280
+ }
281
+
282
+ sql , vals , err := GetSQL (format , & queryConfig , & PostgreSQL {})
283
+ if err != nil {
284
+ t .Errorf ("can't generate sql\n j: %s\n %f" , line [0 ], err )
285
+ continue
286
+ }
287
+ if sql != line [2 ] {
288
+ t .Errorf ("wrong sql generated\n j: %s\n s: %s\n r: %s" , line [0 ], line [2 ], sql )
289
+ continue
290
+ }
291
+
292
+ valsStr , err := anyToStringArray (vals )
293
+ if err != nil {
294
+ t .Errorf ("can't convert parameters\n j: %s\n %f" , line [0 ], err )
295
+ continue
296
+ }
297
+
298
+ if valsStr != line [3 ] {
299
+ t .Errorf ("wrong sql generated\n j: %s\n s: %s\n r: %s" , line [0 ], line [3 ], valsStr )
239
300
continue
240
301
}
241
302
}
242
303
}
243
304
244
- func TestPSQL (t * testing.T ) {
305
+ func TestPostgreJSON (t * testing.T ) {
245
306
queryConfig := SQLConfig {
246
307
// Whitelist: map[string]bool{
247
308
// "a": true,
0 commit comments