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

svn commit: r979326 - in /openjpa/trunk: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLBuffer.java openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/TestPreparedQueryCache.java

Author: fancy
Date: Mon Jul 26 15:30:20 2010
New Revision: 979326

URL: http://svn.apache.org/viewvc?rev=979326&view=rev
Log:
OPENJPA-1719: Prepared SQL cache user parameter ordering problem with subqueries.

Modified:
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLBuffer.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/TestPreparedQueryCache.java

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLBuffer.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLBuffer.java?rev=979326&r1=979325&r2=979326&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLBuffer.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLBuffer.java Mon Jul 26 15:30:20 2010
@@ -166,13 +166,11 @@ public final class SQLBuffer
                         _userParams = new ArrayList();
                     _userParams.addAll(paramIndex, buf._userParams);
                 }
-                 if (buf._userIndex != null) {
-                     if (_userIndex == null) {
+                if (buf._userIndex != null) {
+                     if (_userIndex == null)
                          _userIndex = new ArrayList();
-                         _userIndex.addAll(buf._userIndex);
-                     } else
-                         _userIndex.addAll(paramIndex*2, buf._userIndex);
-                 }
+                     _userIndex.addAll(buf._userIndex);
+                }
                 if (buf._cols != null)
                     _cols.addAll(paramIndex, buf._cols);
                 else if (_cols != null)

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/TestPreparedQueryCache.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/TestPreparedQueryCache.java?rev=979326&r1=979325&r2=979326&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/TestPreparedQueryCache.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/TestPreparedQueryCache.java Mon Jul 26 15:30:20 2010
@@ -47,7 +47,6 @@ import org.apache.openjpa.persistence.Op
 import org.apache.openjpa.persistence.OpenJPAPersistence;
 import org.apache.openjpa.persistence.OpenJPAQuery;
 import org.apache.openjpa.persistence.jdbc.sqlcache.Employee.Category;
-import org.apache.openjpa.persistence.test.AllowFailure;
 
 /**
  * Tests correctness and performance of queries with and without Prepared Query Cacheing.
@@ -846,8 +845,7 @@ public class TestPreparedQueryCache exte
         assertFalse(book2.getAuthors().isEmpty());
     }
 
-    @AllowFailure(message="We have problems with reparametrization of subquery + constant literals")
-    public void xtestQueryWithUserDefinedAndInternalParamtersInSubquery() {
+    public void testQueryWithUserDefinedAndInternalParamtersInSubquery() {
         String jpql = "Select a From Address a Where Not Exists ("
             + "     Select s.id From Singer As s Where "
             + "        s.address = a  And "
@@ -977,6 +975,34 @@ public class TestPreparedQueryCache exte
        assertFalse(q2.getResultList().isEmpty());
     }
     
+    public void testSubqueryParameters() {
+        EntityManager em = emf.createEntityManager();
+        String query = "select e from Employee e "
+            + "inner join e.department d "
+            + "inner join d.company c "
+            + "where mod(c.startYear, 100) = 0 "
+            + "and exists (select e2 from Employee e2 "
+                + "inner join e2.department d2 "
+                + "inner join d2.company c2 "
+                + "where e2.address.city = e.address.city "
+                + "and e2.isManager = false "
+                + "and d2.name = d.name "
+                + "and c2.name = :companyName) "
+            + "and d.name = :departmentName";
+
+        em.getTransaction().begin();
+        TypedQuery<Employee> q1 = em.createQuery(query, Employee.class);
+        q1.setParameter("companyName", "acme.org");
+        q1.setParameter("departmentName", "Engineering");
+        assertEquals(q1.getResultList().size(), 6);
+
+        TypedQuery<Employee> q2 = em.createQuery(query, Employee.class);
+        q2.setParameter("companyName", "acme.org");
+        q2.setParameter("departmentName", "Engineering");
+        assertEquals(q2.getResultList().size(), 6);
+        em.getTransaction().rollback();
+    }
+
     public void testRepeatedParameterInSubqueryInDifferentOrder() {
         OpenJPAEntityManager em = emf.createEntityManager();
         String jpql =  "select o from OrderJPA o "