You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by cu...@apache.org on 2010/07/30 23:02:05 UTC

svn commit: r980963 - in /openjpa/trunk: openjpa-kernel/src/main/java/org/apache/openjpa/datacache/QueryCacheStoreQuery.java openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/TestQueryTimestampEviction.java

Author: curtisr7
Date: Fri Jul 30 21:02:04 2010
New Revision: 980963

URL: http://svn.apache.org/viewvc?rev=980963&view=rev
Log:
OPENJPA-1727: Fix QueryCache eviction when returning an empty result and using the TIMESTAMP eviction policy.

Modified:
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/QueryCacheStoreQuery.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/TestQueryTimestampEviction.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=980963&r1=980962&r2=980963&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 Fri Jul 30 21:02:04 2010
@@ -124,11 +124,11 @@ public class QueryCacheStoreQuery
         // get the cached data
         QueryResult res = _cache.get(qk);
 
-        if (res == null)
-            return null;        
-        if (res.isEmpty())
-            return Collections.emptyList();
-
+        
+        if (res == null) {
+            return null;
+        }
+               
         // this if block is invoked if the evictOnTimestamp is set to true
         if (_cache instanceof AbstractQueryCache) {
             AbstractQueryCache qcache = (AbstractQueryCache) _cache;
@@ -152,6 +152,10 @@ public class QueryCacheStoreQuery
                 }
             }
         }
+      
+        if (res.isEmpty()) {
+            return Collections.emptyList();
+        }
 
         int projs = getContext().getProjectionAliases().length;
         if (projs == 0) {

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/TestQueryTimestampEviction.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/TestQueryTimestampEviction.java?rev=980963&r1=980962&r2=980963&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/TestQueryTimestampEviction.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/TestQueryTimestampEviction.java Fri Jul 30 21:02:04 2010
@@ -18,22 +18,64 @@
  */
 package org.apache.openjpa.persistence.jdbc.query.cache;
 
-import java.util.Collections;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.Query;
 
 import org.apache.openjpa.datacache.ConcurrentQueryCache;
 import org.apache.openjpa.datacache.QueryCache;
-import org.apache.openjpa.datacache.TypesChangedEvent;
 import org.apache.openjpa.datacache.AbstractQueryCache.EvictPolicy;
 import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
+import org.apache.openjpa.lib.jdbc.AbstractJDBCListener;
+import org.apache.openjpa.lib.jdbc.JDBCEvent;
+import org.apache.openjpa.lib.jdbc.JDBCListener;
+import org.apache.openjpa.persistence.OpenJPAEntityManagerSPI;
+import org.apache.openjpa.persistence.embed.attrOverrides.TestAssocOverridesXML.SQLListener;
 
 public class TestQueryTimestampEviction extends AbstractQueryCacheTest {
+    private List<String> _sql = new ArrayList<String>();
+    
     public void setUp() throws Exception {
         super.setUp(
                 "openjpa.DataCache", "true",
                 "openjpa.QueryCache", "true(CacheSize=1000, EvictPolicy='timestamp')",
-                "openjpa.RemoteCommitProvider", "sjvm");
+                "openjpa.RemoteCommitProvider", "sjvm",
+                "openjpa.jdbc.JDBCListeners",new JDBCListener[] { new SQLListener() });
     }
 
+    public void testEmptyResultTimeout() {
+        // Not all databases support GenerationType.IDENTITY column(s)
+        if (!((JDBCConfiguration) emf.getConfiguration()).getDBDictionaryInstance().supportsAutoAssign) {
+            return;
+        }
+        OpenJPAEntityManagerSPI em = emf.createEntityManager();
+        String query = "select p from PartBase p where p.cost > ?1";
+        // execute a query that needs to return zero results
+        Query q = em.createQuery(query);
+        q.setParameter(1, 100000);
+        List l = q.getResultList();
+        assertEquals(0, l.size());     
+
+        // Create a new Entity that has the PartBase accesspath. Has a newer timestamp than our query
+        em.getTransaction().begin();
+        em.persist(new PartBase());
+        em.getTransaction().commit();
+
+        // Make sure that our sql listener is working
+        assertTrue(_sql.size() > 0);
+        _sql.clear();
+        
+        q = em.createQuery(query);
+        q.setParameter(1, 100000);
+        q.getResultList();
+        
+        // Make sure that we execute sql. This means that the query was properly kicked out of the cache.
+        assertEquals(1, _sql.size());
+        em.close();
+
+    }
+    
     /**
      * Verify that the persistent unit property configuration is enabling
      * the TIMESTAMP Eviction Policy.
@@ -87,5 +129,15 @@ public class TestQueryTimestampEviction 
             fail("The thread is still waiting on a writeLock()!");
         }
     }
+
+    public class SQLListener extends AbstractJDBCListener {
+
+        @Override
+        public void beforeExecuteStatement(JDBCEvent event) {
+            if (event.getSQL() != null && _sql != null) {
+                _sql.add(event.getSQL());
+            }
+        }
+    }
 }