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 2009/06/04 01:44:59 UTC

svn commit: r781621 [1/3] - 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/src/main/java/org/apache/openjpa/persiste...

Author: faywang
Date: Wed Jun  3 23:44:58 2009
New Revision: 781621

URL: http://svn.apache.org/viewvc?rev=781621&view=rev
Log:
OPENJPA-1013: subquery support

Added:
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CustomerFullName.java   (with props)
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaExpressionBuilder.java   (with props)
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SubqueryImpl.java   (with props)
Modified:
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/JDBCExpressionFactory.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Address.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CustomerDetails.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypeSafeCondExpression.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypesafeCriteria.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaBuilder.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/ExpressionImpl.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Joins.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/ParameterImpl.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PathImpl.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PredicateImpl.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/RootImpl.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SelectionImpl.java

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/JDBCExpressionFactory.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/JDBCExpressionFactory.java?rev=781621&r1=781620&r2=781621&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/JDBCExpressionFactory.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/JDBCExpressionFactory.java Wed Jun  3 23:44:58 2009
@@ -439,14 +439,16 @@
         if (val instanceof Lit) {
             Lit lit = (Lit) val;
             StringBuffer value = new StringBuffer();
-            if (lit.getParseType() == Literal.TYPE_SQ_STRING)
+            int pType = lit.getParseType(); 
+            if (pType == Literal.TYPE_SQ_STRING ||
+                pType == Literal.TYPE_STRING)
                 value.append("'").append(lit.getValue().toString()).append("'");
-            else if (lit.getParseType() == Literal.TYPE_BOOLEAN) {
+            else if (pType == Literal.TYPE_BOOLEAN) {
                 if ((Boolean) lit.getValue())
                     value.append("1");
                 else
                     value.append("0");
-            } else if (lit.getParseType() == Literal.TYPE_ENUM) {
+            } else if (pType == Literal.TYPE_ENUM) {
                 lit.setRaw(true);
                 return val;
             } else

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Address.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Address.java?rev=781621&r1=781620&r2=781621&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Address.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Address.java Wed Jun  3 23:44:58 2009
@@ -25,6 +25,7 @@
 import javax.persistence.OneToOne;
 import javax.persistence.Table;
 
+
 /**
  * Used for testing Criteria API.
  * The fields are sometimes not declared as there is no validation yet during 

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CustomerDetails.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CustomerDetails.java?rev=781621&r1=781620&r2=781621&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CustomerDetails.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CustomerDetails.java Wed Jun  3 23:44:58 2009
@@ -19,11 +19,24 @@
 package org.apache.openjpa.persistence.criteria;
 
 public class CustomerDetails {
-    int id;
+    long id;
     
     int status;
     
     int quantity;
+
+    public CustomerDetails() {}
+    
+    public CustomerDetails(long id, int status) {
+        this.id = id;
+        this.status = status;
+    }
+    
+    public CustomerDetails(long id, int status, int quantity) {
+        this.id = id;
+        this.status = status;
+        this.quantity = quantity;
+    }
     
     public int getStatus() {
         return status;
@@ -33,11 +46,11 @@
         this.status = status;
     }
     
-    public int getId() {
+    public long getId() {
         return id;
     }
     
-    public void setId(int id) {
+    public void setId(long id) {
         this.id = id;
     }
     

Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CustomerFullName.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CustomerFullName.java?rev=781621&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CustomerFullName.java (added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CustomerFullName.java Wed Jun  3 23:44:58 2009
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+package org.apache.openjpa.persistence.criteria;
+
+public class CustomerFullName {
+    public String firstName;
+    
+    public String lastName;
+    
+    public CustomerFullName() {}
+    
+    public CustomerFullName(String firstName, String lastName) {
+        this.firstName = firstName;
+        this.lastName = lastName;
+    }
+    
+    public String getLastName() {
+        return lastName;
+    }
+    
+    public void setLastName(String lastName) {
+        this.lastName = lastName;
+    }
+    
+    public String getFirstName() {
+        return firstName;
+    }
+    
+    public void setFirstName(String firstName) {
+        this.firstName = firstName;
+    }
+}
+

Propchange: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CustomerFullName.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypeSafeCondExpression.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypeSafeCondExpression.java?rev=781621&r1=781620&r2=781621&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypeSafeCondExpression.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypeSafeCondExpression.java Wed Jun  3 23:44:58 2009
@@ -266,7 +266,6 @@
         em.clear();
     }
 
-    @AllowFailure(message="JPQL generates two queries, Criteria only one")
     public void testNullExprUsingCriteria() {
         String query =
             "SELECT o.name FROM CompUser o WHERE o.age IS NOT NULL AND " +
@@ -289,7 +288,6 @@
         em.clear();
     }
     
-    @AllowFailure(message="Invalid SQL for Criteria")
     public void testNullExpr2UsingCriteria() {
         String query =
             "SELECT o.name FROM CompUser o WHERE o.address.country IS NULL";
@@ -407,12 +405,10 @@
         em.clear();
     }
     
-    @AllowFailure(message="new() in projection is badly broken")
     public void testConstructorExprUsingCriteria() {
         String query =
             "SELECT NEW org.apache.openjpa.persistence.common.apps.MaleUser(" +
-            "c.name, " + 
-            "c.computerName, c.address, c.age, c.userid)" +
+            "c.name, c.computerName, c.address, c.age, c.userid)" +
             " FROM CompUser c WHERE c.name = 'Seetha'";
         CriteriaQuery q = cb.create();
         q = cb.create();
@@ -433,11 +429,10 @@
         em.clear();
     }
 
-    @AllowFailure
     public void testConcatSubStringFunc1() {
         String query = "select " +
             "CONCAT('Ablahum', SUBSTRING(e.name, LOCATE('e', e.name), 4)) " +
-            "From CompUer e WHERE e.name='Seetha'";
+            "From CompUser e WHERE e.name='Seetha'";
         CriteriaQuery q = cb.create();
         q = cb.create();
         Root<CompUser> e = q.from(CompUser.class);
@@ -455,30 +450,29 @@
         em.clear();
     }
     
-    @AllowFailure
     public void testConcatSubStringFunc2() {
         String query = "select e.address From CompUser e where " +
-        		"e.computerName = " +
+            "e.name = 'Seetha' AND e.computerName = " +
             "CONCAT('Ablahum', SUBSTRING(e.name, LOCATE('e', e.name), 4)) ";
         CriteriaQuery q = cb.create();
         q = cb.create();
         Root<CompUser> e = q.from(CompUser.class);
         q.select(e.get(CompUser_.address));
-        q.where(cb.equal(
-            e.get(CompUser_.computerName),
-            cb.concat("Ablahum", 
-                cb.substring(
-                    e.get(CompUser_.name), 
-                    cb.locate(e.get(CompUser_.name), "e"), 
-                    cb.literal(4)
-                 )
-            ))
-         );
+        q.where(cb.and(cb.equal(e.get(CompUser_.name), "Seetha"),
+                cb.equal(
+                e.get(CompUser_.computerName),
+                cb.concat("Ablahum", 
+                    cb.substring(
+                        e.get(CompUser_.name), 
+                        cb.locate(e.get(CompUser_.name), "e"), 
+                        cb.literal(4)
+                     )
+                )))
+             );
         assertEquivalence(q, query);
         em.clear();
     }
 
-    @AllowFailure
     public void testConcatSubStringFunc3() {
         String query = "select " +
             "CONCAT('XYZ', SUBSTRING(e.name, LOCATE('e', e.name))) " +
@@ -499,31 +493,31 @@
         em.clear();
     }
 
-    @AllowFailure
     public void testConcatSubStringFunc4() {
-        String query = "select e.nicknames from CompUser e where e.name = " +
+        String query = "select e.age from CompUser e where " + 
+            "e.name = 'Seetha' AND e.computerName = " +
             "CONCAT('XYZ', SUBSTRING(e.name, LOCATE('e', e.name))) ";
         CriteriaQuery q = cb.create();
         q = cb.create();
         Root<CompUser> e = q.from(CompUser.class);
-        q.select(e.get(CompUser_.nicknames));
-        q.where(cb.equal(
-            e.get(CompUser_.name),
-            cb.concat("XYZ", 
-                cb.substring(
-                    e.get(CompUser_.name), 
-                    cb.locate(e.get(CompUser_.name), "e") 
-                )
-            ))
-        );
+        q.select(e.get(CompUser_.age));
+        q.where(cb.and(cb.equal(e.get(CompUser_.name), "Seetha"),
+                cb.equal(
+                e.get(CompUser_.computerName),
+                cb.concat("XYZ", 
+                    cb.substring(
+                        e.get(CompUser_.name), 
+                        cb.locate(e.get(CompUser_.name), "e") 
+                    )
+                )))
+            );
         assertEquivalence(q, query);
         em.clear();
     }
 
-    @AllowFailure
     public void testConcatFunc() {
         String query = "select " +
-            "CONCAT('', '') From CompUser WHERE e.name='Seetha'";
+            "CONCAT('', '') From CompUser e WHERE e.name='Seetha'";
         CriteriaQuery q = cb.create();
         q = cb.create();
         Root<CompUser> e = q.from(CompUser.class);
@@ -533,7 +527,6 @@
         em.clear();
     }
 
-    @AllowFailure
     public void testTrimFunc1() {
         String query = "select Trim(e.computerName) From CompUser e " +
         		"WHERE e.name='Shannon '";
@@ -546,20 +539,18 @@
         em.clear();
     }
 
-    @AllowFailure
     public void testTrimFunc2() {
-        String query = "select e.name From CompUser e where Trim(e.name) =" +
-        		"'Shannon'";
+        String query = "select e.computerName From CompUser e where " + 
+            "Trim(e.name) = 'Shannon '";
         CriteriaQuery q = cb.create();
         q = cb.create();
         Root<CompUser> e = q.from(CompUser.class);
-        q.where(cb.equal(cb.trim(e.get(CompUser_.computerName)), "Shannon"));
-        q.select(e.get(CompUser_.name));
+        q.where(cb.equal(cb.trim(e.get(CompUser_.name)), "Shannon"));
+        q.select(e.get(CompUser_.computerName));
         assertEquivalence(q, query);
         em.clear();
     }
 
-    @AllowFailure
     public void testLowerFunc1() {
         String query = "select LOWER(e.name) From CompUser e WHERE " +
         		"e.computerName='UNIX'";
@@ -572,7 +563,6 @@
         em.clear();
     }
 
-    @AllowFailure
     public void testLowerFunc2() {
         String query = "select e.age From CompUser e where LOWER(e.name)" +
         		" ='ugo'";
@@ -585,7 +575,6 @@
         em.clear();
     }
 
-    @AllowFailure
     public void testUpperFunc1() {
         String query = "select UPPER(e.name) From CompUser e WHERE " +
         		"e.computerName='PC'";
@@ -598,33 +587,31 @@
         em.clear();
     }
 
-    @AllowFailure
     public void testUpperFunc2() {
-        String query = "select e.nicknames from CompUser e where " +
-        		"UPPER(e.name)='UGO'";
+        String query = "select e.age from CompUser e where " +
+            "UPPER(e.name)='UGO'";
         CriteriaQuery q = cb.create();
         q = cb.create();
         Root<CompUser> e = q.from(CompUser.class);
         q.where(cb.equal(cb.upper(e.get(CompUser_.name)), "UGO"));
-        q.select(e.get(CompUser_.nicknames));
+        q.select(e.get(CompUser_.age));
         assertEquivalence(q, query);
         em.clear();
     }
 
-    @AllowFailure
     public void testLengthFunc() {
         String query = "SELECT o.name FROM CompUser o " + 
             "WHERE LENGTH(o.address.country) = 3";
         CriteriaQuery q = cb.create();
         q = cb.create();
         Root<CompUser> e = q.from(CompUser.class);
-        q.where(cb.equal(cb.length(e.get(CompUser_.name)), 3));
+        q.where(cb.equal(cb.length(e.get(CompUser_.address).
+            get(Address_.country)), 3));
         q.select(e.get(CompUser_.name));
         assertEquivalence(q, query);
         em.clear();
     }
 
-    @AllowFailure
     public void testArithmFunc1() {
         String query =
             "select ABS(e.age) From CompUser e WHERE e.name='Seetha'";
@@ -637,7 +624,6 @@
         em.clear();
     }
     
-    @AllowFailure
     public void testArithmFunc2() {
         String query =
             "select SQRT(e.age) From CompUser e WHERE e.name='Seetha'";
@@ -677,7 +663,6 @@
         em.clear();
     }
 
-    @AllowFailure
     public void testGroupByHavingClause() {
         String query =
             "SELECT c.name FROM CompUser c GROUP BY c.name HAVING c.name " +
@@ -690,18 +675,9 @@
         q.having(cb.like(e.get(CompUser_.name), "S%"));
         q.select(e.get(CompUser_.name));
         assertEquivalence(q, query);
-        List result = em.createQuery(q).getResultList();
-
-        assertNotNull(result);
-        assertEquals(3, result.size());
-        assertTrue(result.contains("Shannon "));
-        assertTrue(result.contains("Shade"));
-        assertTrue(result.contains("Seetha"));
-
         em.clear();
     }
 
-    @AllowFailure
     public void testOrderByClause() {
         String query =
             "SELECT c.name FROM CompUser c WHERE c.name LIKE 'S%' " +
@@ -714,18 +690,9 @@
         q.select(e.get(CompUser_.name));
         q.orderBy(cb.asc(e.get(CompUser_.name)));
         assertEquivalence(q, query);
-        List result = em.createQuery(q).getResultList();
-
-        assertNotNull(result);
-        assertEquals(3, result.size());
-        assertTrue(result.contains("Shannon "));
-        assertTrue(result.contains("Seetha"));
-        assertTrue(result.contains("Shade"));
-
         em.clear();
     }
 
-    @AllowFailure
     public void testAVGAggregFunc() {
         //To be Tested: AVG, COUNT, MAX, MIN, SUM
         String query = "SELECT AVG(e.age) FROM CompUser e";
@@ -734,16 +701,9 @@
         Root<CompUser> e = q.from(CompUser.class);
         q.select(cb.avg(e.get(CompUser_.age)));
         assertEquivalence(q, query);
-        List result = em.createQuery(q).getResultList();
-
-        assertNotNull(result);
-        assertEquals(1, result.size());
-        assertTrue(result.contains(25));
-
         em.clear();
     }
 
-    @AllowFailure
     public void testCOUNTAggregFunc() {
         String query = "SELECT COUNT(c.name) FROM CompUser c";
 
@@ -752,16 +712,9 @@
         Root<CompUser> e = q.from(CompUser.class);
         q.select(cb.count(e.get(CompUser_.name)));
         assertEquivalence(q, query);
-        List result = em.createQuery(q).getResultList();
-
-        assertNotNull(result);
-        assertEquals(1, result.size());
-        assertTrue(result.contains(6l));
-
         em.clear();
     }
 
-    @AllowFailure
     public void testMAXAggregFunc() {
         String query = "SELECT DISTINCT MAX(c.age) FROM CompUser c";
 
@@ -770,16 +723,10 @@
         Root<CompUser> e = q.from(CompUser.class);
         q.select(cb.max(e.get(CompUser_.age))).distinct(true);
         assertEquivalence(q, query);
-        List result = em.createQuery(q).getResultList();
-
-        assertNotNull(result);
-        assertEquals(1, result.size());
-        assertTrue(result.contains(36));
-
         em.clear();
     }
 
-    @AllowFailure
+    @AllowFailure(message="criteria does not generate Optimize for 1 row")
     public void testMINAggregFunc() {
         String query = "SELECT DISTINCT MIN(c.age) FROM CompUser c";
 
@@ -788,16 +735,9 @@
         Root<CompUser> e = q.from(CompUser.class);
         q.select(cb.min(e.get(CompUser_.age))).distinct(true);
         assertEquivalence(q, query);
-        List result = em.createQuery(q).getResultList();
-
-        assertNotNull(result);
-        assertEquals(1, result.size());
-        assertTrue(result.contains(10));
-
         em.clear();
     }
 
-    @AllowFailure
     public void testSUMAggregFunc() {
         String query = "SELECT SUM(c.age) FROM CompUser c";
 
@@ -806,12 +746,6 @@
         Root<CompUser> e = q.from(CompUser.class);
         q.select(cb.sum(e.get(CompUser_.age)));
         assertEquivalence(q, query);
-        List result = em.createQuery(q).getResultList();
-
-        assertNotNull(result);
-        assertEquals(1, result.size());
-        assertTrue(result.contains(153l));
-
         em.clear();
     }
 
@@ -819,7 +753,7 @@
     @AllowFailure
     public void testTypeExpression1() {
         String query = "SELECT e FROM CompUser e where TYPE(e) in (?1, ?2) " +
-        		"ORDER By e.name";
+            "ORDER By e.name";
         CriteriaQuery q = cb.create();
         q = cb.create();
         Root<CompUser> e = q.from(CompUser.class);
@@ -861,7 +795,6 @@
         em.clear();
     }
 
-    @AllowFailure
     public void testTypeExpression4() {
         String query = "SELECT e FROM CompUser e where TYPE(e) = MaleUser";
         CriteriaQuery q = cb.create();
@@ -873,7 +806,6 @@
         em.clear();
     }
 
-    @AllowFailure
     public void testTypeExpression5() {
         String query = "SELECT e FROM CompUser e where TYPE(e) in (MaleUser)";
         CriteriaQuery q = cb.create();
@@ -885,10 +817,9 @@
         em.clear();
     }
 
-    @AllowFailure
     public void testTypeExpression6() {
         String query = "SELECT e FROM CompUser e where TYPE(e) not in " +
-        		"(MaleUser, FemaleUser)";
+            "(MaleUser, FemaleUser)";
         CriteriaQuery q = cb.create();
         q = cb.create();
         Root<CompUser> e = q.from(CompUser.class);
@@ -910,7 +841,6 @@
         em.clear();
     }
 
-    @AllowFailure
     public void testTypeExpression8() {
         String query = "SELECT MaleUser FROM Address a";
         CriteriaQuery q = cb.create();
@@ -921,7 +851,6 @@
         em.clear();
     }
 
-    @AllowFailure
     public void testTypeExpression9() {
         String query = "SELECT "
                 + " CASE TYPE(e) WHEN FemaleUser THEN 'Female' "
@@ -935,10 +864,8 @@
         em.clear();
     }
 
-    @AllowFailure
     public void testCoalesceExpressions() {
-        startTx(em);
-        String query = "SELECT e.name, "
+         String query = "SELECT e.name, "
                 + "COALESCE (e.address.country, 'Unknown')"
                 + " FROM CompUser e ORDER BY e.name DESC";
 
@@ -949,18 +876,10 @@
                 .value("Unknown"));
         q.orderBy(cb.desc(e.get(CompUser_.name)));
         assertEquivalence(q, query);
-        List rs = em.createQuery(q).getResultList();
-        Object[] result = (Object[]) rs.get(rs.size() - 1);
-        assertEquals("the name is not famzy", "Famzy", result[0]);
-        assertEquals("Unknown", result[1]);
-
-        endTx(em);
         em.clear();
     }
 
-    @AllowFailure
     public void testNullIfExpressions() {
-        startTx(em);
         String query = "SELECT e.name, NULLIF (e.address.country, 'USA')"
                 + " FROM CompUser e ORDER BY e.name DESC";
         CriteriaQuery q = cb.create();
@@ -969,22 +888,14 @@
                 Address_.country), "USA"));
         q.orderBy(cb.desc(e.get(CompUser_.name)));
         assertEquivalence(q, query);
-
-        List rs = em.createQuery(q).getResultList();
-        Object[] result = (Object[]) rs.get(1);
-        assertEquals("the name is not shannon ", "Shannon ", result[0]);
-        assertNull("is not null", result[1]);
-
-        endTx(em);
         em.clear();
     }
 
-    @AllowFailure
     public void testSimpleCaseExpression1() {
-        String query = "SELECT e.name, e.age+1 as cage, "
+        String query = "SELECT e.name, e.age+1, "
                 + "CASE e.address.country WHEN 'USA' THEN 'us' "
-                + " ELSE 'non-us' END as d2, e.address.country "
-                + " FROM CompUser e ORDER BY cage, d2 DESC";
+                + " ELSE 'non-us' END, e.address.country "
+                + " FROM CompUser e";
         CriteriaQuery q = cb.create();
         Root<CompUser> e = q.from(CompUser.class);
         Expression<Integer> cage = cb.sum(e.get(CompUser_.age), 1);
@@ -993,21 +904,15 @@
                 "us").otherwise("non-us");
         q.select(e.get(CompUser_.name), cage, d2, e.get(CompUser_.address).get(
                 Address_.country));
-        q.orderBy(cb.asc(cage), cb.desc(d2));
         assertEquivalence(q, query);
-
-        List rs = em.createQuery(q).getResultList();
-        Object[] result = (Object[]) rs.get(rs.size() - 1);
-        assertEquals("the name is not seetha", "Seetha", result[0]);
     }
 
-    @AllowFailure
     public void testSimpleCaseExpression2() {
-        String query = "SELECT e.name, e.age+1 as cage, "
+        String query = "SELECT e.name, e.age+1, "
                 + "CASE e.address.country WHEN 'USA'"
                 + " THEN 'United-States' "
-                + " ELSE e.address.country  END as d2," + " e.address.country "
-                + " FROM CompUser e ORDER BY cage, d2 DESC";
+                + " ELSE e.address.country  END," + " e.address.country "
+                + " FROM CompUser e";
         CriteriaQuery q = cb.create();
         Root<CompUser> e = q.from(CompUser.class);
         Expression cage = cb.sum(e.get(CompUser_.age), 1);
@@ -1017,42 +922,29 @@
                 e.get(CompUser_.address).get(Address_.country));
         q.select(e.get(CompUser_.name), cage, d2, e.get(CompUser_.address).get(
                 Address_.country));
-        q.orderBy(cb.asc(cage), cb.desc(d2));
         assertEquivalence(q, query);
-        List rs = em.createQuery(q).getResultList();
-        Object[] result = (Object[]) rs.get(rs.size() - 1);
-        assertEquals("the name is not seetha", "Seetha", result[0]);
     }
 
-    @AllowFailure
     public void testSimpleCaseExpression3() {
         String query = "SELECT e.name, "
                 + " CASE TYPE(e) WHEN FemaleUser THEN 'Female' "
-                + " ELSE 'Male' END as result"
+                + " ELSE 'Male' END"
                 + " FROM CompUser e WHERE e.name like 'S%' "
                 + " ORDER BY e.name DESC";
         CriteriaQuery q = cb.create();
         Root<CompUser> e = q.from(CompUser.class);
-        q.select(cb.selectCase(e.type()).when(FemaleUser.class, "Female")
-                .otherwise("Male"));
+        q.select(e.get(CompUser_.name), 
+            cb.selectCase(e.type()).when(FemaleUser.class, "Female")
+            .otherwise("Male"));
         q.where(cb.like(e.get(CompUser_.name), "S%"));
-        q.orderBy(cb.asc(e.get(CompUser_.name)));
+        q.orderBy(cb.desc(e.get(CompUser_.name)));
         assertEquivalence(q, query);
-        List rs = em.createQuery(q).getResultList();
-        Object[] result = (Object[]) rs.get(0);
-        assertEquals("the result is not female", "Female", result[1]);
-        assertEquals("the name is not shannon", "Shannon ", result[0]);
-        result = (Object[]) rs.get(2);
-        assertEquals("the result is not male", "Male", result[1]);
-        assertEquals("the name is not seetha", "Seetha", result[0]);
     }
 
-    @AllowFailure
     public void testSimpleCaseExpression4() {
-        // boolean literal in case expression
         String query = "SELECT e.name, CASE e.address.country WHEN 'USA'"
-                + " THEN true ELSE false  END as b,"
-                + " e.address.country FROM CompUser e order by b";
+                + " THEN true ELSE false END,"
+                + " e.address.country FROM CompUser e";
         CriteriaQuery q = cb.create();
         Root<CompUser> e = q.from(CompUser.class);
         Expression b = cb.selectCase(
@@ -1060,21 +952,14 @@
                 true).otherwise(false);
         q.select(e.get(CompUser_.name), b, e.get(CompUser_.address).get(
                 Address_.country));
-        q.where(cb.like(e.get(CompUser_.name), "S%"));
-        q.orderBy(cb.asc(b));
         assertEquivalence(q, query);
-        List rs = em.createQuery(q).getResultList();
-
-        Object[] result = (Object[]) rs.get(rs.size() - 1);
-        assertEquals(result[1], 1);
     }
 
-    @AllowFailure
     public void testGeneralCaseExpression1() {
         String query = "SELECT e.name, e.age, "
                 + " CASE WHEN e.age > 30 THEN e.age - 1 "
                 + " WHEN e.age < 15 THEN e.age + 1 ELSE e.age + 0 "
-                + " END AS cage FROM CompUser e ORDER BY cage";
+                + " END FROM CompUser e";
         CriteriaQuery q = cb.create();
         Root<CompUser> e = q.from(CompUser.class);
         Expression cage = cb.selectCase().when(cb.gt(e.get(CompUser_.age), 30),
@@ -1083,18 +968,16 @@
                 cb.sum(e.get(CompUser_.age), 1)).otherwise(
                 cb.sum(e.get(CompUser_.age), 0));
         q.select(e.get(CompUser_.name), e.get(CompUser_.age), cage);
-        q.orderBy(cb.asc(cage));
         assertEquivalence(q, query);
     }
 
-    @AllowFailure
     public void testGeneralCaseExpression2() {
-        String query = "SELECT e.name, e.age+1 as cage, "
+        String query = "SELECT e.name, e.age+1, "
                 + "CASE WHEN e.address.country = 'USA' "
                 + " THEN 'United-States' "
-                + " ELSE 'Non United-States'  END as d2,"
+                + " ELSE 'Non United-States'  END,"
                 + " e.address.country "
-                + " FROM CompUser e ORDER BY cage, d2 DESC";
+                + " FROM CompUser e";
         CriteriaQuery q = cb.create();
         Root<CompUser> e = q.from(CompUser.class);
         Expression d2 = cb.selectCase()
@@ -1106,29 +989,21 @@
         Expression cage = cb.sum(e.get(CompUser_.age), 1);
         q.select(e.get(CompUser_.name), cage, d2, e.get(CompUser_.address).get(
                 Address_.country));
-        q.orderBy(cb.asc(cage), cb.desc(d2));
         assertEquivalence(q, query);
-
-        List rs = em.createQuery(q).getResultList();
-        Object[] result = (Object[]) rs.get(rs.size() - 1);
-        assertEquals("the name is not seetha", "Seetha", result[0]);
-        assertEquals("the country is not 'Non United-States'",
-                "Non United-States", result[2]);
     }
 
-    @AllowFailure
     public void testGeneralCaseExpression3() {
         String query = " select e.name, "
-                + "CASE WHEN e.age = 11 THEN "
-                + "org.apache.openjpa.persistence.criteria.CompUser$" +
-                		"CreditRating.POOR"
-                + " WHEN e.age = 35 THEN "
-                + "org.apache.openjpa.persistence.criteria.CompUser$" +
-                		"CreditRating.GOOD"
-                + " ELSE "
-                + "org.apache.openjpa.persistence.criteria.CompUser$" +
-                		"CreditRating.EXCELLENT"
-                + " END FROM CompUser e ORDER BY e.age";
+            + "CASE WHEN e.age = 11 THEN "
+            + "org.apache.openjpa.persistence.criteria.CompUser$" 
+            + "CreditRating.POOR"
+            + " WHEN e.age = 35 THEN "
+            + "org.apache.openjpa.persistence.criteria.CompUser$" 
+            + "CreditRating.GOOD"
+            + " ELSE "
+            + "org.apache.openjpa.persistence.criteria.CompUser$" 
+            + "CreditRating.EXCELLENT"
+            + " END FROM CompUser e ORDER BY e.age";
         CriteriaQuery q = cb.create();
         Root<CompUser> e = q.from(CompUser.class);
         q.select(e.get(CompUser_.name), cb.selectCase().when(
@@ -1139,10 +1014,6 @@
 
         q.orderBy(cb.asc(e.get(CompUser_.age)));
         assertEquivalence(q, query);
-        List rs = em.createQuery(q).getResultList();
-        Object[] result = (Object[]) rs.get(0);
-        assertEquals("the name is not Jacob", "Jacob", result[0]);
-        assertEquals("the credit rating is not 'POOR'", "POOR", result[1]);
     }
 
     // not sure how to write CriteriaQuery for
@@ -1150,19 +1021,19 @@
     @AllowFailure
     public void testGeneralCaseExpression4() {
         String query = "select e.name, e.creditRating from CompUser e "
-                + "where e.creditRating = "
-                + "(select "
-                + "CASE WHEN e1.age = 11 THEN "
-                + "org.apache.openjpa.persistence.criteria.CompUser$" +
-                		"CreditRating.POOR"
-                + " WHEN e1.age = 35 THEN "
-                + "org.apache.openjpa.persistence.criteria.CompUser$" +
-                		"CreditRating.GOOD"
-                + " ELSE "
-                + "org.apache.openjpa.persistence.criteria.CompUser$" +
-                		"CreditRating.EXCELLENT"
-                + " END from CompUser e1"
-                + " where e.userid = e1.userid) ORDER BY e.age";
+            + "where e.creditRating = "
+            + "(select "
+            + "CASE WHEN e1.age = 11 THEN "
+            + "org.apache.openjpa.persistence.criteria.CompUser$" 
+            + "CreditRating.POOR"
+            + " WHEN e1.age = 35 THEN "
+            + "org.apache.openjpa.persistence.criteria.CompUser$" 
+            + "CreditRating.GOOD"
+            + " ELSE "
+            + "org.apache.openjpa.persistence.criteria.CompUser$" 
+            + "CreditRating.EXCELLENT"
+            + " END from CompUser e1"
+            + " where e.userid = e1.userid) ORDER BY e.age";
         CriteriaQuery q = cb.create();
         Root<CompUser> e = q.from(CompUser.class);
         q.select(e.get(CompUser_.name), e.get(CompUser_.creditRating));

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=781621&r1=781620&r2=781621&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 Wed Jun  3 23:44:58 2009
@@ -116,7 +116,7 @@
         CriteriaQuery c = cb.create();
         Root<Account> account = c.from(Account.class);
         c.where(cb.in(account.get(Account_.name)).value("X").value("Y").value(
-                "Z"));
+        "Z"));
         assertEquivalence(c, jpql);
     }
 
@@ -186,26 +186,26 @@
     @AllowFailure(message = "Extra joins created in Criteria")
     public void testMultiLevelJoins() {
         String jpql = "SELECT c FROM Customer c JOIN c.orders o "
-                + "JOIN o.lineItems i WHERE i.product.productType = 'printer'";
+            + "JOIN o.lineItems i WHERE i.product.productType = 'printer'";
 
         CriteriaQuery c = cb.create();
         Root<Customer> cust = c.from(Customer.class);
         Join<Customer, Order> order = cust.join(Customer_.orders);
         Join<Order, LineItem> item = order.join(Order_.lineItems);
         c.select(cust.get(Customer_.name))
-            .where(cb.equal(item.get(LineItem_.product).
-            get(Product_.productType), "printer"));
-        
+            .where(cb.equal(item.get(LineItem_.product)
+            .get(Product_.productType), "printer"));
+
         assertEquivalence(c, jpql);
     }
 
     public void testJoinsNotPresentInWhereClause() {
         String jpql = "SELECT c FROM Customer c LEFT JOIN c.orders o "
-                + "WHERE c.status = 1";
+            + "WHERE c.status = 1";
         CriteriaQuery c = cb.create();
         Root<Customer> cust = c.from(Customer.class);
         Join<Customer, Order> order = cust
-                .join(Customer_.orders, JoinType.LEFT);
+        .join(Customer_.orders, JoinType.LEFT);
         c.where(cb.equal(cust.get(Customer_.status), 1)).select(cust);
 
         assertEquivalence(c, jpql);
@@ -214,7 +214,7 @@
     @AllowFailure(message = "Fetch joins not implemented")
     public void testFetchJoins() {
         String jpql = "SELECT d FROM Department LEFT JOIN FETCH d.employees "
-                + "WHERE d.deptNo = 1";
+            + "WHERE d.deptNo = 1";
         CriteriaQuery q = cb.create();
         Root<Department> d = q.from(Department.class);
         d.fetch(Department_.employees, JoinType.LEFT);
@@ -226,8 +226,8 @@
     @AllowFailure(message = "Invalid SQL is generated")
     public void testJoinedPathInProjection() {
         String jpql = "SELECT p.vendor FROM Employee e JOIN "
-                + "e.contactInfo.phones p "
-                + "WHERE e.contactInfo.address.zipCode = '95054'";
+            + "e.contactInfo.phones p "
+            + "WHERE e.contactInfo.address.zipCode = '95054'";
         CriteriaQuery q = cb.create();
         Root<Employee> emp = q.from(Employee.class);
         Join<Contact, Phone> phone = emp.join(Employee_.contactInfo).join(
@@ -243,7 +243,7 @@
     public void testKeyExpression() {
         String jpql =
             "SELECT i.name, p FROM Item i JOIN i.photos p WHERE KEY(p) "
-                + "LIKE '%egret%'";
+            + "LIKE '%egret%'";
         CriteriaQuery q = cb.create();
         Root<Item> item = q.from(Item.class);
         MapJoin<Item, String, Photo> photo = item.join(Item_.photos);
@@ -256,12 +256,12 @@
     @AllowFailure(message = "Index expression not implemented")
     public void testIndexExpression() {
         String jpql = "SELECT t FROM CreditCard c JOIN c.transactionHistory t "
-                + "WHERE c.customer.accountNum = 321987 AND INDEX(t) BETWEEN 0 "
-                + "AND 9";
+            + "WHERE c.customer.accountNum = 321987 AND INDEX(t) BETWEEN 0 "
+            + "AND 9";
         CriteriaQuery q = cb.create();
         Root<CreditCard> c = q.from(CreditCard.class);
         ListJoin<CreditCard, TransactionHistory> t = c
-                .join(CreditCard_.transactionHistory);
+        .join(CreditCard_.transactionHistory);
         q.select(t).where(
                 cb.equal(c.get(CreditCard_.customer).get(Customer_.accountNum),
                         321987), cb.between(t.index(), 0, 9));
@@ -278,65 +278,64 @@
         assertEquivalence(q, jpql);
     }
 
-//    @AllowFailure(message = "broken")
-//    public void testExpressionInProjection() {
-//        String jpql = "SELECT o.quantity, o.totalCost*1.08 AS taxedCost, "
-//                + "a.zipCode FROM Customer c JOIN c.orders o JOIN c.address a"
-//                + "WHERE a.state = 'CA' AND a.county = 'Santa Clara'";
-//        CriteriaQuery q = cb.create();
-//        Root<Customer> cust = q.from(Customer.class);
-//        Join<Customer, Order> order = cust.join(Customer_.orders);
-//        Join<Customer, Address> address = cust.join(Customer_.address);
-//        q.where(cb.equal(address.get(Address_.state), "CA"), cb.equal(address
-//                .get(Address_.county), "Santa Clara"));
-//        q.select(order.get(Order_.quantity), cb.prod(order
-//                .get(Order_.totalCost), 1.08), address.get(Address_.zipCode));
-//
-//        assertEquivalence(q, jpql);
-//    }
-
-    // @AllowFailure(message =
-    // "Type expression was working with Fay. Now refactored and broken")
-    // public void testTypeExpression() {
-    // String jpql = "SELECT TYPE(e) FROM Employee e WHERE TYPE(e) <> Exempt";
-    // CriteriaQuery q = cb.create();
-    // Root<Employee> emp = q.from(Employee.class);
-    // q.select(emp.type()).where(cb.notEqual(emp.type(), Exempt.class));
-    //
-    // assertEquivalence(q, jpql);
-    // }
-
-    // @AllowFailure(message = "Index expression not implemented")
-    // public void testIndexExpressionAndLietral() {
-    // String jpql = "SELECT w.name FROM Course c JOIN c.studentWaitList w "
-    // + "WHERE c.name = 'Calculus' AND INDEX(w) = 0";
-    // CriteriaQuery q = cb.create();
-    // Root<Course> course = q.from(Course.class);
-    // ListJoin<Course, Student> w = course.join(Course_.studentWaitList);
-    // q.where(cb.equal(course.get(Course_.name), "Calculus"),
-    // cb.equal(w.index(), 0)).select(w.get(Student_.name));
-    //
-    // assertEquivalence(q, jpql);
-    // }
-
-    // @AllowFailure(message = "SQL for Criteria has extra join")
-    // public void testAggregateInProjection() {
-    // String jpql = "SELECT SUM(i.price) FROM Order o JOIN o.lineItems i JOIN "
-    // + "o.customer c WHERE c.lastName = 'Smith' AND c.firstName = 'John'";
-    // CriteriaQuery q = cb.create();
-    // Root<Order> o = q.from(Order.class);
-    // Join<Order, LineItem> i = o.join(Order_.lineItems);
-    // Join<Order, Customer> c = o.join(Order_.customer);
-    // q.where(cb.equal(c.get(Customer_.lastName), "Smith"), cb.equal(c
-    // .get(Customer_.firstName), "John"));
-    // q.select(cb.sum(i.get(LineItem_.price)));
-    //
-    // assertEquivalence(q, jpql);
-    // }
+    @AllowFailure(message = "broken")
+    public void testExpressionInProjection() {
+        String jpql = "SELECT o.quantity, o.totalCost*1.08 AS taxedCost, "
+            + "a.zipCode FROM Customer c JOIN c.orders o JOIN c.address a"
+            + "WHERE a.state = 'CA' AND a.county = 'Santa Clara'";
+        CriteriaQuery q = cb.create();
+        Root<Customer> cust = q.from(Customer.class);
+        Join<Customer, Order> order = cust.join(Customer_.orders);
+        Join<Customer, Address> address = cust.join(Customer_.address);
+        q.where(cb.equal(address.get(Address_.state), "CA"), cb.equal(address
+                .get(Address_.county), "Santa Clara"));
+        q.select(order.get(Order_.quantity), cb.prod(order
+                .get(Order_.totalCost), 1.08), address.get(Address_.zipCode));
+
+        assertEquivalence(q, jpql);
+    }
+
+    public void testTypeExpression() {
+        String jpql = "SELECT TYPE(e) FROM Employee e WHERE TYPE(e) <> Exempt";
+        CriteriaQuery q = cb.create();
+        Root<Employee> emp = q.from(Employee.class);
+        q.select(emp.type()).where(cb.notEqual(emp.type(), Exempt.class));
+
+        assertEquivalence(q, jpql);
+    }
+
+    @AllowFailure(message = "Index expression not implemented")
+    public void testIndexExpressionAndLietral() {
+        String jpql = "SELECT w.name FROM Course c JOIN c.studentWaitList w "
+            + "WHERE c.name = 'Calculus' AND INDEX(w) = 0";
+        CriteriaQuery q = cb.create();
+        Root<Course> course = q.from(Course.class);
+        ListJoin<Course, Student> w = course.join(Course_.studentWaitList);
+        q.where(cb.equal(course.get(Course_.name), "Calculus"),
+                cb.equal(w.index(), 0)).select(w.get(Student_.name));
+
+        assertEquivalence(q, jpql);
+    }
+
+    @AllowFailure(message = "SQL for Criteria has extra join")
+    public void testAggregateInProjection() {
+        String jpql = "SELECT SUM(i.price) FROM Order o JOIN o.lineItems i " + 
+            "JOIN o.customer c WHERE c.lastName = 'Smith' AND " + 
+            "c.firstName = 'John'";
+        CriteriaQuery q = cb.create();
+        Root<Order> o = q.from(Order.class);
+        Join<Order, LineItem> i = o.join(Order_.lineItems);
+        Join<Order, Customer> c = o.join(Order_.customer);
+        q.where(cb.equal(c.get(Customer_.lastName), "Smith"), cb.equal(c
+                .get(Customer_.firstName), "John"));
+        q.select(cb.sum(i.get(LineItem_.price)));
+
+        assertEquivalence(q, jpql);
+    }
 
     public void testSizeExpression() {
         String jpql = "SELECT SIZE(d.employees) FROM Department d "
-                + "WHERE d.name = 'Sales'";
+            + "WHERE d.name = 'Sales'";
         CriteriaQuery q = cb.create();
         Root<Department> d = q.from(Department.class);
         q.where(cb.equal(d.get(Department_.name), "Sales"));
@@ -348,134 +347,114 @@
     public void testCaseExpression() {
         String jpql =
             "SELECT e.name, CASE WHEN e.rating = 1 THEN e.salary * 1.1 "
-                + "WHEN e.rating = 2 THEN e.salary * 1.2 ELSE e.salary * "
-                + "1.01 END "
-                + "FROM Employee e WHERE e.department.name = 'Engineering'";
+            + "WHEN e.rating = 2 THEN e.salary * 1.2 ELSE e.salary * "
+            + "1.01 END "
+            + "FROM Employee e WHERE e.department.name = 'Engineering'";
         CriteriaQuery q = cb.create();
         Root<Employee> e = q.from(Employee.class);
         q.where(cb.equal(e.get(Employee_.department).get(Department_.name),
-                "Engineering"));
+        "Engineering"));
         q.select(e.get(Employee_.name), cb.selectCase().when(
                 cb.equal(e.get(Employee_.rating), 1),
                 cb.prod(e.get(Employee_.salary), 1.1)).when(
-                cb.equal(e.get(Employee_.rating), 2),
-                cb.prod(e.get(Employee_.salary), 1.2)).otherwise(
-                cb.prod(e.get(Employee_.salary), 1.01)));
+                        cb.equal(e.get(Employee_.rating), 2),
+                        cb.prod(e.get(Employee_.salary), 1.2)).otherwise(
+                                cb.prod(e.get(Employee_.salary), 1.01)));
 
         assertEquivalence(q, jpql);
     }
 
-    // @AllowFailure(message = "Extra Joins created")
-    // public void testExpression1() {
-    // String jpql = "SELECT o.quantity, o.totalCost*1.08 AS taxedCost, "
-    // + "a.zipCode FROM Customer c JOIN c.orders o JOIN c.address a "
-    // + "WHERE a.state = 'CA' AND a.county = 'Santa Clara'";
-    // CriteriaQuery q = cb.create();
-    // Root<Customer> cust = q.from(Customer.class);
-    // Join<Customer, Order> order = cust.join(Customer_.orders);
-    // Join<Customer, Address> address = cust.join(Customer_.address);
-    // q.where(cb.equal(address.get(Address_.state), "CA"), cb.equal(address
-    // .get(Address_.county), "Santa Clara"));
-    // q.select(order.get(Order_.quantity), cb.prod(order
-    // .get(Order_.totalCost), 1.08), address.get(Address_.zipCode));
-    //
-    // assertEquivalence(q, jpql);
-    // }
-    //
-    // @AllowFailure(message = "Type expression in projection not implemented")
-    // public void testExpression2() {
-    // String jpql = "SELECT TYPE(e) FROM Employee e WHERE TYPE(e) <> Exempt";
-    // CriteriaQuery q = cb.create();
-    // Root<Employee> emp = q.from(Employee.class);
-    // q.select(emp.type()).where(cb.notEqual(emp.type(), Exempt.class));
-    //
-    // assertEquivalence(q, jpql);
-    // }
-    //
-    // @AllowFailure(message = "Index expression not implemented")
-    // public void testExpression3() {
-    // String jpql = "SELECT w.name FROM Course c JOIN c.studentWaitList w "
-    // + "WHERE c.name = 'Calculus' AND INDEX(w) = 0";
-    // CriteriaQuery q = cb.create();
-    // Root<Course> course = q.from(Course.class);
-    // ListJoin<Course, Student> w = course.join(Course_.studentWaitList);
-    // q.where(cb.equal(course.get(Course_.name), "Calculus"),
-    // cb.equal(w.index(), 0)).select(w.get(Student_.name));
-    //
-    // assertEquivalence(q, jpql);
-    // }
-    //
-    // @AllowFailure(message = "Generates extra Join")
-    // public void testExpression4() {
-    // String jpql = "SELECT SUM(i.price) FROM Order o JOIN o.lineItems i JOIN "
-    // + "o.customer c WHERE c.lastName = 'Smith' AND c.firstName = 'John'";
-    // CriteriaQuery q = cb.create();
-    // Root<Order> o = q.from(Order.class);
-    // Join<Order, LineItem> i = o.join(Order_.lineItems);
-    // Join<Order, Customer> c = o.join(Order_.customer);
-    // q.where(cb.equal(c.get(Customer_.lastName), "Smith"), cb.equal(c
-    // .get(Customer_.firstName), "John"));
-    // q.select(cb.sum(i.get(LineItem_.price)));
-    //
-    // assertEquivalence(q, jpql);
-    // }
-
-    public void testExpression5() {
-        String jpql = "SELECT SIZE(d.employees) FROM Department d "
-                + "WHERE d.name = 'Sales'";
+    @AllowFailure(message = "Extra Joins created")
+    public void testExpression1() {
+        String jpql = "SELECT o.quantity, o.totalCost*1.08 AS taxedCost, "
+            + "a.zipCode FROM Customer c JOIN c.orders o JOIN c.address a "
+            + "WHERE a.state = 'CA' AND a.county = 'Santa Clara'";
         CriteriaQuery q = cb.create();
-        Root<Department> d = q.from(Department.class);
-        q.where(cb.equal(d.get(Department_.name), "Sales"));
-        q.select(cb.size(d.get(Department_.employees)));
+        Root<Customer> cust = q.from(Customer.class);
+        Join<Customer, Order> order = cust.join(Customer_.orders);
+        Join<Customer, Address> address = cust.join(Customer_.address);
+        q.where(cb.equal(address.get(Address_.state), "CA"), cb.equal(address
+                .get(Address_.county), "Santa Clara"));
+        q.select(order.get(Order_.quantity), cb.prod(order
+                .get(Order_.totalCost), 1.08), address.get(Address_.zipCode));
+
+        assertEquivalence(q, jpql);
+    }
+
+    @AllowFailure(message = "Index expression not implemented")
+    public void testExpression3() {
+        String jpql = "SELECT w.name FROM Course c JOIN c.studentWaitList w "
+            + "WHERE c.name = 'Calculus' AND INDEX(w) = 0";
+        CriteriaQuery q = cb.create();
+        Root<Course> course = q.from(Course.class);
+        ListJoin<Course, Student> w = course.join(Course_.studentWaitList);
+        q.where(cb.equal(course.get(Course_.name), "Calculus"),
+                cb.equal(w.index(), 0)).select(w.get(Student_.name));
+
+        assertEquivalence(q, jpql);
+    }
+
+    @AllowFailure(message = "Generates extra Join")
+    public void testExpression4() {
+        String jpql = "SELECT SUM(i.price) FROM Order o JOIN o.lineItems i " + 
+            "JOIN o.customer c WHERE c.lastName = 'Smith' AND " + 
+            "c.firstName = 'John'";
+        CriteriaQuery q = cb.create();
+        Root<Order> o = q.from(Order.class);
+        Join<Order, LineItem> i = o.join(Order_.lineItems);
+        Join<Order, Customer> c = o.join(Order_.customer);
+        q.where(cb.equal(c.get(Customer_.lastName), "Smith"), cb.equal(c
+                .get(Customer_.firstName), "John"));
+        q.select(cb.sum(i.get(LineItem_.price)));
 
         assertEquivalence(q, jpql);
     }
 
     public void testGeneralCaseExpression() {
         String jpql = "SELECT e.name, CASE "
-                + "WHEN e.rating = 1 THEN e.salary * 1.1 "
-                + "WHEN e.rating = 2 THEN e.salary * 1.2 ELSE e.salary * "
-                + "1.01 END "
-                + "FROM Employee e WHERE e.department.name = 'Engineering'";
+            + "WHEN e.rating = 1 THEN e.salary * 1.1 "
+            + "WHEN e.rating = 2 THEN e.salary * 1.2 ELSE e.salary * "
+            + "1.01 END "
+            + "FROM Employee e WHERE e.department.name = 'Engineering'";
         CriteriaQuery q = cb.create();
         Root<Employee> e = q.from(Employee.class);
         q.where(cb.equal(e.get(Employee_.department).get(Department_.name),
-                "Engineering"));
+        "Engineering"));
         q.select(e.get(Employee_.name), cb.selectCase().when(
                 cb.equal(e.get(Employee_.rating), 1),
                 cb.prod(e.get(Employee_.salary), 1.1)).when(
-                cb.equal(e.get(Employee_.rating), 2),
-                cb.prod(e.get(Employee_.salary), 1.2)).otherwise(
-                cb.prod(e.get(Employee_.salary), 1.01)));
+                        cb.equal(e.get(Employee_.rating), 2),
+                        cb.prod(e.get(Employee_.salary), 1.2)).otherwise(
+                                cb.prod(e.get(Employee_.salary), 1.01)));
 
         assertEquivalence(q, jpql);
     }
 
     public void testSimpleCaseExpression1() {
         String jpql = "SELECT e.name, CASE e.rating "
-                + "WHEN 1 THEN e.salary * 1.1 "
-                + "WHEN 2 THEN e.salary * 1.2 ELSE e.salary * 1.01 END "
-                + "FROM Employee e WHERE e.department.name = 'Engineering'";
+            + "WHEN 1 THEN e.salary * 1.1 "
+            + "WHEN 2 THEN e.salary * 1.2 ELSE e.salary * 1.01 END "
+            + "FROM Employee e WHERE e.department.name = 'Engineering'";
         CriteriaQuery q = cb.create();
         Root<Employee> e = q.from(Employee.class);
         q.where(cb.equal(e.get(Employee_.department).get(Department_.name),
-                "Engineering"));
+        "Engineering"));
         q.select(e.get(Employee_.name), cb.selectCase(e.get(Employee_.rating))
                 .when(1, cb.prod(e.get(Employee_.salary), 1.1)).when(2,
                         cb.prod(e.get(Employee_.salary), 1.2)).otherwise(
-                        cb.prod(e.get(Employee_.salary), 1.01)));
+                                cb.prod(e.get(Employee_.salary), 1.01)));
 
         assertEquivalence(q, jpql);
     }
 
     public void testSimpleCaseExpression2() {
         String jpql = "SELECT e.name, CASE e.rating WHEN 1 THEN 10 "
-                + "WHEN 2 THEN 20 ELSE 30 END "
-                + "FROM Employee e WHERE e.department.name = 'Engineering'";
+            + "WHEN 2 THEN 20 ELSE 30 END "
+            + "FROM Employee e WHERE e.department.name = 'Engineering'";
         CriteriaQuery q = cb.create();
         Root<Employee> e = q.from(Employee.class);
         q.where(cb.equal(e.get(Employee_.department).get(Department_.name),
-                "Engineering"));
+        "Engineering"));
         q.select(e.get(Employee_.name), cb.selectCase(e.get(Employee_.rating))
                 .when(1, 10).when(2, 20).otherwise(30));
         assertEquivalence(q, jpql);
@@ -483,7 +462,7 @@
 
     public void testLiterals() {
         String jpql = "SELECT p FROM Person p where 'Joe' MEMBER OF " +
-        		"p.nickNames";
+        "p.nickNames";
         CriteriaQuery q = cb.create();
         Root<Person> p = q.from(Person.class);
         q.select(p).where(
@@ -492,7 +471,6 @@
         assertEquivalence(q, jpql);
     }
 
-    // @AllowFailure(message = "Parameters not implemented")
     public void testParameters1() {
         String jpql = "SELECT c FROM Customer c Where c.status = :stat";
         CriteriaQuery q = cb.create();
@@ -505,7 +483,7 @@
 
     public void testParameters2() {
         String jpql = "SELECT c FROM Customer c Where c.status = :stat AND "
-                + "c.name = :name";
+            + "c.name = :name";
         CriteriaQuery q = cb.create();
         Root<Customer> c = q.from(Customer.class);
         Parameter<Integer> param1 = cb.parameter(Integer.class, "stat");
@@ -527,21 +505,22 @@
         assertEquivalence(q, jpql, new Object[] { 1 });
     }
 
-    // @AllowFailure(message="add QuotedNumbersInQueries=true otherwise " + 
-    // "AbstractExpressionBuilder.convertTypes() compliants")
-    // public void testParameters4() {
-    // String jpql = "SELECT c FROM Customer c Where c.status = ?1 AND "
-    // + "c.name = ?2";
-    // CriteriaQuery q = cb.create();
-    // Root<Customer> c = q.from(Customer.class);
-    // Parameter<Integer> param1 = cb.parameter(Integer.class);
-    // Parameter<Integer> param2 = cb.parameter(Integer.class);
-    // q.select(c).where(
-    // cb.and(cb.equal(c.get(Customer_.status), param1), cb.equal(c
-    // .get(Customer_.name), param2)));
-    // assertEquivalence(q, jpql, new Object[] { 1, "test" });
-    // }
-
+    @AllowFailure(message="add QuotedNumbersInQueries=true otherwise " + 
+    "AbstractExpressionBuilder.convertTypes() compliants")
+    public void testParameters4() {
+        String jpql = "SELECT c FROM Customer c Where c.status = ?1 AND "
+            + "c.name = ?2";
+        CriteriaQuery q = cb.create();
+        Root<Customer> c = q.from(Customer.class);
+        Parameter<Integer> param1 = cb.parameter(Integer.class);
+        Parameter<Integer> param2 = cb.parameter(Integer.class);
+        q.select(c).where(
+                cb.and(cb.equal(c.get(Customer_.status), param1), cb.equal(c
+                        .get(Customer_.name), param2)));
+        assertEquivalence(q, jpql, new Object[] { 1, "test" });
+    }
+    
+    @AllowFailure(message = "Criteria API does not allow collection parameter")
     public void testParameters5() {
         String jpql = "SELECT c FROM Customer c Where c.status IN (:coll)";
         CriteriaQuery q = cb.create();
@@ -551,147 +530,176 @@
         List vals = new ArrayList();
         vals.add(1);
         vals.add(2);
+        assertEquivalence(q, jpql, new String[] {"coll"}, 
+            new Object[] {vals});
+    }
+    
+    @AllowFailure(message="Value() expression not implemented")
+    public void testSelectList1() {
+        String jpql = "SELECT v.location.street, KEY(i).title, VALUE(i) FROM "
+            + "VideoStore v JOIN v.videoInventory i WHERE v.location.zipCode = "
+            + "'94301' AND VALUE(i) > 0";
+        CriteriaQuery q = cb.create();
+        Root<VideoStore> v = q.from(VideoStore.class);
+        MapJoin<VideoStore, Movie, Integer> inv = v
+        .join(VideoStore_.videoInventory);
+        q.where(cb.equal(v.get(VideoStore_.location).get(Address_.zipCode),
+        "94301"), cb.gt(inv.value(), 0));
+        q.select(v.get(VideoStore_.location).get(Address_.street), inv.key()
+                .get(Movie_.title), inv.value());
+
+        assertEquivalence(q, jpql);
+    }
+
+    public void testNewConstruct() {
+        String jpql = "SELECT NEW CustomerDetails(c.id, c.status) FROM "
+            + "Customer c";
+        
+        CriteriaQuery q = cb.create();
+
+        Root<Customer> c = q.from(Customer.class);
+        q.select(cb.select(CustomerDetails.class, c.get(Customer_.id), 
+                c.get(Customer_.status))
+        );
+        assertEquivalence(q, jpql);
+    }
+    
+    @AllowFailure(message="new() in projection with join is broken")
+    public void testNewConstruct1() {
+        String jpql =
+            "SELECT NEW CustomerDetails(c.id, c.status, o.quantity) FROM "
+            + "Customer c JOIN c.orders o WHERE o.quantity > 100";
+        CriteriaQuery q = cb.create();
+        Root<Customer> c = q.from(Customer.class);
+        Join<Customer, Order> o = c.join(Customer_.orders);
+        q.where(cb.gt(o.get(Order_.quantity), 100));
+        q.select(cb.select(CustomerDetails.class, c.get(Customer_.id), c
+                .get(Customer_.status), o.get(Order_.quantity)));
+
+        assertEquivalence(q, jpql);
+    }
 
-        // assertEquivalence(q, jpql, new String[] {"coll"}, new Object[]
-        // {vals});
+    @AllowFailure(message="JPQL does not support multiple constructors")
+    public void testNewConstruct2() {
+        String jpql = "SELECT NEW CustomerDetails(c.id, c.status), " +
+                "NEW CustomerFullName(c.firstName, c.lastName) FROM "
+            + "Customer c";
+        
+        CriteriaQuery q = cb.create();
+        Root<Customer> c = q.from(Customer.class);
+        q.select(cb.select(CustomerDetails.class, c.get(Customer_.id), 
+                c.get(Customer_.status)),
+                cb.select(CustomerFullName.class, c.get(Customer_.firstName), 
+                c.get(Customer_.lastName))
+        );
+        assertEquivalence(q, jpql);
+    }
+
+    
+    
+    public void testSubqueries1() {
+        String jpql = "SELECT goodCustomer FROM Customer goodCustomer WHERE "
+            + "goodCustomer.balanceOwed < (SELECT AVG(c.balanceOwed) " 
+            + " FROM "
+            + "Customer c)";
+        CriteriaQuery q = cb.create();
+        Root<Customer> goodCustomer = q.from(Customer.class);
+        Subquery<Double> sq = q.subquery(Double.class);
+        Root<Customer> c = sq.from(Customer.class);
+        q.where(cb.lt(goodCustomer.get(Customer_.balanceOwed), sq.select(cb
+                .avg(c.get(Customer_.balanceOwed)))));
+        q.select(goodCustomer);
+
+        assertEquivalence(q, jpql);
+    }
+
+    @AllowFailure(message="SQL is incorrect for JPQL, correct for Criteria")
+    public void testSubqueries2() {
+        String jpql = "SELECT DISTINCT emp FROM Employee emp WHERE EXISTS ("
+            + "SELECT spouseEmp FROM Employee spouseEmp WHERE spouseEmp ="
+            + " emp.spouse)";
+        CriteriaQuery q = cb.create();
+        Root<Employee> emp = q.from(Employee.class);
+        Subquery<Employee> sq = q.subquery(Employee.class);
+        Root<Employee> spouseEmp = sq.from(Employee.class);
+        sq.select(spouseEmp);
+        sq.where(cb.equal(spouseEmp, emp.get(Employee_.spouse)));
+        q.where(cb.exists(sq));
+        q.select(emp).distinct(true);
+
+        assertEquivalence(q, jpql);
+    }
+
+    public void testSubqueries3() {
+        String jpql = "SELECT emp FROM Employee emp WHERE emp.salary > ALL ("
+            + "SELECT m.salary FROM Manager m WHERE m.department = "
+            + "emp.department)";
+        CriteriaQuery q = cb.create();
+        Root<Employee> emp = q.from(Employee.class);
+        q.select(emp);
+        Subquery<BigDecimal> sq = q.subquery(BigDecimal.class);
+        Root<Manager> m = sq.from(Manager.class);
+        sq.select(m.get(Manager_.salary));
+        sq.where(cb.equal(m.get(Manager_.department), emp
+                .get(Employee_.department)));
+        q.where(cb.gt(emp.get(Employee_.salary), cb.all(sq)));
+
+        assertEquivalence(q, jpql);
+    }
+
+    @AllowFailure(message="SQL is incorrect for JPQL, correct for " + 
+        "Criteria is correct with redundant outer joins")
+    public void testSubqueries4() {
+        String jpql = "SELECT c FROM Customer c WHERE "
+            + "(SELECT COUNT(o) FROM c.orders o) > 10";
+        CriteriaQuery q = cb.create();
+        Root<Customer> c1 = q.from(Customer.class);
+        q.select(c1);
+        Subquery<Long> sq3 = q.subquery(Long.class);
+        Root<Customer> c2 = sq3.correlate(c1);
+        Join<Customer, Order> o = c2.join(Customer_.orders);
+        q.where(cb.gt(sq3.select(cb.count(o)), 10));
+
+        assertEquivalence(q, jpql);
+    }
+
+    @AllowFailure(message="Subqueries not implemented")
+    public void testSubqueries5() {
+        String jpql = "SELECT o FROM Order o WHERE 10000 < ALL ("
+            + "SELECT a.balance FROM o.customer c JOIN c.accounts a)";
+        CriteriaQuery q = cb.create();
+        Root<Order> o = q.from(Order.class);
+        q.select(o);
+        Subquery<Integer> sq = q.subquery(Integer.class);
+        Root<Order> osq = sq.correlate(o);
+        Join<Order, Customer> c = osq.join(Order_.customer);
+        Join<Customer, Account> a = c.join(Customer_.accounts);
+        sq.select(a.get(Account_.balance));
+        q.where(cb.lt(cb.literal(10000), cb.all(sq)));
+
+        assertEquivalence(q, jpql);
     }
 
-    // @AllowFailure(message="Value() expression not implemented")
-    // public void testSelectList1() {
-    // String jpql = "SELECT v.location.street, KEY(i).title, VALUE(i) FROM "
-    // + "VideoStore v JOIN v.videoInventory i WHERE v.location.zipCode = "
-    // + "'94301' AND VALUE(i) > 0";
-    // CriteriaQuery q = cb.create();
-    // Root<VideoStore> v = q.from(VideoStore.class);
-    // MapJoin<VideoStore, Movie, Integer> inv = v
-    // .join(VideoStore_.videoInventory);
-    // q.where(cb.equal(v.get(VideoStore_.location).get(Address_.zipCode),
-    // "94301"), cb.gt(inv.value(), 0));
-    // q.select(v.get(VideoStore_.location).get(Address_.street), inv.key()
-    // .get(Movie_.title), inv.value());
-    //
-    // assertEquivalence(q, jpql);
-    // }
-    //
-    // @AllowFailure(message="new() in projection is broken")
-    // public void testSelectList2() {
-    // String jpql =
-    // "SELECT NEW CustomerDetails(c.id, c.status, o.quantity) FROM "
-    // + "Customer c JOIN c.orders o WHERE o.quantity > 100";
-    // CriteriaQuery q = cb.create();
-    // Root<Customer> c = q.from(Customer.class);
-    // Join<Customer, Order> o = c.join(Customer_.orders);
-    // q.where(cb.gt(o.get(Order_.quantity), 100));
-    // q.select(cb.select(CustomerDetails.class, c.get(Customer_.id), c
-    // .get(Customer_.status), o.get(Order_.quantity)));
-    //
-    // assertEquivalence(q, jpql);
-    // }
-
-//    @AllowFailure(message="Subqueries not implemented")
-//    public void testSubqueries1() {
-//        String jpql = "SELECT goodCustomer FROM Customer goodCustomer WHERE "
-//                + "goodCustomer.balanceOwed < (SELECT AVG(c.balanceOwed) " 
-//                + " FROM "
-//                + "Customer c)";
-//        CriteriaQuery q = cb.create();
-//        Root<Customer> goodCustomer = q.from(Customer.class);
-//        Subquery<Double> sq = q.subquery(Double.class);
-//        Root<Customer> c = sq.from(Customer.class);
-//        q.where(cb.lt(goodCustomer.get(Customer_.balanceOwed), sq.select(cb
-//                .avg(c.get(Customer_.balanceOwed)))));
-//        q.select(goodCustomer);
-//
-//        assertEquivalence(q, jpql);
-//    }
-//
-//    @AllowFailure(message="Subqueries not implemented")
-//    public void testSubqueries2() {
-//        String jpql = "SELECT DISTINCT emp FROM Employee emp WHERE EXISTS ("
-//                + "SELECT spouseEmp FROM Employee spouseEmp WHERE spouseEmp ="
-//                + " emp.spouse)";
-//        CriteriaQuery q = cb.create();
-//        Root<Employee> emp = q.from(Employee.class);
-//        Subquery<Employee> sq = q.subquery(Employee.class);
-//        Root<Employee> spouseEmp = sq.from(Employee.class);
-//        sq.select(spouseEmp);
-//        sq.where(cb.equal(spouseEmp, emp.get(Employee_.spouse)));
-//        q.where(cb.exists(sq));
-//        q.select(emp).distinct(true);
-//
-//        assertEquivalence(q, jpql);
-//    }
-//
-//    @AllowFailure(message="Subqueries not implemented")
-//    public void testSubqueries3() {
-//        String jpql = "SELECT emp FROM Employee emp WHERE emp.salary > ALL ("
-//                + "SELECT m.salary FROM Manager m WHERE m.department = "
-//                + "emp.department)";
-//        CriteriaQuery q = cb.create();
-//        Root<Employee> emp = q.from(Employee.class);
-//        q.select(emp);
-//        Subquery<BigDecimal> sq = q.subquery(BigDecimal.class);
-//        Root<Manager> m = sq.from(Manager.class);
-//        sq.select(m.get(Manager_.salary));
-//        sq.where(cb.equal(m.get(Manager_.department), emp
-//                .get(Employee_.department)));
-//        q.where(cb.gt(emp.get(Employee_.salary), cb.all(sq)));
-//
-//        assertEquivalence(q, jpql);
-//    }
-//
-//    @AllowFailure(message="Subqueries not implemented")
-//    public void testSubqueries4() {
-//        String jpql = "SELECT c FROM Customer c WHERE "
-//                + "(SELECT COUNT(o) FROM c.orders o) > 10";
-//        CriteriaQuery q = cb.create();
-//        Root<Customer> c1 = q.from(Customer.class);
-//        q.select(c1);
-//        Subquery<Long> sq3 = q.subquery(Long.class);
-//        Root<Customer> c2 = sq3.correlate(c1);
-//        Join<Customer, Order> o = c2.join(Customer_.orders);
-//        q.where(cb.gt(sq3.select(cb.count(o)), 10));
-//
-//        assertEquivalence(q, jpql);
-//    }
-//
-//    @AllowFailure(message="Subqueries not implemented")
-//    public void testSubqueries5() {
-//        String jpql = "SELECT o FROM Order o WHERE 10000 < ALL ("
-//                + "SELECT a.balance FROM o.customer c JOIN c.accounts a)";
-//        CriteriaQuery q = cb.create();
-//        Root<Order> o = q.from(Order.class);
-//        q.select(o);
-//        Subquery<Integer> sq = q.subquery(Integer.class);
-//        Root<Order> osq = sq.correlate(o);
-//        Join<Order, Customer> c = osq.join(Order_.customer);
-//        Join<Customer, Account> a = c.join(Customer_.accounts);
-//        sq.select(a.get(Account_.balance));
-//        q.where(cb.lt(cb.literal(10000), cb.all(sq)));
-//
-//        assertEquivalence(q, jpql);
-//    }
-//
-//    @AllowFailure(message="Subqueries not implemented")
-//    public void testSubqueries6() {
-//        String jpql = "SELECT o FROM Order o JOIN o.customer c WHERE 10000 < "
-//                + "ALL (SELECT a.balance FROM c.accounts a)";
-//        CriteriaQuery q = cb.create();
-//        Root<Order> o = q.from(Order.class);
-//        q.select(o);
-//        Join<Order, Customer> c = o.join(Order_.customer);
-//        Subquery<Integer> sq = q.subquery(Integer.class);
-//        Join<Order, Customer> csq = sq.correlate(c);
-//        Join<Customer, Account> a = csq.join(Customer_.accounts);
-//        sq.select(a.get(Account_.balance));
-//        q.where(cb.lt(cb.literal(10000), cb.all(sq)));
-//
-//        assertEquivalence(q, jpql);
-//    }
+    @AllowFailure(message="Subqueries not implemented")
+    public void testSubqueries6() {
+        String jpql = "SELECT o FROM Order o JOIN o.customer c WHERE 10000 < "
+            + "ALL (SELECT a.balance FROM c.accounts a)";
+        CriteriaQuery q = cb.create();
+        Root<Order> o = q.from(Order.class);
+        q.select(o);
+        Join<Order, Customer> c = o.join(Order_.customer);
+        Subquery<Integer> sq = q.subquery(Integer.class);
+        Join<Order, Customer> csq = sq.correlate(c);
+        Join<Customer, Account> a = csq.join(Customer_.accounts);
+        sq.select(a.get(Account_.balance));
+        q.where(cb.lt(cb.literal(10000), cb.all(sq)));
+
+        assertEquivalence(q, jpql);
+    }
 
     public void testGroupByAndHaving() {
         String jpql = "SELECT c.status, AVG(c.filledOrderCount), COUNT(c) FROM "
-                + "Customer c GROUP BY c.status HAVING c.status IN (1, 2)";
+            + "Customer c GROUP BY c.status HAVING c.status IN (1, 2)";
         CriteriaQuery q = cb.create();
         Root<Customer> c = q.from(Customer.class);
         q.groupBy(c.get(Customer_.status));
@@ -702,137 +710,84 @@
         assertEquivalence(q, jpql);
     }
 
-    // @AllowFailure(message="AbstractExpressionExecutor.assertNotContainer() 
-    // not happy")
-    // public void testOrdering() {
-    // String jpql = "SELECT c FROM Customer c JOIN c.orders o "
-    // + "JOIN c.address a WHERE a.state = 'CA' ORDER BY o.quantity DESC, "
-    // + "o.totalCost";
-    // CriteriaQuery q = cb.create();
-    // Root<Customer> c = q.from(Customer.class);
-    // Join<Customer, Order> o = c.join(Customer_.orders);
-    // Join<Customer, Address> a = c.join(Customer_.address);
-    // q.where(cb.equal(a.get(Address_.state), "CA"));
-    // q.orderBy(cb.desc(o.get(Order_.quantity)), cb.asc(o
-    // .get(Order_.totalCost)));
-    // q.select(o);
-    //
-    // assertEquivalence(q, jpql);
-    //
-    // jpql = "SELECT o.quantity, a.zipCode FROM Customer c JOIN c.orders "
-    // + "JOIN c.address a WHERE a.state = 'CA' ORDER BY o.quantity, "
-    // + "a.zipCode";
-    // q = cb.create();
-    // Root<Customer> c1 = q.from(Customer.class);
-    // Join<Customer, Order> o1 = c1.join(Customer_.orders);
-    // Join<Customer, Address> a1 = c1.join(Customer_.address);
-    // q.where(cb.equal(a1.get(Address_.state), "CA"));
-    // q.orderBy(cb.asc(o1.get(Order_.quantity)), cb.asc(a1
-    // .get(Address_.zipCode)));
-    // q.select(o1.get(Order_.quantity), a1.get(Address_.zipCode));
-    //
-    // assertEquivalence(q, jpql);
-    //
-    // jpql = "SELECT o.quantity, o.cost * 1.08 AS taxedCost, a.zipCode "
-    // + "FROM Customer c JOIN c.orders o JOIN c.address a "
-    // + "WHERE a.state = 'CA' AND a.county = 'Santa Clara' "
-    // + "ORDER BY o.quantity, taxedCost, a.zipCode";
-    // q = cb.create();
-    // Root<Customer> c2 = q.from(Customer.class);
-    // Join<Customer, Order> o2 = c2.join(Customer_.orders);
-    // Join<Customer, Address> a2 = c2.join(Customer_.address);
-    // q.where(cb.equal(a.get(Address_.state), "CA"), cb.equal(a
-    // .get(Address_.county), "Santa Clara"));
-    // q.orderBy(cb.asc(o.get(Order_.quantity)), cb.asc(cb.prod(
-    // o.get(Order_.totalCost), 1.08)),
-    // cb.asc(a.get(Address_.zipCode)));
-    // q.select(o.get(Order_.quantity), cb.prod(
-    // o.get(Order_.totalCost), 1.08), a.get(Address_.zipCode));
-    //
-    // assertEquivalence(q, jpql);
-    // }
-    //
-    // @AllowFailure(message="AbstractExpressionExecutor.assertNotContainer()"+
-    // "not happy")
-    // public void testOrdering1() {
-    // String jpql = "SELECT o FROM Customer c JOIN c.orders o "
-    // + "JOIN c.address a WHERE a.state = 'CA' ORDER BY o.quantity DESC, "
-    // + "o.totalCost";
-    // CriteriaQuery q = cb.create();
-    // Root<Customer> c = q.from(Customer.class);
-    // Join<Customer, Order> o = c.join(Customer_.orders);
-    // Join<Customer, Address> a = c.join(Customer_.address);
-    // q.where(cb.equal(a.get(Address_.state), "CA"));
-    // q.orderBy(cb.desc(o.get(Order_.quantity)), cb.asc(o
-    // .get(Order_.totalCost)));
-    // q.select(o);
-    //
-    // assertEquivalence(q, jpql);
-    // }
-    //
-    // @AllowFailure(message="The JPQL is broken!")
-    // public void testOrdering2() {
-    // String jpql = "SELECT o.quantity, a.zipCode FROM Customer c "
-    // + "JOIN c.orders JOIN c.address a WHERE a.state = 'CA' "
-    // + "ORDER BY o.quantity, a.zipCode";
-    // CriteriaQuery q = cb.create();
-    // Root<Customer> c = q.from(Customer.class);
-    // Join<Customer, Order> o = c.join(Customer_.orders);
-    // Join<Customer, Address> a = c.join(Customer_.address);
-    // q.where(cb.equal(a.get(Address_.state), "CA"));
-    // q.orderBy(cb.asc(o.get(Order_.quantity)), cb.asc(a
-    // .get(Address_.zipCode)));
-    // q.select(o.get(Order_.quantity), a.get(Address_.zipCode));
-    //
-    // assertEquivalence(q, jpql);
-    // }
-    //
-    // @AllowFailure(message="QueryExpression.ordering not initialized")
-    // public void testOrdering3() {
-    // String jpql = "SELECT o.quantity, o.totalCost * 1.08 AS taxedCost, "
-    // + "a.zipCode FROM Customer c JOIN c.orders o JOIN c.address a "
-    // + "WHERE a.state = 'CA' AND a.county = 'Santa Clara' "
-    // + "ORDER BY o.quantity, taxedCost, a.zipCode";
-    // CriteriaQuery q = cb.create();
-    // Root<Customer> c = q.from(Customer.class);
-    // Join<Customer, Order> o = c.join(Customer_.orders);
-    // Join<Customer, Address> a = c.join(Customer_.address);
-    // q.where(cb.equal(a.get(Address_.state), "CA"), cb.equal(a
-    // .get(Address_.county), "Santa Clara"));
-    // q.orderBy(cb.asc(o.get(Order_.quantity)), cb.asc(cb.prod(
-    // o.get(Order_.totalCost), 1.08)),
-    // cb.asc(a.get(Address_.zipCode)));
-    // q.select(o.get(Order_.quantity), cb.prod(
-    // o.get(Order_.totalCost), 1.08), a.get(Address_.zipCode));
-    //
-    // assertEquivalence(q, jpql);
-    // }
-    //
-    //
-    // @AllowFailure(message="QueryExpression.ordering not initialized")
-    // public void testOrdering4() {
-    // String jpql = "SELECT c FROM Customer c "
-    // + "ORDER BY c.name DESC, c.status";
-    // CriteriaQuery q = cb.create();
-    // Root<Customer> c = q.from(Customer.class);
-    // q.orderBy(cb.desc(c.get(Customer_.name)), cb.asc(c
-    // .get(Customer_.status)));
-    // q.select(c);
-    //
-    // assertEquivalence(q, jpql);
-    // }
-    //
-    // @AllowFailure(message="QueryExpression.ordering not initialized")
-    // public void testOrdering5() {
-    // String jpql = "SELECT c.firstName, c.lastName, c.balanceOwed "
-    // + "FROM Customer c ORDER BY c.name DESC, c.status";
-    // CriteriaQuery q = cb.create();
-    // Root<Customer> c = q.from(Customer.class);
-    // q.orderBy(cb.desc(c.get(Customer_.name)), cb.asc(c
-    // .get(Customer_.status)));
-    // q.select(c.get(Customer_.firstName), c.get(Customer_.lastName), c
-    // .get(Customer_.balanceOwed));
-    //
-    // assertEquivalence(q, jpql);
-    // }
+    @AllowFailure(message="AbstractExpressionExecutor.assertNotContainer()"+
+    "not happy")
+    public void testOrdering1() {
+        String jpql = "SELECT o FROM Customer c JOIN c.orders o "
+            + "JOIN c.address a WHERE a.state = 'CA' ORDER BY o.quantity DESC, "
+            + "o.totalCost";
+        CriteriaQuery q = cb.create();
+        Root<Customer> c = q.from(Customer.class);
+        Join<Customer, Order> o = c.join(Customer_.orders);
+        Join<Customer, Address> a = c.join(Customer_.address);
+        q.where(cb.equal(a.get(Address_.state), "CA"));
+        q.orderBy(cb.desc(o.get(Order_.quantity)), cb.asc(o
+                .get(Order_.totalCost)));
+        q.select(o);
+
+        assertEquivalence(q, jpql);
+    }
+
+    @AllowFailure
+    public void testOrdering2() {
+        String jpql = "SELECT o.quantity, a.zipCode FROM Customer c "
+            + "JOIN c.orders o JOIN c.address a WHERE a.state = 'CA' "
+            + "ORDER BY o.quantity, a.zipCode";
+        CriteriaQuery q = cb.create();
+        Root<Customer> c = q.from(Customer.class);
+        Join<Customer, Order> o = c.join(Customer_.orders);
+        Join<Customer, Address> a = c.join(Customer_.address);
+        q.where(cb.equal(a.get(Address_.state), "CA"));
+        q.orderBy(cb.asc(o.get(Order_.quantity)), cb.asc(a
+                .get(Address_.zipCode)));
+        q.select(o.get(Order_.quantity), a.get(Address_.zipCode));
+
+        assertEquivalence(q, jpql);
+    }
+
+    @AllowFailure
+    public void testOrdering3() {
+        String jpql = "SELECT o.quantity, o.totalCost * 1.08 AS taxedCost, "
+            + "a.zipCode FROM Customer c JOIN c.orders o JOIN c.address a "
+            + "WHERE a.state = 'CA' AND a.county = 'Santa Clara' "
+            + "ORDER BY o.quantity, taxedCost, a.zipCode";
+        CriteriaQuery q = cb.create();
+        Root<Customer> c = q.from(Customer.class);
+        Join<Customer, Order> o = c.join(Customer_.orders);
+        Join<Customer, Address> a = c.join(Customer_.address);
+        q.where(cb.equal(a.get(Address_.state), "CA"), cb.equal(a
+                .get(Address_.county), "Santa Clara"));
+        q.orderBy(cb.asc(o.get(Order_.quantity)), cb.asc(cb.prod(
+                o.get(Order_.totalCost), 1.08)),
+                cb.asc(a.get(Address_.zipCode)));
+        q.select(o.get(Order_.quantity), cb.prod(
+                o.get(Order_.totalCost), 1.08), a.get(Address_.zipCode));
+
+        assertEquivalence(q, jpql);
+    }
+    
+    public void testOrdering4() {
+        String jpql = "SELECT c FROM Customer c "
+            + "ORDER BY c.name DESC, c.status";
+        CriteriaQuery q = cb.create();
+        Root<Customer> c = q.from(Customer.class);
+        q.orderBy(cb.desc(c.get(Customer_.name)), cb.asc(c
+                .get(Customer_.status)));
+        q.select(c);
+
+        assertEquivalence(q, jpql);
+    }
+
+    public void testOrdering5() {
+        String jpql = "SELECT c.firstName, c.lastName, c.balanceOwed "
+            + "FROM Customer c ORDER BY c.name DESC, c.status";
+        CriteriaQuery q = cb.create();
+        Root<Customer> c = q.from(Customer.class);
+        q.orderBy(cb.desc(c.get(Customer_.name)), cb.asc(c
+                .get(Customer_.status)));
+        q.select(c.get(Customer_.firstName), c.get(Customer_.lastName), c
+                .get(Customer_.balanceOwed));
+
+        assertEquivalence(q, jpql);
+    }
 }

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaBuilder.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaBuilder.java?rev=781621&r1=781620&r2=781621&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaBuilder.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaBuilder.java Wed Jun  3 23:44:58 2009
@@ -96,7 +96,7 @@
     }
 
     public <Y> Expression<Y> all(Subquery<Y> subquery) {
-        throw new AbstractMethodError();
+        return new Expressions.All<Y>(subquery);
     }
 
     public Predicate and(Predicate... restrictions) {
@@ -108,7 +108,7 @@
     }
 
     public <Y> Expression<Y> any(Subquery<Y> subquery) {
-        throw new AbstractMethodError();
+        return new Expressions.Any<Y>(subquery);
     }
 
     public Order asc(Expression<?> x) {
@@ -208,15 +208,19 @@
     }
 
     public Predicate equal(Expression<?> x, Expression<?> y) {
+        if (y == null)
+            return new Expressions.IsNull((ExpressionImpl<?> )x);
         return new Expressions.Equal(x, y);
     }
 
     public Predicate equal(Expression<?> x, Object y) {
+        if (y == null)
+            return new Expressions.IsNull((ExpressionImpl<?> )x);
         return new Expressions.Equal(x, y);
     }
 
     public Predicate exists(Subquery<?> subquery) {
-        throw new AbstractMethodError();
+        return new Expressions.Exists(subquery);
     }
 
     public <T> Expression<T> function(String name, Class<T> type,
@@ -326,7 +330,7 @@
     }
 
     public Expression<Integer> length(Expression<String> x) {
-        throw new AbstractMethodError();
+        return new Expressions.Length(x);
 
     }
 
@@ -385,29 +389,29 @@
 
     public Expression<Integer> locate(Expression<String> x,
         Expression<String> pattern) {
-        throw new AbstractMethodError();
+        return new Expressions.Locate(x, pattern);
 
     }
 
     public Expression<Integer> locate(Expression<String> x, String pattern) {
-        throw new AbstractMethodError();
+        return new Expressions.Locate(x, pattern);
 
     }
 
     public Expression<Integer> locate(Expression<String> x,
         Expression<String> pattern, Expression<Integer> from) {
-        throw new AbstractMethodError();
+        return new Expressions.Locate(x, pattern, from);
 
     }
 
     public Expression<Integer> locate(Expression<String> x, String pattern,
         int from) {
-        throw new AbstractMethodError();
+        return new Expressions.Locate(x, pattern, from);
 
     }
 
     public Expression<String> lower(Expression<String> x) {
-        throw new AbstractMethodError();
+        return new Expressions.Lower(x);
 
     }
 
@@ -486,12 +490,12 @@
     }
 
     public <Y> Expression<Y> nullif(Expression<Y> x, Expression<?> y) {
-        throw new AbstractMethodError();
+        return new Expressions.Nullif(x, y);
 
     }
 
     public <Y> Expression<Y> nullif(Expression<Y> x, Y y) {
-        throw new AbstractMethodError();
+        return new Expressions.Nullif(x, y);
 
     }
 
@@ -563,7 +567,7 @@
     }
 
     public <Y> Expression<Y> some(Subquery<Y> subquery) {
-        throw new AbstractMethodError();
+        return new Expressions.Some<Y>(subquery);
     }
 
     public Expression<Double> sqrt(Expression<? extends Number> x) {
@@ -572,7 +576,7 @@
 
     public Expression<String> substring(Expression<String> x,
         Expression<Integer> from) {
-    	return new Expressions.Substring(x);
+    	return new Expressions.Substring(x, from);
     }
 
     public Expression<String> substring(Expression<String> x, int from) {
@@ -665,7 +669,7 @@
     }
 
     public Expression<String> upper(Expression<String> x) {
-        throw new AbstractMethodError();
+        return new Expressions.Upper(x);
 
     }
 



Re: svn commit: r781621 [1/3] - 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/src/main/java/org/apache/openjpa/persiste...

Posted by Donald Woods <dw...@apache.org>.
I just fixed a checkstyle failure in Rev781754 due to the below 
PredicateImpl.java changes.


-Donald


faywang@apache.org wrote:
> Author: faywang
> Date: Wed Jun  3 23:44:58 2009
> New Revision: 781621
> 
> URL: http://svn.apache.org/viewvc?rev=781621&view=rev
> Log:
> OPENJPA-1013: subquery support
> 
....
>     openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PredicateImpl.java
....