2020import java .util .LinkedList ;
2121import java .util .List ;
2222
23+ import com .couchbase .client .java .json .JsonArray ;
2324import org .springframework .lang .Nullable ;
2425
2526/**
@@ -68,8 +69,8 @@ public static QueryCriteria where(String key) {
6869 }
6970
7071 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 );
7374 return qc ;
7475 }
7576
@@ -167,7 +168,7 @@ public QueryCriteria containing(@Nullable Object o) {
167168 public QueryCriteria notContaining (@ Nullable Object o ) {
168169 value = new QueryCriteria [] { wrap (containing (o )) };
169170 operator = "NOT" ;
170- format = format = "not( %3$s )" ;
171+ format = "not( %3$s )" ;
171172 return this ;
172173 }
173174
@@ -196,7 +197,7 @@ public QueryCriteria isNotNull() {
196197 operator = "IS_NOT_NULL" ;
197198 value = null ;
198199 format = "%1$s is not null" ;
199- return ( QueryCriteria ) this ;
200+ return this ;
200201 }
201202
202203 public QueryCriteria isMissing () {
@@ -210,7 +211,7 @@ public QueryCriteria isNotMissing() {
210211 operator = "IS_NOT_MiSSING" ;
211212 value = null ;
212213 format = "%1$s is not missing" ;
213- return ( QueryCriteria ) this ;
214+ return this ;
214215 }
215216
216217 public QueryCriteria isValued () {
@@ -224,64 +225,73 @@ public QueryCriteria isNotValued() {
224225 operator = "IS_NOT_VALUED" ;
225226 value = null ;
226227 format = "%1$s is not valued" ;
227- return ( QueryCriteria ) this ;
228+ return this ;
228229 }
229230
230231 public QueryCriteria within (@ Nullable Object o ) {
231232 operator = "WITHIN" ;
232233 value = new Object [] { o };
233234 format = "%1$s within $3$s" ;
234- return ( QueryCriteria ) this ;
235+ return this ;
235236 }
236237
237238 public QueryCriteria between (@ Nullable Object o1 , @ Nullable Object o2 ) {
238239 operator = "BETWEEN" ;
239240 value = new Object [] { o1 , o2 };
240241 format = "%1$s between %3$s and %4$s" ;
241- return ( QueryCriteria ) this ;
242+ return this ;
242243 }
243244
244245 public QueryCriteria in (@ Nullable Object ... o ) {
245246 operator = "IN" ;
246247 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+ }
248255 for (int i = 1 ; i <= value .length ; i ++) { // format indices start at 1
249256 if (i > 1 )
250- sb .append (", " );
257+ sb .append ("," );
251258 sb .append ("%" + (i + 2 ) + "$s" ); // the first is fieldName, second is operator, args start at 3
252259 }
253- format = sb .append (" ] )" ).toString ();
254- return (QueryCriteria ) this ;
260+ if (notArray ) {
261+ sb .append ("]" );
262+ }
263+ format = sb .append (" )" ).toString ();
264+ return this ;
255265 }
256266
257267 public QueryCriteria notIn (@ Nullable Object ... o ) {
258268 value = new QueryCriteria [] { wrap (in (o )) };
259269 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 ;
262272 }
263273
264274 public QueryCriteria TRUE () { // true/false are reserved, use TRUE/FALSE
265275 value = null ;
266276 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 ;
269279 }
270280
271281 public QueryCriteria FALSE () {
272282 value = new QueryCriteria [] { wrap (TRUE ()) };
273283 operator = "not" ;
274- format = format = "not( %3$s )" ;
275- return ( QueryCriteria ) this ;
284+ format = "not( %3$s )" ;
285+ return this ;
276286 }
277287
278288 /**
279289 * This exports the query criteria into a string to be appended to the beginning of an N1QL statement
280290 *
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.
285295 * @return string containing part of N1QL query
286296 */
287297 @ Override
@@ -353,6 +363,18 @@ private String maybeWrapValue(String key, Object value, int[] paramIndexPtr) {
353363 return "\" " + value + "\" " ;
354364 } else if (value == null ) {
355365 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 ();
356378 } else {
357379 return value .toString ();
358380 }
0 commit comments