Author: faywang
Date: Thu Nov  4 21:03:23 2010
New Revision: 1031244

URL: http://svn.apache.org/viewvc?rev=1031244&view=rev
Log:
OPENJPA-1810: make QueryKey distinguishable for CriteriaQuery

Modified:
    
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/QueryCacheStoreQuery.java
    
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/QueryKey.java
    
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestCriteria.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=1031244&r1=1031243&r2=1031244&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
 Thu Nov  4 21:03:23 2010
@@ -331,9 +331,10 @@ public class QueryCacheStoreQuery
         public ResultObjectProvider executeQuery(StoreQuery q, Object[] params,
             Range range) {
             QueryCacheStoreQuery cq = (QueryCacheStoreQuery) q;
+            Object parsed = cq.getDelegate().newCompilation();
             QueryKey key = QueryKey.newInstance(cq.getContext(),
                 _ex.isPacking(q), params, _candidate, _subs, range.start, 
-                range.end);
+                range.end, parsed);
             List<Object> cached = cq.checkCache(key);
             if (cached != null)
                 return new ListResultObjectProvider(cached);

Modified: 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/QueryKey.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/QueryKey.java?rev=1031244&r1=1031243&r2=1031244&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/QueryKey.java
 (original)
+++ 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/QueryKey.java
 Thu Nov  4 21:03:23 2010
@@ -89,7 +89,7 @@ public class QueryKey
     private String _candidateClassName;
     private boolean _subclasses;
     private Set _accessPathClassNames;
-    private String _query;
+    private Object _query;
     private boolean _ignoreChanges;
     private Map _params;
     private long _rangeStart;
@@ -117,7 +117,7 @@ public class QueryKey
         // via API calls (candidate class, result class, etc)
         q.compile();
         return newInstance(q, false, args, q.getCandidateType(),
-            q.hasSubclasses(), q.getStartRange(), q.getEndRange());
+            q.hasSubclasses(), q.getStartRange(), q.getEndRange(), null);
     }
 
     /**
@@ -128,15 +128,15 @@ public class QueryKey
         // via API calls (candidate class, result class, etc)
         q.compile();
         return newInstance(q, false, args, q.getCandidateType(),
-            q.hasSubclasses(), q.getStartRange(), q.getEndRange());
+            q.hasSubclasses(), q.getStartRange(), q.getEndRange(), null);
     }
 
     /**
      * Return a key for the given query, or null if it is not cacheable.
      */
     static QueryKey newInstance(QueryContext q, boolean packed, Object[] args,
-        Class candidate, boolean subs, long startIdx, long endIdx) {
-        QueryKey key = createKey(q, packed, candidate, subs, startIdx, endIdx);
+        Class candidate, boolean subs, long startIdx, long endIdx, Object 
parsed) {
+        QueryKey key = createKey(q, packed, candidate, subs, startIdx, endIdx, 
parsed);
         if (key != null && setParams(key, q, args))
             return key;
         return null;
@@ -146,8 +146,8 @@ public class QueryKey
      * Return a key for the given query, or null if it is not cacheable.
      */
     static QueryKey newInstance(QueryContext q, boolean packed, Map args,
-        Class candidate, boolean subs, long startIdx, long endIdx) {
-        QueryKey key = createKey(q, packed, candidate, subs, startIdx, endIdx);
+        Class candidate, boolean subs, long startIdx, long endIdx, Object 
parsed) {
+        QueryKey key = createKey(q, packed, candidate, subs, startIdx, endIdx, 
parsed);
         if (key != null && (args == null || args.isEmpty() ||
             setParams(key, q.getStoreContext(), new HashMap(args))))
             return key;
@@ -160,7 +160,7 @@ public class QueryKey
      * class, query filter, etc.
      */
     private static QueryKey createKey(QueryContext q, boolean packed,
-        Class candidateClass, boolean subclasses, long startIdx, long endIdx) {
+        Class candidateClass, boolean subclasses, long startIdx, long endIdx, 
Object parsed) {
         if (candidateClass == null)
             return null;
 
@@ -245,6 +245,10 @@ public class QueryKey
         key._accessPathClassNames = accessPathClassNames;
         key._timeout = timeout;
         key._query = q.getQueryString();
+        if (key._query == null) {
+            // this can be a criteria query
+            key._query = parsed;
+        }
         key._ignoreChanges = q.getIgnoreChanges();
         key._rangeStart = startIdx;
         key._rangeEnd = endIdx;
@@ -408,7 +412,7 @@ public class QueryKey
             && _ignoreChanges == other._ignoreChanges
             && _rangeStart == other._rangeStart
             && _rangeEnd == other._rangeEnd
-            && StringUtils.equals(_query, other._query)
+            && ObjectUtils.equals(_query, other._query)
             && ObjectUtils.equals(_params, other._params);
     }
 

Modified: 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestCriteria.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestCriteria.java?rev=1031244&r1=1031243&r2=1031244&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestCriteria.java
 (original)
+++ 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestCriteria.java
 Thu Nov  4 21:03:23 2010
@@ -21,7 +21,12 @@ package org.apache.openjpa.persistence.c
 
 import java.util.List;
 
+import javax.persistence.EntityManager;
 import javax.persistence.Query;
+import javax.persistence.TypedQuery;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Root;
 
 import org.apache.openjpa.persistence.OpenJPAEntityManager;
 import org.apache.openjpa.persistence.query.DomainObject;
@@ -57,6 +62,8 @@ public class TestCriteria extends Single
     public void setUp() {
             super.setUp(CLEAR_TABLES,
                     "openjpa.DynamicEnhancementAgent", "false",
+                    "openjpa.DataCache","true",
+                    "openjpa.QueryCache","true",
                     Account.class,
                     Address.class,
                     A.class,
@@ -233,6 +240,28 @@ public class TestCriteria extends Single
         compare(jpql, d);
     }
     
+    public void testCount() {
+        
+        EntityManager em = emf.createEntityManager();
+        em.getTransaction().begin();
+        for(int i = 0;i<50;i++)
+            em.persist(new Department());
+        em.getTransaction().commit();
+        
+        CriteriaBuilder cb = em.getCriteriaBuilder();
+        CriteriaQuery<Department> q = cb.createQuery(Department.class);
+        Root<Department> book = q.from(Department.class);
+        TypedQuery<Department> dept = em.createQuery(q);
+        int size = dept.getResultList().size();
+
+        CriteriaQuery<Long> c = cb.createQuery(Long.class);
+        Root<?> from = c.from(Department.class);
+        c.select(cb.count(from));
+        TypedQuery<Long> query = em.createQuery(c);
+        long count = query.getSingleResult();
+        assertEquals(size, count);
+    }
+    
     public void testGeneralCase() {
         DomainObject e = qb.createQueryDefinition(Employee.class);
         e.where(e.get("department").get("name").equal("Engineering"));

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=1031244&r1=1031243&r2=1031244&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
 Thu Nov  4 21:03:23 2010
@@ -724,4 +724,10 @@ class CriteriaQueryImpl<T> implements Op
             return super.toString();
         }
     }
+    
+    public boolean equals(Object other) {
+        if (toString().equals(other.toString()))
+            return true;
+        return false;
+    }
 }


Reply via email to