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/03/16 07:11:19 UTC

svn commit: r923589 - in /openjpa/trunk: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/ openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/ openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persisten...

Author: fancy
Date: Tue Mar 16 06:11:18 2010
New Revision: 923589

URL: http://svn.apache.org/viewvc?rev=923589&view=rev
Log:
OPENJPA-1573: Incorrect SQL for HAVING = entity variable

Modified:
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/PCPath.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestJPQLSubquery.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypesafeCriteria.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_26_ex0/TestSpec10_1_26.java

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/PCPath.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/PCPath.java?rev=923589&r1=923588&r2=923589&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/PCPath.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/PCPath.java Tue Mar 16 06:11:18 2010
@@ -189,6 +189,12 @@ public class PCPath
         if (_cid)
             return;
 
+        Action last = _actions == null ? null : (Action) _actions.getLast();
+        if (last != null && last.op == Action.VAR && ((String)last.data).equals(last.var)) {
+            _cid = true;
+            return;
+        }            
+            
         // treat it just like a unique variable
         Action action = new Action();
         action.op = Action.VAR;

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestJPQLSubquery.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestJPQLSubquery.java?rev=923589&r1=923588&r2=923589&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestJPQLSubquery.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestJPQLSubquery.java Tue Mar 16 06:11:18 2010
@@ -35,8 +35,6 @@ import javax.persistence.criteria.SetJoi
 import javax.persistence.criteria.Subquery;
 
 import org.apache.openjpa.jdbc.sql.DerbyDictionary;
-import org.apache.openjpa.persistence.criteria.AbstractCriteriaTestCase.QueryDecorator;
-import org.apache.openjpa.persistence.embed.Division;
 
 /**
  * Tests type-strict version of Criteria API.
@@ -658,17 +656,16 @@ public class TestJPQLSubquery extends Cr
         String jpql = "select c from Customer c left join c.orders o where exists"
             + " (select o2 from c.orders o2 where o2 = o)";
 
-        String expectedSQL = "SELECT t0.id, t0.accountNum, t5.id, t5.city, t5.country, t5.county, "
-            + "t5.state, t5.street, t6.userid, t6.DTYPE, t6.age, t6.compName, t6.creditRating, t6.name, "
-            + "t5.zipCode, t0.balanceOwed, t0.creditRating, t0.filledOrderCount, t0.firstName, t0.lastName, "
+        String expectedSQL = "SELECT t0.id, t0.accountNum, t4.id, t4.city, t4.country, t4.county, "
+            + "t4.state, t4.street, t5.userid, t5.DTYPE, t5.age, t5.compName, t5.creditRating, t5.name, "
+            + "t4.zipCode, t0.balanceOwed, t0.creditRating, t0.filledOrderCount, t0.firstName, t0.lastName, "
             + "t0.name, t0.status "
             + "FROM CR_CUST t0 "
             + "LEFT OUTER JOIN CR_ODR t1 ON t0.id = t1.CUSTOMER_ID "
-            + "LEFT OUTER JOIN CR_ODR t2 ON t0.id = t2.CUSTOMER_ID "
-            + "LEFT OUTER JOIN CR_ADDR t5 ON t0.ADDRESS_ID = t5.id "
-            + "LEFT OUTER JOIN CompUser t6 ON t5.id = t6.ADD_ID WHERE (EXISTS ("
-            + "SELECT t4.id FROM CR_ODR t3, CR_ODR t4 WHERE (t2.id = t4.id AND t3.id = t4.id) "
-            + "AND (t0.id = t3.CUSTOMER_ID)))";
+            + "LEFT OUTER JOIN CR_ADDR t4 ON t0.ADDRESS_ID = t4.id "
+            + "LEFT OUTER JOIN CompUser t5 ON t4.id = t5.ADD_ID WHERE (EXISTS (" 
+            + "SELECT t3.id FROM CR_ODR t2, CR_ODR t3 WHERE (t1.id = t3.id AND t2.id = t3.id) "
+            + "AND (t0.id = t2.CUSTOMER_ID)))";
 
         executeAndCompareSQL(jpql, expectedSQL);
 
@@ -711,17 +708,16 @@ public class TestJPQLSubquery extends Cr
         String jpql = "select c from Customer c left join c.orders o where not exists"
             + " (select o2 from c.orders o2 where o2 = o)";
 
-        String expectedSQL = "SELECT t0.id, t0.accountNum, t5.id, t5.city, t5.country, t5.county, "
-            + "t5.state, t5.street, t6.userid, t6.DTYPE, t6.age, t6.compName, t6.creditRating, t6.name, "
-            + "t5.zipCode, t0.balanceOwed, t0.creditRating, t0.filledOrderCount, t0.firstName, t0.lastName, "
+        String expectedSQL = "SELECT t0.id, t0.accountNum, t4.id, t4.city, t4.country, t4.county, "
+            + "t4.state, t4.street, t5.userid, t5.DTYPE, t5.age, t5.compName, t5.creditRating, t5.name, "
+            + "t4.zipCode, t0.balanceOwed, t0.creditRating, t0.filledOrderCount, t0.firstName, t0.lastName, "
             + "t0.name, t0.status "
             + "FROM CR_CUST t0 "
             + "LEFT OUTER JOIN CR_ODR t1 ON t0.id = t1.CUSTOMER_ID "
-            + "LEFT OUTER JOIN CR_ODR t2 ON t0.id = t2.CUSTOMER_ID "
-            + "LEFT OUTER JOIN CR_ADDR t5 ON t0.ADDRESS_ID = t5.id "
-            + "LEFT OUTER JOIN CompUser t6 ON t5.id = t6.ADD_ID WHERE (NOT (EXISTS ("
-            + "SELECT t4.id FROM CR_ODR t3, CR_ODR t4 WHERE (t2.id = t4.id AND t3.id = t4.id) "
-            + "AND (t0.id = t3.CUSTOMER_ID))))";
+            + "LEFT OUTER JOIN CR_ADDR t4 ON t0.ADDRESS_ID = t4.id "
+            + "LEFT OUTER JOIN CompUser t5 ON t4.id = t5.ADD_ID WHERE (NOT (EXISTS ("
+            + "SELECT t3.id FROM CR_ODR t2, CR_ODR t3 WHERE (t1.id = t3.id AND t2.id = t3.id) "
+            + "AND (t0.id = t2.CUSTOMER_ID))))";
 
         executeAndCompareSQL(jpql, expectedSQL);
 

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypesafeCriteria.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypesafeCriteria.java?rev=923589&r1=923588&r2=923589&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypesafeCriteria.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypesafeCriteria.java Tue Mar 16 06:11:18 2010
@@ -1085,9 +1085,8 @@ public class TestTypesafeCriteria extend
     public void testValues1() {
         String sql = "SELECT t0.name, t2.id, t2.label FROM CR_ITEM t0 "
             + "INNER JOIN CR_ITEM_photos t1 ON t0.id = t1.ITEM_ID "
-            + "INNER JOIN CR_ITEM_photos t3 ON t0.id = t3.ITEM_ID "
-            + "INNER JOIN CR_PHT t2 ON t1.VALUE_ID = t2.id WHERE " + 
-            "((t3.VALUE_ID = ? OR t3.VALUE_ID = ? OR t3.VALUE_ID = ? OR t3.VALUE_ID = ? OR t3.VALUE_ID = ?) "
+            + "INNER JOIN CR_PHT t2 ON t1.VALUE_ID = t2.id WHERE " +
+            "((t1.VALUE_ID = ? OR t1.VALUE_ID = ? OR t1.VALUE_ID = ? OR t1.VALUE_ID = ? OR t1.VALUE_ID = ?) "
             + "AND 0 < (SELECT COUNT(*) FROM CR_ITEM_photos WHERE CR_ITEM_photos.ITEM_ID = t0.id))";
 
         CriteriaQuery<Customer> q = cb.createQuery(Customer.class);
@@ -1167,10 +1166,9 @@ public class TestTypesafeCriteria extend
             + "INNER JOIN CR_PHT t2 ON t1.VALUE_ID = t2.id WHERE "
             + "(0 = (SELECT COUNT(*) FROM CR_ITEM_photos t3 WHERE "
             + "(t3.VALUE_ID = ? OR t3.VALUE_ID = ? OR t3.VALUE_ID = ? OR t3.VALUE_ID = ? OR t3.VALUE_ID = ?) "
-            + "AND (t0.id = t3.ITEM_ID) AND t0.id = t3.ITEM_ID) "
+            + "AND t0.id = t1.ITEM_ID) "
             + "AND 0 < (SELECT COUNT(*) FROM CR_ITEM_photos WHERE CR_ITEM_photos.ITEM_ID = t0.id))";
         
-        
         CriteriaQuery<Customer> q = cb.createQuery(Customer.class);
         Root<Item> item = q.from(Item.class);
         MapJoin<Item, String, Photo> photo = item.join(Item_.photos);

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_26_ex0/TestSpec10_1_26.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_26_ex0/TestSpec10_1_26.java?rev=923589&r1=923588&r2=923589&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_26_ex0/TestSpec10_1_26.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/spec_10_1_26_ex0/TestSpec10_1_26.java Tue Mar 16 06:11:18 2010
@@ -65,6 +65,44 @@ public class TestSpec10_1_26 extends SQL
         rsAllDepartment3 = getAll(Department3.class);
     }
 
+    public void testHavingClauseWithEntityExpression() throws Exception {
+        EntityManager em = emf.createEntityManager();
+        Employee1 e1 = em.find(Employee1.class, 1);
+        em.clear();
+        String query = "select e from Department1 d, " +
+            " in (d.empMap) e " +
+            "group by e " +
+            "having e = ?1"; 
+        Query q = em.createQuery(query); 
+        q.setParameter(1, e1);
+        List<Employee1> rs = (List<Employee1>) q.getResultList();
+        Employee1 e2 = rs.get(0);
+        assertEquals(e1.getEmpId(), e2.getEmpId());
+
+        em.clear();
+        query = "select e from Department1 d, " +
+            " in (d.empMap) e " +
+            "group by e " +
+            "having e <> ?1"; 
+        q = em.createQuery(query); 
+        q.setParameter(1, e1);
+        rs = (List<Employee1>) q.getResultList();
+        Employee1 e3 = rs.get(0);
+        assertNotEquals(e1.getEmpId(), e3.getEmpId());
+
+        em.clear();
+        query = "select value(e) from Department1 d, " +
+            " in (d.empMap) e " +
+            "group by value(e) " +
+            "having value(e) = ?1"; 
+        q = em.createQuery(query); 
+        q.setParameter(1, e1);
+        rs = (List<Employee1>) q.getResultList();
+        Employee1 e4 = rs.get(0);
+        assertEquals(e1.getEmpId(), e4.getEmpId());
+        em.close();
+    }
+
     @AllowFailure
     public void testQueryInMemoryQualifiedId() throws Exception {
         queryQualifiedId(true);