You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by pp...@apache.org on 2009/12/23 10:33:30 UTC
svn commit: r893447 - in /openjpa/trunk:
openjpa-kernel/src/main/java/org/apache/openjpa/datacache/
openjpa-kernel/src/main/java/org/apache/openjpa/kernel/
openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/
openjpa-persistence/src/main/java/o...
Author: ppoddar
Date: Wed Dec 23 09:33:28 2009
New Revision: 893447
URL: http://svn.apache.org/viewvc?rev=893447&view=rev
Log:
OPENJPA-1444: distinct query
Modified:
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/QueryCacheStoreQuery.java
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractStoreQuery.java
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DelegatingQuery.java
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ExpressionStoreQuery.java
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryContext.java
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryImpl.java
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/QueryExpressions.java
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaExpressionBuilder.java
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java
Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/QueryCacheStoreQuery.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/QueryCacheStoreQuery.java?rev=893447&r1=893446&r2=893447&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/QueryCacheStoreQuery.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/QueryCacheStoreQuery.java Wed Dec 23 09:33:28 2009
@@ -464,6 +464,10 @@
return _ex.isAggregate(unwrap(q));
}
+ public boolean isDistinct(StoreQuery q) {
+ return _ex.isDistinct(unwrap(q));
+ }
+
public boolean hasGrouping(StoreQuery q) {
return _ex.hasGrouping(unwrap(q));
}
Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractStoreQuery.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractStoreQuery.java?rev=893447&r1=893446&r2=893447&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractStoreQuery.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractStoreQuery.java Wed Dec 23 09:33:28 2009
@@ -184,6 +184,10 @@
public boolean isAggregate(StoreQuery q) {
return false;
}
+
+ public boolean isDistinct(StoreQuery q) {
+ return false;
+ }
public boolean hasGrouping(StoreQuery q) {
return false;
Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DelegatingQuery.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DelegatingQuery.java?rev=893447&r1=893446&r2=893447&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DelegatingQuery.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DelegatingQuery.java Wed Dec 23 09:33:28 2009
@@ -343,15 +343,6 @@
}
}
- public void setDistinct(boolean distinct) {
- try {
- _query.setDistinct(distinct);
- } catch (RuntimeException re) {
- throw translate(re);
- }
- }
-
-
public Class getResultType() {
try {
return _query.getResultType();
Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ExpressionStoreQuery.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ExpressionStoreQuery.java?rev=893447&r1=893446&r2=893447&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ExpressionStoreQuery.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ExpressionStoreQuery.java Wed Dec 23 09:33:28 2009
@@ -382,6 +382,10 @@
public final boolean isAggregate(StoreQuery q) {
return assertQueryExpression().isAggregate();
}
+
+ public final boolean isDistinct(StoreQuery q) {
+ return assertQueryExpression().isDistinct();
+ }
public final boolean hasGrouping(StoreQuery q) {
return assertQueryExpression().grouping.length > 0;
Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryContext.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryContext.java?rev=893447&r1=893446&r2=893447&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryContext.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryContext.java Wed Dec 23 09:33:28 2009
@@ -126,13 +126,6 @@
*/
public boolean isDistinct();
- /**
- * Specify that the query will return distinct instances.
- *
- * @since 2.0.0
- */
- public void setDistinct(boolean distinct);
-
/**
* Scope of a mapping from the result data to its object representation.
Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryImpl.java?rev=893447&r1=893446&r2=893447&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryImpl.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryImpl.java Wed Dec 23 09:33:28 2009
@@ -119,7 +119,6 @@
// these fields should only be used directly after we have a compilation,
// because their values may be encoded in the query string
private Boolean _unique = null;
- private boolean _distinct = false;
private Class<?> _resultClass = null;
private transient long _startIdx = 0;
private transient long _endIdx = Long.MAX_VALUE;
@@ -472,27 +471,6 @@
}
/**
- * Sets this query to return distinct result.
- */
- public void setDistinct(boolean flag) {
- lock();
- try {
- assertOpen();
- // allowed modification: no read-only check
- _distinct = flag;
- } finally {
- unlock();
- }
- }
-
- /**
- * Affirms if this query will return distinct elements.
- */
- public boolean isDistinct() {
- return _distinct;
- }
-
- /**
* Affirms if this query has originated by parsing a string-based query.
*/
public boolean isParsedQuery() {
@@ -1548,6 +1526,16 @@
unlock();
}
}
+
+ public boolean isDistinct() {
+ lock();
+ try {
+ return compileForExecutor().isDistinct(_storeQuery);
+ } finally {
+ unlock();
+ }
+ }
+
public boolean hasGrouping() {
lock();
@@ -2014,6 +2002,10 @@
q.getContext().getCandidateType(),
q.getContext().getQueryString()));
}
+
+ public boolean isDistinct(StoreQuery q) {
+ return _executors[0].isDistinct(q);
+ }
public int getOperation(StoreQuery q) {
return _executors[0].getOperation(q);
Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/QueryExpressions.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/QueryExpressions.java?rev=893447&r1=893446&r2=893447&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/QueryExpressions.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/QueryExpressions.java Wed Dec 23 09:33:28 2009
@@ -105,6 +105,10 @@
? Boolean.TRUE : Boolean.FALSE;
return _aggregate.booleanValue();
}
+
+ public boolean isDistinct() {
+ return distinct != DISTINCT_FALSE;
+ }
/**
* Add an update.
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaExpressionBuilder.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaExpressionBuilder.java?rev=893447&r1=893446&r2=893447&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaExpressionBuilder.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaExpressionBuilder.java Wed Dec 23 09:33:28 2009
@@ -168,12 +168,8 @@
}
protected void evalDistinct(QueryExpressions exps, ExpressionFactory factory, CriteriaQueryImpl<?> q) {
- if (q.hasFetchJoins()) {
- exps.distinct = QueryExpressions.DISTINCT_FALSE;
- } else {
- exps.distinct = q.isDistinct() ? QueryExpressions.DISTINCT_TRUE | QueryExpressions.DISTINCT_AUTO
- : QueryExpressions.DISTINCT_FALSE;
- }
+ exps.distinct = q.isDistinct() ? QueryExpressions.DISTINCT_TRUE | QueryExpressions.DISTINCT_AUTO
+ : QueryExpressions.DISTINCT_FALSE;
}
protected void evalCrossJoinRoots(QueryExpressions exps, ExpressionFactory factory, CriteriaQueryImpl<?> q) {
@@ -267,7 +263,6 @@
selections = new ArrayList<Selection<?>>(1);
selections.add(r);
}
- boolean usingFetchJoin = q.hasFetchJoins();
for (Selection<?> s : selections) {
if (s.isCompoundSelection()) {
getProjections(exps, s.getCompoundSelectionItems(), projections, aliases,
@@ -275,8 +270,6 @@
} else {
Value val = (exp2Vals != null && exp2Vals.containsKey(s)
? exp2Vals.get(s) : ((ExpressionImpl<?>)s).toValue(factory, q));
- if (q.isDistinct() && usingFetchJoin)
- val = factory.distinct(val);
String alias = s.getAlias();
val.setAlias(alias);
projections.add(val);
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=893447&r1=893446&r2=893447&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 Wed Dec 23 09:33:28 2009
@@ -649,17 +649,6 @@
}
}
- boolean hasFetchJoins() {
- Set<Root<?>> roots = getRoots();
- if (roots == null || roots.isEmpty())
- return false;
- for (Root<?> root : roots) {
- if (!root.getFetches().isEmpty())
- return true;
- }
- return false;
- }
-
/**
* Gets the string representation of the query.
*/