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)); }