Author: faywang
Date: Thu May 14 17:13:44 2009
New Revision: 774848
URL: http://svn.apache.org/viewvc?rev=774848&view=rev
Log:
OPENJPA-1013: simple case and case expression support in Criteria Query
Modified:
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaBuilder.java
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java
Modified:
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaBuilder.java
URL:
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaBuilder.java?rev=774848&r1=774847&r2=774848&view=diff
==============================================================================
---
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaBuilder.java
(original)
+++
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaBuilder.java
Thu May 14 17:13:44 2009
@@ -544,13 +544,12 @@
}
public <R> Case<R> selectCase() {
- throw new AbstractMethodError();
-
+ return new Expressions.Case();
}
public <C, R> SimpleCase<C, R> selectCase(
Expression<? extends C> expression) {
- throw new AbstractMethodError();
+ return new Expressions.SimpleCase(expression);
}
public <C extends Collection<?>> Expression<Integer> size(C collection) {
Modified:
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java
URL:
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java?rev=774848&r1=774847&r2=774848&view=diff
==============================================================================
---
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java
(original)
+++
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java
Thu May 14 17:13:44 2009
@@ -29,6 +29,7 @@
import javax.persistence.criteria.QueryBuilder.Trimspec;
import org.apache.openjpa.kernel.exps.ExpressionFactory;
+import org.apache.openjpa.kernel.exps.Literal;
import org.apache.openjpa.kernel.exps.Value;
import org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder;
import org.apache.openjpa.persistence.meta.MetamodelImpl;
@@ -765,4 +766,143 @@
notNull.toKernelExpression(factory, model));
}
}
+
+ public static class Case<T> extends ExpressionImpl<T>
+ implements QueryBuilder.Case<T> {
+ private List<Expression<? extends T>> thens =
+ new ArrayList<Expression<? extends T>>();
+
+ private List<Expression<Boolean>> whens =
+ new ArrayList<Expression<Boolean>>();
+
+ private Expression<? extends T> otherwise;
+
+ public Case() {
+ super(null);
+ }
+
+ public Case(Class<T> cls) {
+ super(cls);
+ }
+
+ public Case<T> when(Expression<Boolean> when,
+ Expression<? extends T> then) {
+ whens.add(when);
+ thens.add(then);
+ return this;
+ }
+
+ public Case<T> when(Expression<Boolean> when, T then) {
+ whens.add(when);
+ Expression<? extends T> thenExpr =
+ new Expressions.Constant<T>(then);
+ thens.add(thenExpr);
+ return this;
+ }
+
+ public Case<T> otherwise(Expression<? extends T> otherwise) {
+ this.otherwise = otherwise;
+ return this;
+ }
+
+ public Case<T> otherwise(T otherwise) {
+ this.otherwise = new Expressions.Constant<T>(otherwise);
+ return this;
+ }
+
+ @Override
+ public org.apache.openjpa.kernel.exps.Value toValue(
+ ExpressionFactory factory, MetamodelImpl model) {
+ int size = whens.size();
+ org.apache.openjpa.kernel.exps.Expression[] exps =
+ new org.apache.openjpa.kernel.exps.Expression[size];
+ for (int i = 0; i < size; i++) {
+ org.apache.openjpa.kernel.exps.Expression expr =
+ ((Expressions.BinaryLogicalExpression)whens.get(i)).
+ toKernelExpression(factory, model);
+ Value action = ((ExpressionImpl<?>)thens.get(i)).
+ toValue(factory, model);
+ exps[i] = factory.whenCondition(expr, action);
+ }
+
+ Value other = ((ExpressionImpl<?>)otherwise).
+ toValue(factory, model);
+
+ return factory.generalCaseExpression(exps, other);
+ }
+ }
+
+ public static class SimpleCase<C,R> extends ExpressionImpl<R>
+ implements QueryBuilder.SimpleCase<C,R> {
+ private List<Expression<? extends R>> thens =
+ new ArrayList<Expression<? extends R>>();
+
+ private List<C> whens = new ArrayList<C>();
+
+ private Expression<? extends R> otherwise;
+
+ private Expression<? extends R> caseOperand;
+
+ public SimpleCase() {
+ super(null);
+ }
+
+ public SimpleCase(Class<R> cls) {
+ super(cls);
+ }
+
+ public SimpleCase(Expression<? extends R> expr) {
+ super(null);
+ this.caseOperand = expr;
+ }
+ public Expression getExpression() {
+ return caseOperand;
+ }
+
+ public SimpleCase<C,R> when(C when, Expression<? extends R> then) {
+ whens.add(when);
+ thens.add(then);
+ return this;
+ }
+
+ public SimpleCase<C,R> when(C when, R then) {
+ whens.add(when);
+ Expression<? extends R> thenExpr =
+ new Expressions.Constant<R>(then);
+ thens.add(thenExpr);
+ return this;
+ }
+
+ public SimpleCase<C,R> otherwise(Expression<? extends R> otherwise) {
+ this.otherwise = otherwise;
+ return this;
+ }
+
+ public SimpleCase<C,R> otherwise(R otherwise) {
+ this.otherwise = new Expressions.Constant<R>(otherwise);
+ return this;
+ }
+
+ @Override
+ public org.apache.openjpa.kernel.exps.Value toValue(
+ ExpressionFactory factory, MetamodelImpl model) {
+ Value caseOperandExpr = Expressions.toValue(
+ (ExpressionImpl<?>)caseOperand, factory, model);
+ int size = whens.size();
+ org.apache.openjpa.kernel.exps.Expression[] exps =
+ new org.apache.openjpa.kernel.exps.Expression[size];
+ for (int i = 0; i < size; i++) {
+ org.apache.openjpa.kernel.exps.Literal val = null;
+ //TODO: Boolean literal, String literal
+ val = factory.newLiteral(whens.get(i), Literal.TYPE_NUMBER);
+ Value action = ((ExpressionImpl<?>)thens.get(i)).
+ toValue(factory, model);
+ exps[i] = factory.whenScalar(val, action);
+ }
+
+ Value other = ((ExpressionImpl<?>)otherwise).
+ toValue(factory, model);
+ return factory.simpleCaseExpression(caseOperandExpr, exps, other);
+ }
+ }
}