You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by fa...@apache.org on 2009/05/19 01:41:44 UTC
svn commit: r776136 - in
/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria:
CriteriaBuilder.java CriteriaQueryImpl.java SelectionImpl.java
Author: faywang
Date: Mon May 18 23:41:43 2009
New Revision: 776136
URL: http://svn.apache.org/viewvc?rev=776136&view=rev
Log:
OPENJPA-1013: Constructor support in Criteria Query. Test case will be checked in later.
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/CriteriaQueryImpl.java
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SelectionImpl.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=776136&r1=776135&r2=776136&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 Mon May 18 23:41:43 2009
@@ -540,7 +540,7 @@
public <Y> Selection<Y> select(Class<Y> result,
Selection<?>... selections) {
- throw new AbstractMethodError();
+ return new SelectionImpl(result).setSelections(selections);
}
public <R> Case<R> selectCase() {
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java?rev=776136&r1=776135&r2=776136&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java Mon May 18 23:41:43 2009
@@ -62,6 +62,9 @@
private PredicateImpl _having;
private Boolean _distinct;
private LinkedMap _parameterTypes;
+ private Class _resultClass;
+ private Value[] _projections;
+ private int _aliasCount = 0;
public CriteriaQueryImpl(MetamodelImpl model) {
this._model = model;
@@ -177,6 +180,14 @@
_parameterTypes = parameterTypes;
}
+ public void setResultClass(Class resultClass) {
+ _resultClass = resultClass;
+ }
+
+ public void setProjections(Value[] projections) {
+ _projections = projections;
+ }
+
/**
* Populate kernel expressions.
*/
@@ -206,14 +217,13 @@
evalOrdering(exps, factory);
// exps.operation = QueryOperations.OP_SELECT;
- // exps.parameterTypes = null; // LinkedMap<>
- // exps.projectionAliases = null; // String[]
- // exps.projectionClauses = null; // String[]
- exps.projections = toValues(factory, getSelectionList());
+ evalProjection(exps, factory);
+
// exps.range = null; // Value[]
// exps.resultClass = null; // Class
- if (_parameterTypes != null)
- exps.parameterTypes = _parameterTypes;
+ if (_parameterTypes != null)
+ exps.parameterTypes = _parameterTypes;
+ exps.resultClass = _resultClass;
return exps;
}
@@ -249,19 +259,31 @@
(ExpressionImpl<?>)groupBy, factory, _model, this);;
}
}
-
-
-
- Value[] toValues(ExpressionFactory factory, List<Selection<?>> sels) {
+ void evalProjection(QueryExpressions exps, ExpressionFactory factory) {
+ Value [] projs = toValues(exps, factory, getSelectionList());
+ if (projs.length == 1 && projs[0] == null)
+ exps.projections = _projections;
+ else
+ exps.projections = projs;
+ //exps.projectionClauses = String[];
+ }
+
+ Value[] toValues(QueryExpressions exps, ExpressionFactory factory,
+ List<Selection<?>> sels) {
if (sels == null || (sels.size() == 1 && sels.get(0) == getRoot()))
return new Value[0];
Value[] result = new Value[sels.size()];
+ String[] aliases = new String[sels.size()];
int i = 0;
for (Selection<?> s : sels) {
- result[i++] = ((ExpressionImpl<?>)s).toValue(factory, _model,
+ result[i] = ((SelectionImpl<?>)s).toValue(factory, _model,
this);
- }
+ aliases[i] = nextAlias();
+ i++;
+ }
+ exps.projectionAliases = aliases;
+
return result;
}
@@ -323,4 +345,9 @@
if (_parameterTypes.containsKey(paramKey))
_parameterTypes.put(paramKey, type);
}
+
+ private String nextAlias() {
+ return "jpqlalias" + (++_aliasCount);
+ }
+
}
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SelectionImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SelectionImpl.java?rev=776136&r1=776135&r2=776136&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SelectionImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SelectionImpl.java Mon May 18 23:41:43 2009
@@ -18,9 +18,16 @@
*/
package org.apache.openjpa.persistence.criteria;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Selection;
+import org.apache.openjpa.kernel.exps.ExpressionFactory;
+import org.apache.openjpa.kernel.exps.Value;
import org.apache.openjpa.persistence.ResultItemImpl;
+import org.apache.openjpa.persistence.meta.MetamodelImpl;
/**
* An item selected in the projection clause of Criteria query.
@@ -31,8 +38,32 @@
*/
public class SelectionImpl<X> extends ResultItemImpl<X>
implements Selection<X> {
-
+
+ private List<Selection<?>> _sels;
+
public SelectionImpl(Class<X> cls) {
super(cls);
}
+
+ public SelectionImpl setSelections(Selection<?>... selections) {
+ _sels = Arrays.asList(selections);
+ return this;
+ }
+
+ public List<Selection<?>> getSelections() {
+ return _sels;
+ }
+
+ Value toValue(ExpressionFactory factory, MetamodelImpl model,
+ CriteriaQuery q) {
+ ((CriteriaQueryImpl)q).setResultClass(getJavaType());
+ Value[] result = new Value[_sels.size()];
+ int i = 0;
+ for (Selection<?> s : _sels) {
+ result[i++] = ((ExpressionImpl<?>)s).toValue(factory, model,
+ q);
+ }
+ ((CriteriaQueryImpl)q).setProjections(result);
+ return null;
+ }
}