You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by pc...@apache.org on 2006/10/31 10:43:44 UTC

svn commit: r469429 - in /incubator/openjpa/trunk: openjpa-kernel/src/main/java/org/apache/openjpa/datacache/ openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/ openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/datacache/ ...

Author: pcl
Date: Tue Oct 31 01:43:43 2006
New Revision: 469429

URL: http://svn.apache.org/viewvc?view=rev&rev=469429
Log:
made in-mem match queries fail faster; added another test case for new  DataCacheStoreManager work

Added:
    incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestInMemoryQueryMatchEscapes.java   (with props)
Modified:
    incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/DataCacheStoreManager.java
    incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/MatchesExpression.java
    incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/datacache/TestDataCacheOptimisticLockRecovery.java

Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/DataCacheStoreManager.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/DataCacheStoreManager.java?view=diff&rev=469429&r1=469428&r2=469429
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/DataCacheStoreManager.java (original)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/DataCacheStoreManager.java Tue Oct 31 01:43:43 2006
@@ -578,10 +578,11 @@
             switch (compareVersion(sm, sm.getVersion(), data.getVersion())) {
                 case StoreManager.VERSION_LATER:
                 case StoreManager.VERSION_SAME:
-                    // This tx's current version is later than the data cache 
-                    // version. In this case, the commit should have succeeded. 
-                    // Remove the instance from cache in the hopes that the 
-                    // cache is out of sync.
+                    // This tx's current version is later than or the same as 
+                    // the data cache version. In this case, the commit should 
+                    // have succeeded from the standpoint of the cache. Remove 
+                    // the instance from cache in the hopes that the cache is 
+                    // out of sync.
                     remove = true;
                     break;
                 case StoreManager.VERSION_EARLIER:

Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/MatchesExpression.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/MatchesExpression.java?view=diff&rev=469429&r1=469428&r2=469429
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/MatchesExpression.java (original)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/MatchesExpression.java Tue Oct 31 01:43:43 2006
@@ -15,6 +15,7 @@
  */
 package org.apache.openjpa.kernel.exps;
 
+import org.apache.openjpa.lib.util.Localizer;
 import org.apache.openjpa.lib.util.SimpleRegex;
 import serp.util.Strings;
 
@@ -26,9 +27,11 @@
 class MatchesExpression
     extends CompareExpression {
 
+    private static final Localizer _loc = Localizer.forPackage(
+        MatchesExpression.class);
+    
     private final String _single;
     private final String _multi;
-    private final String _escape; // ### in-memory queries are not using escapes
     private final boolean _affirmation;
 
     /**
@@ -39,7 +42,9 @@
         super(val1, val2);
         _single = single;
         _multi = multi;
-        _escape = escape;
+        if (escape != null)
+            throw new IllegalArgumentException(_loc.get(
+                "escape-for-inmem-query-not-supported").getMessage());
         _affirmation = affirmation;
     }
 

Modified: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/datacache/TestDataCacheOptimisticLockRecovery.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/datacache/TestDataCacheOptimisticLockRecovery.java?view=diff&rev=469429&r1=469428&r2=469429
==============================================================================
--- incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/datacache/TestDataCacheOptimisticLockRecovery.java (original)
+++ incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/datacache/TestDataCacheOptimisticLockRecovery.java Tue Oct 31 01:43:43 2006
@@ -20,6 +20,7 @@
     extends TestCase {
 
     private EntityManagerFactory emf;
+    private int pk;
 
     public void setUp() {
         Map options = new HashMap();
@@ -38,7 +39,16 @@
         EntityManager em = emf.createEntityManager();
         em.getTransaction().begin();
         em.createQuery("delete from OptimisticLockInstance");
-        em.getTransaction().commit();
+
+        OptimisticLockInstance oli = new OptimisticLockInstance("foo");
+        try {
+            em.persist(oli);
+            em.getTransaction().commit();
+        } finally {
+            if (em.getTransaction().isActive())
+                em.getTransaction().rollback();
+        }
+        pk = oli.getPK();
         em.close();
     }
 
@@ -51,26 +61,12 @@
 
         EntityManager em;
         
-        // 1. get the instance into the cache via this insert
-        em = emf.createEntityManager();
-        em.getTransaction().begin();
-        OptimisticLockInstance oli = new OptimisticLockInstance("foo");
-        try {
-            em.persist(oli);
-            em.getTransaction().commit();
-        } finally {
-            if (em.getTransaction().isActive())
-                em.getTransaction().rollback();
-        }
-        int pk = oli.getPK();
-        em.close();
-        
-        // 2. get the oplock value for the instance after commit and
+        // 1. get the oplock value for the instance after commit and
         // get a read lock to ensure that we check for the optimistic
         // lock column at tx commit.
         em = emf.createEntityManager();
         em.getTransaction().begin();
-        oli = em.find(OptimisticLockInstance.class, pk);
+        OptimisticLockInstance oli = em.find(OptimisticLockInstance.class, pk);
         int firstOpLockValue = oli.getOpLock();
         em.lock(oli, LockModeType.READ);
 
@@ -126,6 +122,33 @@
         } finally {
             if (em.getTransaction().isActive())
                 em.getTransaction().rollback();
+        }
+        em.close();
+    }
+    
+    public void testExpectedOptimisticLockException() {
+        EntityManager em;
+        
+        // 1. start a new tx
+        em = emf.createEntityManager();
+        em.getTransaction().begin();
+        em.lock(em.find(OptimisticLockInstance.class, pk), LockModeType.READ);
+        
+        // 2. start another tx, and cause a version increment
+        EntityManager em2 = emf.createEntityManager();
+        em2.getTransaction().begin();
+        em2.lock(em2.find(OptimisticLockInstance.class, pk), 
+            LockModeType.WRITE);
+        em2.getTransaction().commit();
+        em2.close();
+        
+        // 3. try to commit. this should fail, as this is a regular optimistic
+        // lock failure situation.
+        try {
+            em.getTransaction().commit();
+            fail("write lock in em2 should trigger an optimistic lock failure");
+        } catch (RollbackException pe) {
+            // expected
         }
         em.close();
     }

Added: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestInMemoryQueryMatchEscapes.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestInMemoryQueryMatchEscapes.java?view=auto&rev=469429
==============================================================================
--- incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestInMemoryQueryMatchEscapes.java (added)
+++ incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestInMemoryQueryMatchEscapes.java Tue Oct 31 01:43:43 2006
@@ -0,0 +1,66 @@
+package org.apache.openjpa.persistence.query;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.persistence.FlushModeType;
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+
+import org.apache.openjpa.persistence.OpenJPAQuery;
+import org.apache.openjpa.persistence.simple.AllFieldTypes;
+
+import junit.framework.TestCase;
+
+public class TestInMemoryQueryMatchEscapes
+    extends TestCase {
+
+    private EntityManagerFactory emf;
+
+    public void setUp() {
+        Map options = new HashMap();
+
+        // ensure that OpenJPA knows about our type, so that 
+        // auto-schema-creation works
+        options.put("openjpa.MetaDataFactory",
+            "jpa(Types=" + AllFieldTypes.class.getName() + ")");
+
+        emf = Persistence.createEntityManagerFactory("test", options);
+    }
+    
+    public void testDatabaseEscape() {
+        OpenJPAQuery q = escapeHelper(false);
+        q.setFlushMode(FlushModeType.AUTO);
+        q.getEntityManager().flush();
+        AllFieldTypes aft = (AllFieldTypes) q.getSingleResult();
+        assertEquals("foo_bar", aft.getStringField());
+        q.getEntityManager().getTransaction().rollback();
+    }
+    
+    public void testInMemoryEscape() {
+        OpenJPAQuery q = escapeHelper(true);
+        q.setFlushMode(FlushModeType.COMMIT);
+        try {
+            q.getSingleResult();
+            fail("OpenJPA doesn't support escape syntax for in-mem queries");
+        } catch (Exception e) {
+            // expected
+        }
+    }
+    
+    private OpenJPAQuery escapeHelper(boolean inMem) {
+        EntityManager em = emf.createEntityManager();
+        em.getTransaction().begin();
+        AllFieldTypes aft = new AllFieldTypes();
+        aft.setStringField("foo_bar");
+        em.persist(aft);
+        aft = new AllFieldTypes();
+        aft.setStringField("foozbar");
+        em.persist(aft);
+
+        return (OpenJPAQuery) em.createQuery(
+            "select e from AllFieldTypes e where e.stringField " +
+            "like 'foox_bar' escape 'x'");
+    }
+}

Propchange: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestInMemoryQueryMatchEscapes.java
------------------------------------------------------------------------------
    svn:executable = *