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.
      */