20
20
import java .util .LinkedList ;
21
21
import java .util .List ;
22
22
23
+ import com .couchbase .client .java .json .JsonArray ;
23
24
import org .springframework .lang .Nullable ;
24
25
25
26
/**
@@ -68,8 +69,8 @@ public static QueryCriteria where(String key) {
68
69
}
69
70
70
71
private static QueryCriteria wrap (QueryCriteria criteria ) {
71
- QueryCriteria qc = new QueryCriteria (new LinkedList <QueryCriteria >(), criteria .key , criteria .value , null ,
72
- criteria .operator , criteria . format );
72
+ QueryCriteria qc = new QueryCriteria (new LinkedList <>(), criteria .key , criteria .value , null , criteria . operator ,
73
+ criteria .format );
73
74
return qc ;
74
75
}
75
76
@@ -167,7 +168,7 @@ public QueryCriteria containing(@Nullable Object o) {
167
168
public QueryCriteria notContaining (@ Nullable Object o ) {
168
169
value = new QueryCriteria [] { wrap (containing (o )) };
169
170
operator = "NOT" ;
170
- format = format = "not( %3$s )" ;
171
+ format = "not( %3$s )" ;
171
172
return this ;
172
173
}
173
174
@@ -196,7 +197,7 @@ public QueryCriteria isNotNull() {
196
197
operator = "IS_NOT_NULL" ;
197
198
value = null ;
198
199
format = "%1$s is not null" ;
199
- return ( QueryCriteria ) this ;
200
+ return this ;
200
201
}
201
202
202
203
public QueryCriteria isMissing () {
@@ -210,7 +211,7 @@ public QueryCriteria isNotMissing() {
210
211
operator = "IS_NOT_MiSSING" ;
211
212
value = null ;
212
213
format = "%1$s is not missing" ;
213
- return ( QueryCriteria ) this ;
214
+ return this ;
214
215
}
215
216
216
217
public QueryCriteria isValued () {
@@ -224,64 +225,73 @@ public QueryCriteria isNotValued() {
224
225
operator = "IS_NOT_VALUED" ;
225
226
value = null ;
226
227
format = "%1$s is not valued" ;
227
- return ( QueryCriteria ) this ;
228
+ return this ;
228
229
}
229
230
230
231
public QueryCriteria within (@ Nullable Object o ) {
231
232
operator = "WITHIN" ;
232
233
value = new Object [] { o };
233
234
format = "%1$s within $3$s" ;
234
- return ( QueryCriteria ) this ;
235
+ return this ;
235
236
}
236
237
237
238
public QueryCriteria between (@ Nullable Object o1 , @ Nullable Object o2 ) {
238
239
operator = "BETWEEN" ;
239
240
value = new Object [] { o1 , o2 };
240
241
format = "%1$s between %3$s and %4$s" ;
241
- return ( QueryCriteria ) this ;
242
+ return this ;
242
243
}
243
244
244
245
public QueryCriteria in (@ Nullable Object ... o ) {
245
246
operator = "IN" ;
246
247
value = o ;
247
- StringBuilder sb = new StringBuilder ("%1$s in ( [ " );
248
+ StringBuilder sb = new StringBuilder ("%1$s in ( " );
249
+ boolean notArray = false ;
250
+ // if parameter is an array, then toString() will provide brackets [ ... ]
251
+ if (!(value .length == 1 && (value [0 ] instanceof Object [] || value [0 ] instanceof JsonArray ))) {
252
+ notArray = true ;
253
+ sb .append ("[" );
254
+ }
248
255
for (int i = 1 ; i <= value .length ; i ++) { // format indices start at 1
249
256
if (i > 1 )
250
- sb .append (", " );
257
+ sb .append ("," );
251
258
sb .append ("%" + (i + 2 ) + "$s" ); // the first is fieldName, second is operator, args start at 3
252
259
}
253
- format = sb .append (" ] )" ).toString ();
254
- return (QueryCriteria ) this ;
260
+ if (notArray ) {
261
+ sb .append ("]" );
262
+ }
263
+ format = sb .append (" )" ).toString ();
264
+ return this ;
255
265
}
256
266
257
267
public QueryCriteria notIn (@ Nullable Object ... o ) {
258
268
value = new QueryCriteria [] { wrap (in (o )) };
259
269
operator = "NOT" ;
260
- format = format = "not( %3$s )" ; // field = 1$, operator = 2$, value=$3, $4, ...
261
- return ( QueryCriteria ) this ;
270
+ format = "not( %3$s )" ; // field = 1$, operator = 2$, value=$3, $4, ...
271
+ return this ;
262
272
}
263
273
264
274
public QueryCriteria TRUE () { // true/false are reserved, use TRUE/FALSE
265
275
value = null ;
266
276
operator = null ;
267
- format = format = "%1$s" ; // field = 1$, operator = 2$, value=$3, $4, ...
268
- return ( QueryCriteria ) this ;
277
+ format = "%1$s" ; // field = 1$, operator = 2$, value=$3, $4, ...
278
+ return this ;
269
279
}
270
280
271
281
public QueryCriteria FALSE () {
272
282
value = new QueryCriteria [] { wrap (TRUE ()) };
273
283
operator = "not" ;
274
- format = format = "not( %3$s )" ;
275
- return ( QueryCriteria ) this ;
284
+ format = "not( %3$s )" ;
285
+ return this ;
276
286
}
277
287
278
288
/**
279
289
* This exports the query criteria into a string to be appended to the beginning of an N1QL statement
280
290
*
281
- * @param paramIndexPtr - this is a reference to the parameter index to be used for positional parameters
282
- * There may already be positional parameters in the beginning of the statement,
283
- * so it may not always start at 1. If it has the value -1 , the query is using
284
- * named parameters. If the pointer is null, the query is not using parameters.
291
+ * @param paramIndexPtr - this is a reference to the parameter index to be used for positional parameters There may
292
+ * already be positional parameters in the beginning of the statement, so it may not always start at 1. If it
293
+ * has the value -1, the query is using named parameters. If the pointer is null , the query is not using
294
+ * parameters.
285
295
* @return string containing part of N1QL query
286
296
*/
287
297
@ Override
@@ -353,6 +363,18 @@ private String maybeWrapValue(String key, Object value, int[] paramIndexPtr) {
353
363
return "\" " + value + "\" " ;
354
364
} else if (value == null ) {
355
365
return "null" ;
366
+ } else if (value instanceof Object []) {
367
+ StringBuffer l = new StringBuffer ();
368
+ l .append ("[" );
369
+ Object [] array = (Object []) value ;
370
+ for (int i = 0 ; i < array .length ; i ++) {
371
+ if (i > 0 ) {
372
+ l .append ("," );
373
+ }
374
+ l .append (maybeWrapValue (null , array [i ], null ));
375
+ }
376
+ l .append ("]" );
377
+ return l .toString ();
356
378
} else {
357
379
return value .toString ();
358
380
}
0 commit comments