diff --git a/querydsl-core/src/main/java/com/mysema/query/types/expr/CaseBuilder.java b/querydsl-core/src/main/java/com/mysema/query/types/expr/CaseBuilder.java
index 9467b6049..cdf4a19fd 100644
--- a/querydsl-core/src/main/java/com/mysema/query/types/expr/CaseBuilder.java
+++ b/querydsl-core/src/main/java/com/mysema/query/types/expr/CaseBuilder.java
@@ -13,18 +13,17 @@
*/
package com.mysema.query.types.expr;
-import java.sql.Time;
-import java.sql.Timestamp;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.annotation.Nullable;
-
import com.mysema.query.types.ConstantImpl;
import com.mysema.query.types.Expression;
import com.mysema.query.types.NullExpression;
import com.mysema.query.types.Ops;
+import javax.annotation.Nullable;
+import java.sql.Time;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.List;
+
/**
* CaseBuilder enables the construction of typesafe case-when-then-else
* constructs :
@@ -164,8 +163,28 @@ public final class CaseBuilder {
this.when = b;
}
- @SuppressWarnings("unchecked")
public Cases> then(Expression expr) {
+ if (expr instanceof BooleanExpression) {
+ return (Cases) then((BooleanExpression) expr);
+ } else if (expr instanceof StringExpression) {
+ return (Cases) then((StringExpression) expr);
+ } else if (expr instanceof NumberExpression) {
+ return then((NumberExpression) expr);
+ } else if (expr instanceof DateExpression) {
+ return then((DateExpression) expr);
+ } else if (expr instanceof DateTimeExpression) {
+ return then((DateTimeExpression) expr);
+ } else if (expr instanceof TimeExpression) {
+ return then((TimeExpression) expr);
+ } else if (expr instanceof ComparableExpression) {
+ return then((ComparableExpression) expr);
+ } else {
+ return thenSimple(expr);
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ private Cases> thenSimple(Expression expr) {
return new Cases>((Class)expr.getType()) {
@Override
protected SimpleExpression createResult(Class type, Expression last) {
@@ -176,12 +195,12 @@ public final class CaseBuilder {
}
public Cases> then(A constant) {
- return then(ConstantImpl.create(constant));
+ return thenSimple(ConstantImpl.create(constant));
}
// Boolean
- public Cases then(BooleanExpression expr) {
+ public Cases then(BooleanExpression expr) {
return thenBoolean(expr);
}
@@ -200,6 +219,26 @@ public final class CaseBuilder {
return thenBoolean(ConstantImpl.create(b));
}
+ // Comparable
+
+ public Cases> then(ComparableExpression expr) {
+ return thenComparable(expr);
+ }
+
+ private Cases> thenComparable(Expression expr) {
+ return new Cases>((Class)expr.getType()) {
+ @Override
+ protected ComparableExpression createResult(Class type, Expression last) {
+ return ComparableOperation.create(type, Ops.CASE, last);
+ }
+
+ }.addCase(when, expr);
+ }
+
+ public Cases> then(A arg) {
+ return thenComparable(ConstantImpl.create(arg));
+ }
+
// Date
public Cases> then(DateExpression expr) {
@@ -216,7 +255,7 @@ public final class CaseBuilder {
}.addCase(when, expr);
}
- public Cases> thenDate(java.sql.Date date) {
+ public Cases> then(java.sql.Date date) {
return thenDate(ConstantImpl.create(date));
}
@@ -236,11 +275,11 @@ public final class CaseBuilder {
}.addCase(when, expr);
}
- public Cases> thenDateTime(Timestamp ts) {
+ public Cases> then(Timestamp ts) {
return thenDateTime(ConstantImpl.create(ts));
}
- public Cases> thenDateTime(java.util.Date date) {
+ public Cases> then(java.util.Date date) {
return thenDateTime(ConstantImpl.create(date));
}