diff --git a/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/QueryCacheStoreQuery.java b/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/QueryCacheStoreQuery.java index 119d0731f..904b6582e 100644 --- a/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/QueryCacheStoreQuery.java +++ b/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/QueryCacheStoreQuery.java @@ -464,6 +464,10 @@ public class QueryCacheStoreQuery 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)); } diff --git a/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractStoreQuery.java b/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractStoreQuery.java index ecf5199c2..2abe5de0e 100644 --- a/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractStoreQuery.java +++ b/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractStoreQuery.java @@ -184,6 +184,10 @@ public abstract class AbstractStoreQuery public boolean isAggregate(StoreQuery q) { return false; } + + public boolean isDistinct(StoreQuery q) { + return false; + } public boolean hasGrouping(StoreQuery q) { return false; diff --git a/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DelegatingQuery.java b/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DelegatingQuery.java index ed4467edb..cc81bd183 100644 --- a/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DelegatingQuery.java +++ b/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DelegatingQuery.java @@ -343,15 +343,6 @@ public class DelegatingQuery } } - public void setDistinct(boolean distinct) { - try { - _query.setDistinct(distinct); - } catch (RuntimeException re) { - throw translate(re); - } - } - - public Class getResultType() { try { return _query.getResultType(); diff --git a/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ExpressionStoreQuery.java b/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ExpressionStoreQuery.java index 09d6b4419..475b5351d 100644 --- a/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ExpressionStoreQuery.java +++ b/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ExpressionStoreQuery.java @@ -382,6 +382,10 @@ public class ExpressionStoreQuery 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; diff --git a/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryContext.java b/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryContext.java index 050d01199..1869b541d 100644 --- a/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryContext.java +++ b/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryContext.java @@ -126,13 +126,6 @@ public interface QueryContext { */ 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. diff --git a/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryImpl.java b/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryImpl.java index d86612a8e..e2e42b63d 100644 --- a/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryImpl.java +++ b/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryImpl.java @@ -119,7 +119,6 @@ public class QueryImpl // 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; @@ -471,27 +470,6 @@ public class QueryImpl } } - /** - * 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. */ @@ -1548,6 +1526,16 @@ public class QueryImpl unlock(); } } + + public boolean isDistinct() { + lock(); + try { + return compileForExecutor().isDistinct(_storeQuery); + } finally { + unlock(); + } + } + public boolean hasGrouping() { lock(); @@ -2014,6 +2002,10 @@ public class QueryImpl 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); diff --git a/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/QueryExpressions.java b/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/QueryExpressions.java index 79c9ae00f..41e7f0f25 100644 --- a/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/QueryExpressions.java +++ b/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/QueryExpressions.java @@ -105,6 +105,10 @@ public class QueryExpressions ? Boolean.TRUE : Boolean.FALSE; return _aggregate.booleanValue(); } + + public boolean isDistinct() { + return distinct != DISTINCT_FALSE; + } /** * Add an update. diff --git a/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaExpressionBuilder.java b/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaExpressionBuilder.java index 47a1be148..b4e250460 100644 --- a/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaExpressionBuilder.java +++ b/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaExpressionBuilder.java @@ -168,12 +168,8 @@ class CriteriaExpressionBuilder { } 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 @@ class CriteriaExpressionBuilder { selections = new ArrayList>(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 @@ class CriteriaExpressionBuilder { } 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); diff --git a/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java b/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java index 421c8c8ee..91664be98 100644 --- a/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java +++ b/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java @@ -649,17 +649,6 @@ class CriteriaQueryImpl implements OpenJPACriteriaQuery, AliasContext { } } - boolean hasFetchJoins() { - Set> 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. */