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/06/04 01:44:59 UTC
svn commit: r781621 [3/3] - in /openjpa/trunk:
openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/
openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/
openjpa-persistence/src/main/java/org/apache/openjpa/persiste...
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PredicateImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PredicateImpl.java?rev=781621&r1=781620&r2=781621&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PredicateImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PredicateImpl.java Wed Jun 3 23:44:58 2009
@@ -21,7 +21,6 @@
import java.util.ArrayList;
import java.util.List;
-import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Expression;
import javax.persistence.criteria.Predicate;
@@ -29,27 +28,27 @@
import org.apache.openjpa.persistence.meta.MetamodelImpl;
public class PredicateImpl extends ExpressionImpl<Boolean>
- implements Predicate {
+implements Predicate {
List<Expression<Boolean>> _exps;
BooleanOperator _op;
boolean _negated = false;
-
+
protected PredicateImpl() {
- super(Boolean.class);
+ super(Boolean.class);
}
-
+
protected PredicateImpl(BooleanOperator op) {
this();
_op = op;
}
-
+
protected PredicateImpl(BooleanOperator op, Predicate...restrictions) {
- this(op);
- if (restrictions != null) {
- for (Predicate p : restrictions)
- add((PredicateImpl)p);
- }
- }
+ this(op);
+ if (restrictions != null) {
+ for (Predicate p : restrictions)
+ add((PredicateImpl)p);
+ }
+ }
public PredicateImpl add(Expression<Boolean> s) {
if (_exps == null)
@@ -71,60 +70,64 @@
}
public PredicateImpl negate() {
- PredicateImpl not = new PredicateImpl(_op);
+ PredicateImpl not = clone();
not._negated = true;
- if (_exps != null)
- not._exps = new ArrayList<Expression<Boolean>>(this._exps);
- not._op = this._op;
return not;
}
-
+
+ public PredicateImpl clone() {
+ PredicateImpl clone = new PredicateImpl(_op);
+ if (_exps != null)
+ clone._exps = new ArrayList<Expression<Boolean>>(this._exps);
+ return clone;
+ }
+
@Override
org.apache.openjpa.kernel.exps.Expression toKernelExpression(
- ExpressionFactory factory, MetamodelImpl model, CriteriaQuery q) {
- if (_exps == null || _exps.isEmpty())
- return factory.emptyExpression();
- if (_exps.size() == 1)
- return ((ExpressionImpl<?>)_exps.get(0))
- .toKernelExpression(factory, model, q);
- ExpressionImpl<?> e1 = (ExpressionImpl<?>)_exps.get(0);
- ExpressionImpl<?> e2 = (ExpressionImpl<?>)_exps.get(1);
- org.apache.openjpa.kernel.exps.Expression ke1 =
- e1.toKernelExpression(factory, model, q);
- org.apache.openjpa.kernel.exps.Expression ke2 =
- e2.toKernelExpression(factory, model, q);
- org.apache.openjpa.kernel.exps.Expression result =
- _op == BooleanOperator.AND
- ? factory.and(ke1,ke2) : factory.or(ke1, ke2);
-
- for (int i = 2; i < _exps.size(); i++) {
- ExpressionImpl<?> e = (ExpressionImpl<?>)_exps.get(i);
- result = _op == BooleanOperator.AND
+ ExpressionFactory factory, MetamodelImpl model, CriteriaQueryImpl q) {
+ if (_exps == null || _exps.isEmpty())
+ return factory.emptyExpression();
+ if (_exps.size() == 1)
+ return ((ExpressionImpl<?>)_exps.get(0))
+ .toKernelExpression(factory, model, q);
+ ExpressionImpl<?> e1 = (ExpressionImpl<?>)_exps.get(0);
+ ExpressionImpl<?> e2 = (ExpressionImpl<?>)_exps.get(1);
+ org.apache.openjpa.kernel.exps.Expression ke1 =
+ e1.toKernelExpression(factory, model, q);
+ org.apache.openjpa.kernel.exps.Expression ke2 =
+ e2.toKernelExpression(factory, model, q);
+ org.apache.openjpa.kernel.exps.Expression result =
+ _op == BooleanOperator.AND
+ ? factory.and(ke1,ke2) : factory.or(ke1, ke2);
+
+ for (int i = 2; i < _exps.size(); i++) {
+ ExpressionImpl<?> e = (ExpressionImpl<?>)_exps.get(i);
+ result = _op == BooleanOperator.AND
? factory.and(result, e.toKernelExpression(factory, model, q))
- : factory.or(result, e.toKernelExpression(factory,model,q));
- }
- return _negated ? factory.not(result) : result;
+ : factory.or(result, e.toKernelExpression(factory,model,q));
+ }
+ return _negated ? factory.not(result) : result;
}
-
+
public static class And extends PredicateImpl {
- public And(Expression<Boolean> x, Expression<Boolean> y) {
- super(BooleanOperator.AND);
- add(x).add(y);
- }
-
- public And(Predicate...restrictions) {
- super(BooleanOperator.AND, restrictions);
- }
- }
-
+ public And(Expression<Boolean> x, Expression<Boolean> y) {
+ super(BooleanOperator.AND);
+ add(x).add(y);
+ }
+
+ public And(Predicate...restrictions) {
+ super(BooleanOperator.AND, restrictions);
+ }
+ }
+
public static class Or extends PredicateImpl {
- public Or(Expression<Boolean> x, Expression<Boolean> y) {
- super(BooleanOperator.OR);
- add(x).add(y);
- }
-
- public Or(Predicate...restrictions) {
- super(BooleanOperator.OR, restrictions);
- }
+ public Or(Expression<Boolean> x, Expression<Boolean> y) {
+ super(BooleanOperator.OR);
+ add(x).add(y);
+ }
+
+ public Or(Predicate...restrictions) {
+ super(BooleanOperator.OR, restrictions);
+ }
}
}
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/RootImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/RootImpl.java?rev=781621&r1=781620&r2=781621&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/RootImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/RootImpl.java Wed Jun 3 23:44:58 2009
@@ -19,13 +19,11 @@
package org.apache.openjpa.persistence.criteria;
-import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import javax.persistence.metamodel.Entity;
import org.apache.openjpa.kernel.exps.ExpressionFactory;
import org.apache.openjpa.kernel.exps.Value;
-import org.apache.openjpa.persistence.criteria.FromImpl;
import org.apache.openjpa.persistence.meta.MetamodelImpl;
import org.apache.openjpa.persistence.meta.Types;
@@ -37,8 +35,9 @@
* @param <X>
*/
public class RootImpl<X> extends FromImpl<X,X> implements Root<X> {
- private final Types.Entity<X> _entity;
-
+ private final Types.Entity<X> _entity;
+ private RootImpl<X> _correlatedParent;
+
public RootImpl(Types.Entity<X> type) {
super(type);
_entity = type;
@@ -48,13 +47,28 @@
return _entity;
}
+ public void setCorrelatedParent(RootImpl<X> correlatedParent) {
+ _correlatedParent = correlatedParent;
+ }
+
+ public RootImpl<X> getCorrelatedParent() {
+ return _correlatedParent;
+ }
+
/**
* Convert this path to a kernel path value.
*/
@Override
public Value toValue(ExpressionFactory factory, MetamodelImpl model,
- CriteriaQuery c) {
- Value var = factory.newPath();
+ CriteriaQueryImpl c) {
+ SubqueryImpl subquery = c.getContext();
+ Value var = null;
+ if (subquery != null && PathImpl.inSubquery(this, subquery)) {
+ org.apache.openjpa.kernel.exps.Subquery subQ =
+ subquery.getSubQ();
+ var = factory.newPath(subQ);
+ } else
+ var = factory.newPath();
var.setMetaData(_entity.meta);
return var;
}
@@ -65,7 +79,7 @@
*/
@Override
public org.apache.openjpa.kernel.exps.Expression toKernelExpression(
- ExpressionFactory factory, MetamodelImpl model, CriteriaQuery c) {
+ ExpressionFactory factory, MetamodelImpl model, CriteriaQueryImpl c) {
org.apache.openjpa.kernel.exps.Value path = toValue(factory, model, c);
Value var = factory.newBoundVariable(getAlias(),
@@ -73,6 +87,14 @@
org.apache.openjpa.kernel.exps.Expression exp =
factory.bindVariable(var, path);
- return exp;
+ if (_correlatedParent == null)
+ return exp;
+ org.apache.openjpa.kernel.exps.Value path1 =
+ _correlatedParent.toValue(factory, model, c);
+ org.apache.openjpa.kernel.exps.Expression equal =
+ factory.equal(path1, path);
+ //return factory.and(exp, equal);
+ return equal;
+
}
}
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=781621&r1=781620&r2=781621&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 Wed Jun 3 23:44:58 2009
@@ -21,13 +21,9 @@
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.
@@ -53,17 +49,4 @@
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;
- }
}
Added: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SubqueryImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SubqueryImpl.java?rev=781621&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SubqueryImpl.java (added)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SubqueryImpl.java Wed Jun 3 23:44:58 2009
@@ -0,0 +1,180 @@
+package org.apache.openjpa.persistence.criteria;
+
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.persistence.criteria.AbstractQuery;
+import javax.persistence.criteria.CollectionJoin;
+import javax.persistence.criteria.Expression;
+import javax.persistence.criteria.Join;
+import javax.persistence.criteria.ListJoin;
+import javax.persistence.criteria.MapJoin;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import javax.persistence.criteria.SetJoin;
+import javax.persistence.criteria.Subquery;
+import javax.persistence.metamodel.Entity;
+
+import org.apache.openjpa.kernel.exps.ExpressionFactory;
+import org.apache.openjpa.kernel.exps.Value;
+import org.apache.openjpa.meta.ClassMetaData;
+import org.apache.openjpa.persistence.meta.MetamodelImpl;
+import org.apache.openjpa.persistence.meta.Types;
+import org.apache.openjpa.kernel.exps.QueryExpressions;
+import org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder;
+
+
+public class SubqueryImpl<T> extends ExpressionImpl<T> implements Subquery<T> {
+ private final CriteriaQueryImpl _parent;
+ private final CriteriaQueryImpl _delegate;
+ private java.util.Set<Join<?,?>> _joins;
+ private Expression<T> _select;
+ private org.apache.openjpa.kernel.exps.Subquery _subq;
+
+ public SubqueryImpl(Class<T> cls, CriteriaQueryImpl parent) {
+ super(cls);
+ _parent = parent;
+ _delegate = new CriteriaQueryImpl(parent.getMetamodel());
+ _delegate.setContext(this);
+ }
+
+ public AbstractQuery getParent() {
+ return _parent;
+ }
+
+ public Subquery<T> select(Expression<T> expression) {
+ _select = expression;
+ _delegate.select(expression);
+ return this;
+ }
+
+ public Expression<T> getSelection() {
+ return _select;
+ }
+
+ public <X> Root<X> from(Entity<X> entity) {
+ return _delegate.from(entity);
+ }
+
+ public <X> Root<X> from(Class<X> entityClass) {
+ return _delegate.from(entityClass);
+ }
+
+ public Set<Root<?>> getRoots() {
+ return _delegate.getRoots();
+ }
+
+ public Root<?> getRoot() {
+ return _delegate.getRoot();
+ }
+
+ public Subquery<T> where(Expression<Boolean> restriction) {
+ _delegate.where(restriction);
+ return this;
+ }
+
+ public Subquery<T> where(Predicate... restrictions) {
+ _delegate.where(restrictions);
+ return this;
+ }
+
+ public Subquery<T> groupBy(Expression<?>... grouping) {
+ _delegate.groupBy(grouping);
+ return this;
+ }
+
+ public Subquery<T> having(Expression<Boolean> restriction) {
+ _delegate.having(restriction);
+ return this;
+ }
+
+ public Subquery<T> having(Predicate... restrictions) {
+ _delegate.having(restrictions);
+ return this;
+ }
+
+ public Subquery<T> distinct(boolean distinct) {
+ _delegate.distinct(distinct);
+ return this;
+ }
+
+ public List<Expression<?>> getGroupList() {
+ return _delegate.getGroupList();
+ }
+
+ public Predicate getRestriction() {
+ return _delegate.getRestriction();
+ }
+
+ public Predicate getGroupRestriction() {
+ return _delegate.getGroupRestriction();
+ }
+
+ public boolean isDistinct() {
+ return _delegate.isDistinct();
+ }
+
+ public <U> Subquery<U> subquery(Class<U> type) {
+ return new SubqueryImpl<U>(type, _delegate);
+ }
+
+ public <Y> Root<Y> correlate(Root<Y> root) {
+ Types.Entity<Y> entity =
+ (Types.Entity<Y>)((RootImpl<Y>)root).getModel();
+ RootImpl<Y> corrRoot = new RootImpl<Y>(entity);
+ corrRoot.setCorrelatedParent((RootImpl<Y>)root);
+ Set<Root<?>> roots = getRoots();
+ if (roots == null) {
+ roots = new LinkedHashSet<Root<?>>();
+ _delegate.setRoots(roots);
+ }
+ roots.add(corrRoot);
+ return corrRoot;
+ }
+
+ public <X,Y> Join<X,Y> correlate(Join<X,Y> join) {
+ return join;
+ }
+ public <X,Y> CollectionJoin<X,Y> correlate(CollectionJoin<X,Y> join) {
+ return join;
+ }
+ public <X,Y> SetJoin<X,Y> correlate(SetJoin<X,Y> join) {
+ return join;
+ }
+ public <X,Y> ListJoin<X,Y> correlate(ListJoin<X,Y> join) {
+ return join;
+ }
+ public <X,K,V> MapJoin<X,K,V> correlate(MapJoin<X,K,V> join) {
+ return join;
+ }
+
+ public java.util.Set<Join<?, ?>> getJoins() {
+ return _joins;
+ }
+
+ public org.apache.openjpa.kernel.exps.Subquery getSubQ() {
+ return _subq;
+ }
+
+ /**
+ * Convert this path to a kernel path value.
+ */
+ @Override
+ public Value toValue(ExpressionFactory factory, MetamodelImpl model,
+ CriteriaQueryImpl q) {
+ final boolean subclasses = true;
+ CriteriaExpressionBuilder queryEval = q.getExprBuilder();
+ String alias = queryEval.nextAlias();
+ ClassMetaData candidate =
+ ((Types.Managed<?>)getRoot().getModel()).meta;
+ _subq = factory.newSubquery(candidate, subclasses, alias);
+ _subq.setMetaData(candidate);
+ QueryExpressions subexp = q.getExprBuilder().
+ getQueryExpressions(factory, _delegate);
+ _subq.setQueryExpressions(subexp);
+ if (subexp.projections.length > 0)
+ JPQLExpressionBuilder.checkEmbeddable(subexp.projections[0], null);
+ return _subq;
+ }
+}
Propchange: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SubqueryImpl.java
------------------------------------------------------------------------------
svn:eol-style = native