From dd21bce82da9617ff8f748f8567b0329aca07b83 Mon Sep 17 00:00:00 2001 From: Sotaro SUZUKI Date: Wed, 1 Oct 2014 15:32:06 +0900 Subject: add support condition oneOf / noneOf var-length parameterized IN(?, ?, ...), NOT IN(?, ?, ...) support --- src/main/java/com/iciql/CompareType.java | 2 +- src/main/java/com/iciql/Condition.java | 29 ++++++++++++++++++++++++----- src/main/java/com/iciql/Query.java | 16 ++++++++++++++++ src/main/java/com/iciql/QueryCondition.java | 24 ++++++++++++++++++++++-- src/main/java/com/iciql/util/Utils.java | 5 +++++ 5 files changed, 68 insertions(+), 8 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/com/iciql/CompareType.java b/src/main/java/com/iciql/CompareType.java index 84e29fe..87ce77e 100644 --- a/src/main/java/com/iciql/CompareType.java +++ b/src/main/java/com/iciql/CompareType.java @@ -24,7 +24,7 @@ package com.iciql; enum CompareType { EQUAL("=", true), EXCEEDS(">", true), AT_LEAST(">=", true), LESS_THAN("<", true), AT_MOST("<=", true), NOT_EQUAL( "<>", true), IS_NOT_NULL("IS NOT NULL", false), IS_NULL("IS NULL", false), LIKE("LIKE", true), BETWEEN( - "BETWEEN", true); + "BETWEEN", true), IN("IN", true), NOT_IN("NOT IN", true); private String text; private boolean hasRightExpression; diff --git a/src/main/java/com/iciql/Condition.java b/src/main/java/com/iciql/Condition.java index 17cb117..0ed1d06 100644 --- a/src/main/java/com/iciql/Condition.java +++ b/src/main/java/com/iciql/Condition.java @@ -27,28 +27,47 @@ package com.iciql; class Condition implements Token { CompareType compareType; A x, y, z; + Iterable i; + + Condition(A x, CompareType compareType) { + this(x, null, null, null, compareType); + } Condition(A x, A y, CompareType compareType) { - this(x, y, null, compareType); + this(x, y, null, null, compareType); } Condition(A x, A y, A z, CompareType compareType) { + this(x, y, z, null, compareType); + } + + Condition(A x, Iterable i, CompareType compareType) { + this(x, null, null, i, compareType); + } + + Condition(A x, A y, A z, Iterable i, CompareType compareType) { this.compareType = compareType; this.x = x; this.y = y; this.z = z; + this.i = i; } + @SuppressWarnings("unchecked") public void appendSQL(SQLStatement stat, Query query) { query.appendSQL(stat, null, x); stat.appendSQL(" "); stat.appendSQL(compareType.getString()); if (compareType.hasRightExpression()) { - stat.appendSQL(" "); - if (z == null) { - query.appendSQL(stat, x, y); + if (i == null) { + stat.appendSQL(" "); + if (z == null) { + query.appendSQL(stat, x, y); + } else { + query.appendSQL(stat, x, y, z, compareType); + } } else { - query.appendSQL(stat, x, y, z, compareType); + query.appendSQL(stat, x, (Iterable)i, compareType); } } } diff --git a/src/main/java/com/iciql/Query.java b/src/main/java/com/iciql/Query.java index 45de08b..5f29edf 100644 --- a/src/main/java/com/iciql/Query.java +++ b/src/main/java/com/iciql/Query.java @@ -792,6 +792,22 @@ public class Query { addParameter(stat, alias, valueRight); } + public void appendSQL(SQLStatement stat, Object alias, Iterable values, + CompareType compareType) { + boolean first = true; + stat.appendSQL("("); + for (Object value : values) { + if (first) { + first = false; + } else { + stat.appendSQL(", "); + } + stat.appendSQL("?"); + addParameter(stat, alias, value); + } + stat.appendSQL(")"); + } + private void addParameter(SQLStatement stat, Object alias, Object value) { if (alias != null && value.getClass().isEnum()) { SelectColumn col = getColumnByReference(alias); diff --git a/src/main/java/com/iciql/QueryCondition.java b/src/main/java/com/iciql/QueryCondition.java index 9613b1b..cef95c1 100644 --- a/src/main/java/com/iciql/QueryCondition.java +++ b/src/main/java/com/iciql/QueryCondition.java @@ -17,6 +17,8 @@ package com.iciql; +import com.iciql.util.Utils; + /** * This class represents a query with an incomplete condition. * @@ -41,6 +43,24 @@ public class QueryCondition { return new QueryWhere(query); } + public QueryWhere oneOf(A... a) { + return oneOf(Utils.newArrayIterable(a)); + } + + public QueryWhere oneOf(Iterable i) { + query.addConditionToken(new Condition(x, i, CompareType.IN)); + return new QueryWhere(query); + } + + public QueryWhere noneOf(A... a) { + return noneOf(Utils.newArrayIterable(a)); + } + + public QueryWhere noneOf(Iterable i) { + query.addConditionToken(new Condition(x, i, CompareType.NOT_IN)); + return new QueryWhere(query); + } + public QueryWhere is(A y) { query.addConditionToken(new Condition(x, y, CompareType.EQUAL)); return new QueryWhere(query); @@ -52,12 +72,12 @@ public class QueryCondition { } public QueryWhere isNull() { - query.addConditionToken(new Condition(x, null, CompareType.IS_NULL)); + query.addConditionToken(new Condition(x, CompareType.IS_NULL)); return new QueryWhere(query); } public QueryWhere isNotNull() { - query.addConditionToken(new Condition(x, null, CompareType.IS_NOT_NULL)); + query.addConditionToken(new Condition(x, CompareType.IS_NOT_NULL)); return new QueryWhere(query); } diff --git a/src/main/java/com/iciql/util/Utils.java b/src/main/java/com/iciql/util/Utils.java index 77110b8..bc636d1 100644 --- a/src/main/java/com/iciql/util/Utils.java +++ b/src/main/java/com/iciql/util/Utils.java @@ -28,6 +28,7 @@ import java.math.BigInteger; import java.sql.Blob; import java.sql.Clob; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -78,6 +79,10 @@ public class Utils { } } + public static Iterable newArrayIterable(final T[] a) { + return Arrays.asList(a); + } + public static ArrayList newArrayList() { return new ArrayList(); } -- cgit v1.2.3