Add Enum support #635

This commit is contained in:
Timo Westkämper 2014-01-21 19:51:27 +02:00
parent 369f679070
commit 2da96256bb
2 changed files with 39 additions and 0 deletions

View File

@ -244,6 +244,26 @@ public final class CaseBuilder {
return thenDateTime(ConstantImpl.create(date));
}
// Enum
public <T extends Enum<T>> Cases<T,EnumExpression<T>> then(EnumExpression<T> expr) {
return thenEnum(expr);
}
@SuppressWarnings("unchecked")
private <T extends Enum<T>> Cases<T,EnumExpression<T>> thenEnum(Expression<T> expr) {
return new Cases<T,EnumExpression<T>>((Class)expr.getType()) {
@Override
protected EnumExpression<T> createResult(Class<T> type, Expression<T> last) {
return EnumOperation.create(type, Ops.CASE, last);
}
}.addCase(when, expr);
}
public <T extends Enum<T>> Cases<T, EnumExpression<T>> then(T arg) {
return thenEnum(ConstantImpl.create(arg));
}
// Number
public <A extends Number & Comparable<?>> Cases<A, NumberExpression<A>> then(NumberExpression<A> expr) {

View File

@ -22,6 +22,7 @@ import org.junit.Test;
import com.mysema.query.types.expr.BooleanExpression;
import com.mysema.query.types.expr.CaseBuilder;
import com.mysema.query.types.expr.EnumExpression;
import com.mysema.query.types.expr.NumberExpression;
import com.mysema.query.types.expr.SimpleExpression;
import com.mysema.query.types.expr.StringExpression;
@ -29,6 +30,10 @@ import com.mysema.query.types.template.BooleanTemplate;
public class CaseBuilderTest {
public enum Gender {
MALE, FEMALE
}
public static class Customer{
private long annualSpending;
public long getAnnualSpending() {
@ -58,6 +63,20 @@ public class CaseBuilderTest {
"end", cases.toString());
}
@Test
public void EnumTyped() {
Customer c = alias(Customer.class, "customer");
EnumExpression<Gender> cases = new CaseBuilder()
.when($(c.getAnnualSpending()).gt(10000)).then(Gender.MALE)
.otherwise(Gender.FEMALE);
assertEquals(
"case " +
"when customer.annualSpending > 10000 then MALE " +
"else FEMALE " +
"end", cases.toString());
}
@Test
public void NumberTyped() {
Customer c = alias(Customer.class, "customer");