You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by pp...@apache.org on 2009/06/16 20:56:58 UTC

svn commit: r785341 [2/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...

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=785341&r1=785340&r2=785341&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 Tue Jun 16 18:56:57 2009
@@ -36,22 +36,12 @@
  */
 package org.apache.openjpa.persistence.criteria;
 
-import java.sql.Timestamp;
-import java.util.List;
-
-import javax.persistence.EntityManager;
 import javax.persistence.Parameter;
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Expression;
-import javax.persistence.criteria.Join;
-import javax.persistence.criteria.JoinType;
-import javax.persistence.criteria.ListJoin;
 import javax.persistence.criteria.Root;
-import javax.persistence.criteria.SetJoin;
 import javax.persistence.criteria.Subquery;
 
-import org.apache.openjpa.persistence.test.AllowFailure;
-
 /**
  * Tests type-strict version of Criteria API. The test scenarios are adapted
  * from TestEJBQLCondExpression in
@@ -70,10 +60,9 @@
         assertEquivalence(c, query);
     }
 
-    public void testBetweenExprUsingCriteria() {
-        String query =
-            "SELECT o.name FROM CompUser o WHERE o.age BETWEEN 19 AND 40 AND " +
-            "o.computerName = 'PC'";
+    public void testBetween() {
+        String jpql = "SELECT o.name FROM CompUser o " 
+                    + "WHERE o.age BETWEEN 19 AND 40 AND o.computerName = 'PC'";
         
         CriteriaQuery cq = cb.create();
         Root<CompUser> o = cq.from(CompUser.class);
@@ -81,112 +70,108 @@
                 cb.equal(o.get(CompUser_.computerName), "PC")));
         cq.select(o.get(CompUser_.name));
         
-        assertEquivalence(cq, query);
+        assertEquivalence(cq, jpql);
     }
 
-    public void testNotBetweenExprUsingCriteria() {
-        String query =
-            "SELECT o.name FROM CompUser o WHERE o.age NOT BETWEEN 19 AND 40 " +
-            "AND o.computerName= 'PC'";
+    public void testNotBetween() {
+        String jpql = "SELECT o.name FROM CompUser o " 
+                 + "WHERE o.age NOT BETWEEN 19 AND 40 AND o.computerName= 'PC'";
 
-        CriteriaQuery q = cb.create();
-        Root<CompUser> c = q.from(CompUser.class);
-        q.where(cb.and(cb.between(c.get(CompUser_.age), 19, 40).negate(), 
-                cb.equal(c.get(CompUser_.computerName), "PC")));
-        q.select(c.get(CompUser_.name));
+        CriteriaQuery cq = cb.create();
+        Root<CompUser> o = cq.from(CompUser.class);
+        cq.where(cb.and(cb.between(o.get(CompUser_.age), 19, 40).negate(), 
+                cb.equal(o.get(CompUser_.computerName), "PC")));
+        cq.select(o.get(CompUser_.name));
         
-        assertEquivalence(q, query);
+        assertEquivalence(cq, jpql);
     }
 
-    public void testInExprUsingCriteria() {
-        String query =
-            "SELECT o.name FROM CompUser o WHERE o.age IN (29, 40, 10)";
-        CriteriaQuery q = cb.create();
-        Root<CompUser> c = q.from(CompUser.class);
-        q.where(cb.in(c.get(CompUser_.age)).value(29).value(40).value(10));
-        q.select(c.get(CompUser_.name));
+    public void testInExpr() {
+        String jpql = "SELECT o.name FROM CompUser o "
+                     + "WHERE o.age IN (29, 40, 10)";
         
-        assertEquivalence(q, query);
+        CriteriaQuery cq = cb.create();
+        Root<CompUser> o = cq.from(CompUser.class);
+        cq.where(cb.in(o.get(CompUser_.age)).value(29).value(40).value(10));
+        cq.select(o.get(CompUser_.name));
+        
+        assertEquivalence(cq, jpql);
     }
 
-    public void testNotInUsingCriteria() {
-        String query =
-            "SELECT o.name FROM CompUser o WHERE o.age NOT IN (29, 40, 10)";
+    public void testNotIn() {
+        String jpql = "SELECT o.name FROM CompUser o "
+                    + "WHERE o.age NOT IN (29, 40, 10)";
 
-        CriteriaQuery q = cb.create();
-        Root<CompUser> c = q.from(CompUser.class);
-        q.where(cb.in(c.get(CompUser_.age)).value(29).value(40).value(10)
+        CriteriaQuery cq = cb.create();
+        Root<CompUser> o = cq.from(CompUser.class);
+        cq.where(cb.in(o.get(CompUser_.age)).value(29).value(40).value(10)
             .negate());
-        q.select(c.get(CompUser_.name));
+        cq.select(o.get(CompUser_.name));
         
-        assertEquivalence(q, query);
+        assertEquivalence(cq, jpql);
     }
 
-    public void testLikeExprUsingCriteria1() {
-        String query =
-            "SELECT o.computerName FROM CompUser o WHERE o.name LIKE 'Sha%'" +
-            " AND o.computerName NOT IN ('PC')";
+    public void testLike1() {
+        String jpql = "SELECT o.computerName FROM CompUser o "
+                 + "WHERE o.name LIKE 'Sha%' AND o.computerName NOT IN ('PC')";
 
-        CriteriaQuery q = cb.create();
-        Root<CompUser> c = q.from(CompUser.class);
-        q.where(cb.and(
-                    cb.like(c.get(CompUser_.name),"Sha%"), 
-                    cb.in(c.get(CompUser_.computerName)).value("PC").negate()
+        CriteriaQuery cq = cb.create();
+        Root<CompUser> o = cq.from(CompUser.class);
+        cq.where(cb.and(
+                    cb.like(o.get(CompUser_.name),"Sha%"), 
+                    cb.in(o.get(CompUser_.computerName)).value("PC").negate()
                 ));
         
-        q.select(c.get(CompUser_.computerName));
+        cq.select(o.get(CompUser_.computerName));
 
-        assertEquivalence(q, query);
+        assertEquivalence(cq, jpql);
     }
     
-    public void testLikeExprUsingCriteria2() {
-        String query =
-            "SELECT o.computerName FROM CompUser o WHERE o.name LIKE 'Sha%o_'" +
-            " AND " + 
-            "o.computerName NOT IN ('UNIX')";
+    public void testLike2() {
+        String jpql = "SELECT o.computerName FROM CompUser o "
+            + "WHERE o.name LIKE 'Sha%o_' AND o.computerName NOT IN ('UNIX')";
 
-        CriteriaQuery q = cb.create();
-        Root<CompUser> c = q.from(CompUser.class);
-        q.where(cb.and(
-                    cb.like(c.get(CompUser_.name),"Sha%o_"), 
-                    cb.in(c.get(CompUser_.computerName)).value("UNIX").negate()
+        CriteriaQuery cq = cb.create();
+        Root<CompUser> o = cq.from(CompUser.class);
+        cq.where(cb.and(
+                    cb.like(o.get(CompUser_.name),"Sha%o_"), 
+                    cb.in(o.get(CompUser_.computerName)).value("UNIX").negate()
                 ));
-        q.select(c.get(CompUser_.computerName));
+        cq.select(o.get(CompUser_.computerName));
         
-        assertEquivalence(q, query);
+        assertEquivalence(cq, jpql);
     }
     
-    public void testLikeExprUsingCriteria3() {
-        String query = "SELECT o.name FROM CompUser o WHERE o.name LIKE '_J%'";
+    public void testLike3() {
+        String jpql = "SELECT o.name FROM CompUser o WHERE o.name LIKE '_J%'";
 
-        CriteriaQuery q = cb.create();
-        Root<CompUser> c = q.from(CompUser.class);
-        q.where(cb.like(c.get(CompUser_.name),"_J%"));
-        q.select(c.get(CompUser_.name));
+        CriteriaQuery cq = cb.create();
+        Root<CompUser> o = cq.from(CompUser.class);
+        cq.where(cb.like(o.get(CompUser_.name),"_J%"));
+        cq.select(o.get(CompUser_.name));
         
-        assertEquivalence(q, query);
+        assertEquivalence(cq, jpql);
     }
     
-    @AllowFailure(message="Parameter processing is broken")
-    public void testLikeExprUsingCriteria4() {
-        String query = "SELECT o.name FROM CompUser o WHERE o.name LIKE ?1 " +
-        		"ESCAPE '|'";
+    public void testLikeWithEscapeCharacter() {
+        String query = "SELECT o.name FROM CompUser o "
+            + "WHERE o.name LIKE :name ESCAPE '|'";
         CriteriaQuery q = cb.create();
         Root<CompUser> c = q.from(CompUser.class);
-        Parameter<String> param = cb.parameter(String.class);
+        Parameter<String> param = cb.parameter(String.class, "name");
         q.where(cb.like(c.get(CompUser_.name), param, '|'));
         q.select(c.get(CompUser_.name));
         
-        assertEquivalence(q, query, new Object[] {"%|_%"});
+        assertEquivalence(q, query, new String[]{"name"}, 
+                new Object[] {"%|_%"});
     }
 
-    public void testNullExprUsingCriteria() {
+    public void testNullExpression() {
         String query =
             "SELECT o.name FROM CompUser o WHERE o.age IS NOT NULL AND " +
             "o.computerName = 'PC' ";
         CriteriaQuery q = cb.create();
         Root<CompUser> c = q.from(CompUser.class);
-        Parameter<String> param = cb.parameter(String.class);
         q.where(cb.and(cb.notEqual(c.get(CompUser_.age), null), 
                 cb.equal(c.get(CompUser_.computerName), "PC")));
         q.select(c.get(CompUser_.name));
@@ -200,7 +185,6 @@
 
         CriteriaQuery q = cb.create();
         Root<CompUser> c = q.from(CompUser.class);
-        Parameter<String> param = cb.parameter(String.class);
         q.where(cb.equal(c.get(CompUser_.address).get(Address_.country),
             null));
         q.select(c.get(CompUser_.name));
@@ -209,7 +193,7 @@
     }
     
     // do not support isEmpty for array fields
-    @AllowFailure
+    
     public void testIsEmptyExprUsingCriteria() {
         String query =
             "SELECT o.name FROM CompUser o WHERE o.nicknames IS NOT EMPTY";
@@ -221,80 +205,11 @@
         assertEquivalence(cq, query);
     }
 
-    @AllowFailure(message="Address is embeddable. Can it be in " +
-    		"subquery/From Clause?")
-    public void testExistExprUsingCriteria() {
-        String query = "SELECT DISTINCT o.name FROM CompUser o WHERE EXISTS" +
-            " (SELECT c FROM Address c WHERE c = o.address )";
-
-        CriteriaQuery q = cb.create();
-        Root<CompUser> o = q.from(CompUser.class);
-        Subquery<Address> sq = q.subquery(Address.class);
-        sq.correlate(o);
-        Root<Address> c = sq.from(Address.class);
-        sq.select(c);
-        sq.where(cb.equal(c, o.get(CompUser_.address)));
-        q.where(cb.exists(sq));
-        q.select(o.get(CompUser_.name)).distinct(true);
-        assertEquivalence(q, query);
-        List result = em.createQuery(q).getResultList();
-
-        assertNotNull("the list is null", result);
-        assertEquals("they are not equal", 5, result.size());
-        assertTrue("Seetha is not list", result.contains("Seetha"));
-        assertTrue("Shannon is not list", result.contains("Shannon"));
-        assertTrue("jacob is not list", result.contains("Jacob"));
-        assertTrue("ugo is not list", result.contains("Ugo"));
-
-        em.clear();
-    }
     
-    @AllowFailure
-    public void testNotExistExprUsingCriteria() {
-        String query =
-            "SELECT DISTINCT o.name FROM CompUser o WHERE NOT EXISTS" +
-                " (SELECT s FROM CompUser s WHERE s.address.country = " +
-                "o.address.country)";
-
-        CriteriaQuery q = cb.create();
-        Root<CompUser> o = q.from(CompUser.class);
-        Subquery<CompUser> sq = q.subquery(CompUser.class);
-        sq.correlate(o);
-        Root<CompUser> s = sq.from(CompUser.class);
-        sq.select(s);
-        sq.where(cb.equal(s.get(CompUser_.address).get(Address_.country), 
-                o.get(CompUser_.address).get(Address_.country)));
-        q.where(cb.exists(sq).negate());
-        q.select(o.get(CompUser_.name)).distinct(true);
-        
-        assertEquivalence(q, query);
-    }
-
-    @AllowFailure
-    public void testAnyExprUsingCriteria() {
-        String query =
-            "SELECT o.name FROM CompUser o WHERE o.address.zipCode = ANY (" +
-                " SELECT s.computerName FROM CompUser s WHERE " +
-                "s.address.country IS NOT NULL )";
-
-        CriteriaQuery q = cb.create();
-        Root<CompUser> o = q.from(CompUser.class);
-        q.select(o.get(CompUser_.name));
-        Subquery<String> sq = q.subquery(String.class);
-        Root<CompUser> s = sq.from(CompUser.class);
-        sq.select(s.get(CompUser_.computerName));
-        sq.where(cb.notEqual(s.get(CompUser_.address).get(Address_.country),
-            null));
-        q.where(cb.equal(o.get(CompUser_.address).get(Address_.zipCode), 
-            cb.any(sq)));
-        
-        assertEquivalence(q, query);
-    }
     
-    @AllowFailure(message="ResultPacker is all confused")
     public void testConstructorExprUsingCriteria() {
         String query =
-            "SELECT NEW org.apache.openjpa.persistence.common.apps.MaleUser(" +
+            "SELECT NEW org.apache.openjpa.persistence.criteria.MaleUser(" +
             "c.name, c.computerName, c.address, c.age, c.userid)" +
             " FROM CompUser c WHERE c.name = 'Seetha'";
         
@@ -497,7 +412,7 @@
         assertEquivalence(q, query);
     }
     
-    @AllowFailure
+    
     public void testArithmFunc3() {
         String query =
             "select MOD(e.age, 4) From CompUser e WHERE e.name='Seetha'";
@@ -510,8 +425,6 @@
         assertEquivalence(q, query);
     }
     
-    // size method can not be applied to an array field
-    @AllowFailure(message="size method can not be applied to an array field?")
     public void testArithmFunc4() {
         String query = "SELECT e.name FROM CompUser e WHERE " +
         		"SIZE(e.nicknames) = 6";
@@ -588,7 +501,6 @@
         assertEquivalence(q, query);
     }
 
-    @AllowFailure(message="criteria does not generate Optimize for 1 row")
     public void testMINAggregFunc() {
         String query = "SELECT DISTINCT MIN(c.age) FROM CompUser c";
 
@@ -611,39 +523,39 @@
         assertEquivalence(q, query);
     }
 
-    // can not do TYPE with parameter in the IN clause
-    @AllowFailure
     public void testTypeExpression1() {
-        String query = "SELECT e FROM CompUser e where TYPE(e) in (?1, ?2) " +
+        String jpql = "SELECT e FROM CompUser e where TYPE(e) in (:a, :b) " +
             "ORDER By e.name";
-        CriteriaQuery q = cb.create();
-        q = cb.create();
-        Root<CompUser> e = q.from(CompUser.class);
-        q.select(e);
-        Parameter<Class> param1 = cb.parameter(Class.class);
-        Parameter<Class> param2 = cb.parameter(Class.class);
-        // q.where(cb.in(e.type()).value(param1).value(param2));
-        q.orderBy(cb.asc(e.get(CompUser_.name)));
         
-        assertEquivalence(q, query);
+        CriteriaQuery cq = cb.create();
+        Root<CompUser> e = cq.from(CompUser.class);
+        cq.select(e);
+        Parameter<Class> param1 = cb.parameter(Class.class, "a");
+        Parameter<Class> param2 = cb.parameter(Class.class, "b");
+        cq.where(e.type().in(param1, param2));
+        cq.orderBy(cb.asc(e.get(CompUser_.name)));
+        
+        assertEquivalence(cq, jpql, new String[]{"a","b"}, 
+             new Class[]{MaleUser.class,FemaleUser.class});
     }
 
-    @AllowFailure
+    
     public void testTypeExpression2() {
-        String query = "SELECT TYPE(e) FROM CompUser e where TYPE(e) <> ?1";
+        String query = "SELECT TYPE(e) FROM CompUser e where TYPE(e) <> :t";
         CriteriaQuery q = cb.create();
         q = cb.create();
         Root<CompUser> e = q.from(CompUser.class);
-        Parameter<Class> param1 = cb.parameter(Class.class);
+        Parameter<Class> param1 = cb.parameter(Class.class, "t");
         q.select(e.type());
         q.where(cb.equal(e.type(), param1).negate());
         
-        assertEquivalence(q, query);
+        assertEquivalence(q, query, new String[]{"t"}, 
+                new Class[]{MaleUser.class});
     }
 
     // Type literal
     // this Cartesian problem can not be rewritten to use JOIN
-    @AllowFailure
+    
     public void testTypeExpression3() {
         String query = "SELECT e, FemaleUser, a FROM Address a, FemaleUser e "
                 + " where e.address IS NOT NULL";
@@ -692,7 +604,7 @@
         assertEquivalence(cq, query);
     }
 
-    @AllowFailure
+    
     public void testTypeExpression7() {
         String query = "SELECT TYPE(a.b) FROM A a";
         CriteriaQuery q = cb.create();
@@ -885,7 +797,7 @@
 
     // not sure how to write CriteriaQuery for
     // Subquery.select(SimpleCase/GeneralCase)
-    @AllowFailure
+    
     public void testGeneralCaseExpression4() {
         String query = "select e.name, e.creditRating from CompUser e "
             + "where e.creditRating = "
@@ -922,529 +834,4 @@
         assertEquivalence(q, query);
     }
 
-    @AllowFailure
-    public void testSubquery1() {
-        String query = "select o1.id from Order o1 where o1.id in "
-                + " (select distinct o.id from LineItem i, Order o"
-                + " where i.quantity > 10 and o.count > 1000 and i.id = o.id)";
-        
-        CriteriaQuery q = cb.create();
-        Root<Order> o1 = q.from(Order.class);
-        q.select(o1.get(Order_.id));
-
-        Subquery<Integer> sq = q.subquery(Integer.class);
-        Root<LineItem> i = sq.from(LineItem.class);
-        Join<LineItem, Order> o = i.join(LineItem_.order);
-        sq.where(cb.and(cb.and(cb.gt(i.get(LineItem_.quantity), 10), cb.gt(o
-                .get(Order_.count), 1000)), cb.equal(i.get(LineItem_.id), o
-                .get(Order_.id))));
-        sq.select(o.get(Order_.id)).distinct(true);
-        q.where(cb.in(o1.get(Order_.id)).value(
-                sq.select(o.get(Order_.id)).distinct(true)));
-        
-        assertEquivalence(q, query);
-    }
-
-    @AllowFailure
-    public void testSubquery2() {
-        String query = "select o.id from Order o where o.customer.balanceOwed ="
-                + " (select max(o2.customer.balanceOwed) from Order o2"
-                + " where o.customer.id = o2.customer.id)";
-        CriteriaQuery q = cb.create();
-        Root<Order> o = q.from(Order.class);
-        q.select(o.get(Order_.id));
-        Subquery<Integer> sq = q.subquery(Integer.class);
-        Root<Order> o2 = sq.from(Order.class);
-        sq.where(cb.equal(o.get(Order_.customer).get(Customer_.id), o2.get(
-                Order_.customer).get(Customer_.id)));
-        q.where(cb.equal(o.get(Order_.customer).get(Customer_.balanceOwed), sq
-                .select(cb.max(o2.get(Order_.customer).get(
-                        Customer_.balanceOwed)))));
-        
-        assertEquivalence(q, query);
-    }
-
-    @AllowFailure
-    public void testSubquery3() {
-        String query = "select o from Order o where o.customer.balanceOwed ="
-                + " (select max(o2.customer.balanceOwed) from Order o2"
-                + " where o.customer.id = o2.customer.id)";
-        CriteriaQuery q = cb.create();
-        Root<Order> o = q.from(Order.class);
-        q.select(o);
-        Subquery<Integer> sq = q.subquery(Integer.class);
-        Root<Order> o2 = sq.from(Order.class);
-        sq.where(cb.equal(o.get(Order_.customer).get(Customer_.id), o2.get(
-                Order_.customer).get(Customer_.id)));
-        q.where(cb.equal(o.get(Order_.customer).get(Customer_.balanceOwed), sq
-                .select(cb.max(o2.get(Order_.customer).get(
-                        Customer_.balanceOwed)))));
-        
-        assertEquivalence(q, query);
-    }
-
-    @AllowFailure
-    public void testSubquery4() {
-        String query = "select o.id from Order o where o.quantity >"
-                + " (select count(i) from o.lineItems i)";
-        CriteriaQuery q = cb.create();
-        Root<Order> o = q.from(Order.class);
-        q.select(o.get(Order_.id));
-        Subquery<Long> sq = q.subquery(Long.class);
-        Root<Order> osq = sq.correlate(o);
-        Join<Order, LineItem> i = osq.join(Order_.lineItems);
-        q.where(cb.gt(o.get(Order_.quantity), sq.select(cb.count(i))));
-        assertEquivalence(q, query);
-    }
-
-    @AllowFailure
-    public void testSubquery5() {
-        String query = "select o.id from Order o where o.quantity >"
-                + " (select count(o.quantity) from Order o)";
-        CriteriaQuery q = cb.create();
-        Root<Order> o = q.from(Order.class);
-        q.select(o.get(Order_.id));
-        Subquery<Long> sq = q.subquery(Long.class);
-        Root<Order> o2 = sq.from(Order.class);
-        q.where(cb.gt(o.get(Order_.quantity), sq.select(cb.count(o2
-                .get(Order_.quantity)))));
-        
-        assertEquivalence(q, query);
-    }
-
-    @AllowFailure
-    public void testSubquery6() {
-        String query = "select o.id from Order o where o.quantity >"
-                + " (select count(o.id) from Order o)";
-        CriteriaQuery q = cb.create();
-        Root<Order> o = q.from(Order.class);
-        q.select(o.get(Order_.id));
-        Subquery<Long> sq = q.subquery(Long.class);
-        Root<Order> o2 = sq.from(Order.class);
-        q.where(cb.gt(o.get(Order_.quantity), sq.select(cb.count(o2
-                .get(Order_.id)))));
-        
-        assertEquivalence(q, query);
-    }
-
-    @AllowFailure
-    public void testSubquery7() {
-        String query = "select o.id from Order o where o.quantity >"
-                + " (select avg(o.quantity) from Order o)";
-        CriteriaQuery q = cb.create();
-        Root<Order> o = q.from(Order.class);
-        q.select(o.get(Order_.id));
-        Subquery<Double> sq = q.subquery(Double.class);
-        Root<Order> o2 = sq.from(Order.class);
-        q.where(cb.gt(o.get(Order_.quantity), sq.select(cb.avg(o2
-                .get(Order_.quantity)))));
-        
-        assertEquivalence(q, query);
-    }
-
-    @AllowFailure
-    public void testSubquery8() {
-        String query = "select c.name from Customer c where exists"
-                + " (select o from c.orders o where o.id = 1) or exists"
-                + " (select o from c.orders o where o.id = 2)";
-        CriteriaQuery q = cb.create();
-        Root<Customer> c = q.from(Customer.class);
-        q.select(c.get(Customer_.name));
-        Subquery<Order> sq1 = q.subquery(Order.class);
-        Root<Customer> c1 = sq1.correlate(c);
-        SetJoin<Customer, Order> o1 = c1.join(Customer_.orders);
-        sq1.where(cb.equal(o1.get(Order_.id), 1)).select(o1);
-
-        Subquery<Order> sq2 = q.subquery(Order.class);
-        Root<Customer> c2 = sq2.correlate(c);
-        SetJoin<Customer, Order> o2 = c2.join(Customer_.orders);
-        sq2.where(cb.equal(o2.get(Order_.id), 2)).select(o2);
-
-        q.where(cb.or(cb.exists(sq1), cb.exists(sq2)));
-        
-        assertEquivalence(q, query);
-    }
-
-    @AllowFailure
-    public void testSubquery9() {
-        String query = "select c.name from Customer c, in(c.orders) o "
-                + "where o.quantity between "
-                + "(select max(o.quantity) from Order o) and "
-                + "(select avg(o.quantity) from Order o) ";
-        CriteriaQuery q = cb.create();
-        Root<Customer> c = q.from(Customer.class);
-        q.select(c.get(Customer_.name));
-
-        Subquery<Integer> sq1 = q.subquery(Integer.class);
-        Root<Order> o1 = sq1.from(Order.class);
-        sq1.select(cb.max(o1.get(Order_.quantity)));
-
-        Subquery<Double> sq2 = q.subquery(Double.class);
-        Root<Order> o2 = sq2.from(Order.class);
-        sq2.select(cb.avg(o2.get(Order_.quantity)));
-
-        SetJoin<Customer, Order> o = c.join(Customer_.orders);
-        // not sure how to do call between of integer(quantity)
-        // between integer (max quantity) and double (avg quantity)
-        // q.where(cb.between(o.get(Order_.quantity), sq1, sq2));
-        
-        assertEquivalence(q, query);
-    }
-
-    @AllowFailure
-    public void testSubquery10() {
-        String query = "select o.id from Order o where o.quantity >"
-                + " (select sum(o2.quantity) from Customer c, " 
-                + "in(c.orders) o2) ";
-        CriteriaQuery q = cb.create();
-        Root<Order> o = q.from(Order.class);
-        q.select(o.get(Order_.id));
-
-        Subquery<Integer> sq = q.subquery(Integer.class);
-        Root<Customer> c = sq.from(Customer.class);
-        SetJoin<Customer, Order> o2 = c.join(Customer_.orders);
-        sq.select(cb.sum(o2.get(Order_.quantity)));
-
-        q.where(cb.gt(o2.get(Order_.quantity), sq));
-        
-        assertEquivalence(q, query);
-    }
-
-    @AllowFailure
-    public void testSubquery11() {
-        String query = "select o.id from Order o where o.quantity between"
-                + " (select avg(o2.quantity) from Customer c, in(c.orders) o2)"
-                + " and (select min(o2.quantity) from Customer c, in(c.orders)"
-                + " o2)";
-        CriteriaQuery q = cb.create();
-        Root<Order> o = q.from(Order.class);
-        q.select(o.get(Order_.id));
-
-        Subquery<Double> sq1 = q.subquery(Double.class);
-        Root<Customer> c = sq1.from(Customer.class);
-        SetJoin<Customer, Order> o2 = c.join(Customer_.orders);
-        sq1.select(cb.avg(o2.get(Order_.quantity)));
-
-        Subquery<Integer> sq2 = q.subquery(Integer.class);
-        Root<Customer> c2 = sq2.from(Customer.class);
-        SetJoin<Customer, Order> o3 = c2.join(Customer_.orders);
-        sq2.select(cb.min(o3.get(Order_.quantity)));
-
-        // do not know how to call between for double and integer
-        // q.where(cb.between(o2.get(Order_.quantity), sq1, sq2));
-        assertEquivalence(q, query);
-    }
-
-    @AllowFailure
-    public void testSubquery12() {
-        String query =
-            "select o.id from Customer c, in(c.orders)o "
-                + "where o.quantity > (select sum(o2.quantity)"
-                + " from c.orders o2)";
-        CriteriaQuery q = cb.create();
-        Root<Customer> c = q.from(Customer.class);
-        SetJoin<Customer, Order> o = c.join(Customer_.orders);
-        q.select(o.get(Order_.id));
-
-        Subquery<Integer> sq = q.subquery(Integer.class);
-        Root<Customer> sqc = sq.correlate(c);
-        SetJoin<Customer, Order> o2 = sqc.join(Customer_.orders);
-        sq.select(cb.sum(o2.get(Order_.quantity)));
-        q.where(cb.gt(o.get(Order_.quantity), sq));
-        
-        assertEquivalence(q, query);
-    }
-
-    @AllowFailure
-    public void testSubquery13() {
-        String query = "select o1.id, c.name from Order o1, Customer c"
-                + " where o1.quantity = "
-                + " any(select o2.quantity from in(c.orders) o2)";
-        CriteriaQuery q = cb.create();
-        Root<Order> o1 = q.from(Order.class);
-        Join<Order, Customer> c = o1.join(Order_.customer);
-        q.select(o1.get(Order_.id), c.get(Customer_.name));
-
-        Subquery<Integer> sq = q.subquery(Integer.class);
-        Join<Order, Customer> sqc = sq.correlate(c);
-        SetJoin<Customer, Order> o2 = sqc.join(Customer_.orders);
-        sq.select(o2.get(Order_.quantity));
-
-        q.where(cb.equal(o1.get(Order_.quantity), cb.any(sq)));
-        
-        assertEquivalence(q, query);
-    }
-
-    @AllowFailure
-    public void testSubquery14() {
-        String query = "SELECT p, m FROM Publisher p "
-            + "LEFT OUTER JOIN p.magazineCollection m "
-            + "WHERE m.id = (SELECT MAX(m2.id) FROM Magazine m2 "
-            + "WHERE m2.idPublisher.id = p.id AND m2.datePublished = "
-            //+ "(SELECT MAX(m3.datePublished) FROM Magazine m3 "
-            + "(SELECT MAX(m3.id) FROM Magazine m3 "
-            + "WHERE m3.idPublisher.id = p.id)) ";
-        CriteriaQuery q = cb.create();
-        Root<Publisher> p = q.from(Publisher.class);
-        Join<Publisher, Magazine> m = p.join(Publisher_.magazineCollection,
-            JoinType.LEFT);
-        q.select(p, m);
-
-        Subquery<Integer> sq = q.subquery(Integer.class);
-        Root<Magazine> m2 = sq.from(Magazine.class);
-        q.where(cb.equal(m.get(Magazine_.id), sq.select(cb.max(m2
-            .get(Magazine_.id)))));
-
-        Subquery<Integer> sq2 = q.subquery(Integer.class);
-        Root<Magazine> m3 = sq2.from(Magazine.class);
-        
-        sq2.where(cb.equal(m3.get(Magazine_.idPublisher).get(Publisher_.id), 
-            p.get(Publisher_.id)));
-        
-        sq.where(cb.and(cb.equal(m2.get(Magazine_.idPublisher).get(
-            Publisher_.id), p.get(Publisher_.id)), cb.equal(m2
-            .get(Magazine_.datePublished), sq2.select(cb.max(m3
-            .get(Magazine_.id))))));
-        
-        assertEquivalence(q, query);
-    }
-
-    // outstanding problem subqueries:
-    // "select o from Order o where o.amount > (select count(o) from Order o)",
-    // "select o from Order o where o.amount > (select count(o2) from Order o2)
-    //",
-    // "select c from Customer c left join c.orders p where not exists"
-    // + " (select o2 from c.orders o2 where o2 = o",
-
-    // not sure how to write CriteriaQuery for
-    // Subquery.select(SimpleCase/GeneralCase)
-    @AllowFailure
-    public void testSubquery15() {
-        String query = "select o.id from Order o where o.delivered =(select "
-                + "   CASE WHEN o2.quantity > 10 THEN true"
-                + "     WHEN o2.quantity = 10 THEN false "
-                + "     ELSE false END from Order o2"
-                + " where o.customer.id = o2.customer.id)";
-        CriteriaQuery q = cb.create();
-        Root<Order> o = q.from(Order.class);
-        q.select(o.get(Order_.id));
-
-        Subquery<Boolean> sq = q.subquery(Boolean.class);
-        Root<Order> o2 = sq.from(Order.class);
-        sq.where(cb.equal(o.get(Order_.customer).get(Customer_.id), o2.get(
-                Order_.customer).get(Customer_.id)));
-
-        q.where(cb.equal(o.get(Order_.delivered),
-        // sq.select(
-                cb.selectCase().when(cb.gt(o2.get(Order_.quantity), 10), true)
-                        .when(cb.equal(o2.get(Order_.quantity), 10), false)
-                        .otherwise(false)
-        // )
-                ));
-        
-        assertEquivalence(q, query);
-    }
-
-    @AllowFailure
-    public void testSubquery16() {
-        String query = "select o1.id from Order o1 where o1.quantity > "
-                + " (select o.quantity*2 from LineItem i, Order o"
-                + " where i.quantity > 10 and o.quantity > 1000 and i.id = " +
-                		"o.id)";
-        CriteriaQuery q = cb.create();
-        Root<Order> o1 = q.from(Order.class);
-        q.select(o1.get(Order_.id));
-
-        Subquery<Integer> sq = q.subquery(Integer.class);
-        Root<LineItem> i = sq.from(LineItem.class);
-        Join<LineItem, Order> o = i.join(LineItem_.order);
-        sq.where(cb.and(cb.and(cb.gt(i.get(LineItem_.quantity), 10), cb.gt(o
-                .get(Order_.quantity), 1000)), cb.equal(i.get(LineItem_.id), o
-                .get(Order_.id))));
-
-        q.where(cb.gt(o1.get(Order_.quantity), sq.select(cb.prod(o
-                .get(Order_.quantity), 2))));
-
-        assertEquivalence(q, query);
-    }
-
-    @AllowFailure
-    public void testSubquery17() {
-        String query = "select o.id from Order o where o.customer.name ="
-                + " (select substring(o2.customer.name, 3) from Order o2"
-                + " where o.customer.id = o2.customer.id)";
-        CriteriaQuery q = cb.create();
-        Root<Order> o = q.from(Order.class);
-        q.select(o.get(Order_.customer).get(Customer_.name));
-
-        Subquery<String> sq = q.subquery(String.class);
-        Root<Order> o2 = sq.from(Order.class);
-        sq.where(cb.equal(o.get(Order_.customer).get(Customer_.id), o2.get(
-                Order_.customer).get(Customer_.id)));
-
-        q.where(cb.equal(o.get(Order_.customer).get(Customer_.name), sq
-                .select(cb.substring(o2.get(Order_.customer)
-                        .get(Customer_.name), 3))));
-
-        assertEquivalence(q, query);
-    }
-
-    @AllowFailure
-    public void testSubquery18() {
-        String query = "select o.id from Order o where o.orderTs >"
-                + " (select CURRENT_TIMESTAMP from o.lineItems i)";
-        CriteriaQuery q = cb.create();
-        Root<Order> o = q.from(Order.class);
-        q.select(o.get(Order_.id));
-
-        Subquery<Timestamp> sq = q.subquery(Timestamp.class);
-        Root<Order> o2 = sq.correlate(o);
-        ListJoin<Order, LineItem> i = o2.join(Order_.lineItems);
-
-        // q.where(cb.gt(
-        // o.get(Order_.orderTs),
-        // sq.select(cb.currentTimestamp())));
-        
-        assertEquivalence(q, query);
-    }
-
-    @AllowFailure
-    public void testSubquery19() {
-        String query = "select o.id from Order o where o.quantity >"
-                + " (select SQRT(o.quantity) from Order o where o.delivered" +
-                		" = true)";
-        CriteriaQuery q = cb.create();
-        Root<Order> o = q.from(Order.class);
-        q.select(o.get(Order_.id));
-
-        Subquery<Double> sq = q.subquery(Double.class);
-        Root<Order> o2 = sq.from(Order.class);
-        sq.where(cb.equal(o2.get(Order_.delivered), true));
-
-        q.where(cb.gt(o.get(Order_.quantity), sq.select(cb.sqrt(o2
-                .get(Order_.quantity)))));
-        assertEquivalence(q, query);
-    }
-
-    @AllowFailure
-    public void testSubquery20() {
-        String query = "select o.id from Order o where o.customer.name in"
-                + " (select CONCAT(o.customer.name, 'XX') from Order o"
-                + " where o.quantity > 10)";
-        CriteriaQuery q = cb.create();
-        Root<Order> o = q.from(Order.class);
-        q.select(o.get(Order_.id));
-
-        Subquery<String> sq = q.subquery(String.class);
-        Root<Order> o2 = sq.from(Order.class);
-        sq.where(cb.gt(o2.get(Order_.quantity), 10));
-
-        q.where(cb.in(o.get(Order_.customer).get(Customer_.name)).value(
-                sq.select(cb.concat(
-                        o2.get(Order_.customer).get(Customer_.name), "XX"))));
-        assertEquivalence(q, query);
-    }
-
-    @AllowFailure
-    public void testSubquery21() {
-        String query = "select c from Customer c where c.creditRating ="
-                + " (select "
-                + "   CASE WHEN o2.quantity > 10 THEN "
-                + "org.apache.openjpa.persistence.criteria.Customer$" +
-                		"CreditRating.POOR"
-                + "     WHEN o2.quantity = 10 THEN "
-                + "org.apache.openjpa.persistence.criteria.Customer$" +
-                		"CreditRating.GOOD "
-                + "     ELSE "
-                + "org.apache.openjpa.persistence.criteria.Customer$" +
-                		"CreditRating.EXCELLENT "
-                + "     END from Order o2"
-                + " where c.id = o2.customer.id)";
-        CriteriaQuery q = cb.create();
-        Root<Customer> c = q.from(Customer.class);
-        q.select(c);
-
-        Subquery<String> sq = q.subquery(String.class);
-        Root<Order> o2 = sq.from(Order.class);
-        sq.where(cb.equal(c.get(Customer_.id), o2.get(Order_.customer).get(
-            Customer_.id)));
-
-        q.where(cb.equal(c.get(Customer_.creditRating), 
-            //sq.select(
-            cb.selectCase().when(cb.gt(o2.get(Order_.quantity), 10),
-                Customer.CreditRating.POOR).when(
-                cb.equal(o2.get(Order_.quantity), 10),
-                Customer.CreditRating.GOOD).otherwise(
-                Customer.CreditRating.EXCELLENT)
-        // )
-            ));
-        assertEquivalence(q, query);
-    }
-
-    // Coalesce for Enum type
-    @AllowFailure
-    public void testSubquery22() {
-        String query = "select c from Customer c "
-                + "where c.creditRating = (select COALESCE (c1.creditRating, "
-                + "org.apache.openjpa.persistence.criteria.Customer$" +
-                		"CreditRating.POOR) "
-                + "from Customer c1 where c1.name = 'Famzy') order by c.name " +
-                		"DESC";
-        CriteriaQuery q = cb.create();
-        Root<Customer> c = q.from(Customer.class);
-        q.select(c);
-        q.orderBy(cb.desc(c.get(Customer_.name)));        
-
-        Subquery<Customer.CreditRating> sq =
-            q.subquery(Customer.CreditRating.class);
-        Root<Customer> c1 = sq.from(Customer.class);
-        sq.where(cb.equal(c1.get(Customer_.name), "Famzy"));
-        
-        //q.where(cb.equal(c.get(Customer_.creditRating),
-        //    sq.select(cb.coalesce().value(c1.get(Customer_.creditRating).
-        //        value(Customer.CreditRating.POOR)))));    
-        assertEquivalence(q, query);
-    }
-
-    @AllowFailure
-    public void testSubquery23() {
-        String query =
-            "select c from Customer c "
-                + "where c.creditRating = (select NULLIF (c1.creditRating, "
-                + "org.apache.openjpa.persistence.criteria."
-                + "Customer$CreditRating.POOR) "
-                + "from Customer c1 where c1.name = 'Famzy') "
-                + "order by c.name DESC";
-        CriteriaQuery q = cb.create();
-        Root<Customer> c = q.from(Customer.class);
-        q.select(c);
-        q.orderBy(cb.desc(c.get(Customer_.name)));        
-
-        Subquery<Customer.CreditRating> sq =
-            q.subquery(Customer.CreditRating.class);
-        Root<Customer> c1 = sq.from(Customer.class);
-        sq.where(cb.equal(c1.get(Customer_.name), "Famzy"));
-        
-        q.where(cb.equal(c.get(Customer_.creditRating),
-            sq.select(cb.nullif(c1.get(Customer_.creditRating),
-                Customer.CreditRating.POOR))));    
-        assertEquivalence(q, query);
-    }
-
-    /**
-     * Verify a sub query can contain MAX and additional date comparisons
-     * without losing the correct alias information. This sort of query
-     * originally caused problems for DBDictionaries which used DATABASE syntax.
-     */
-    // Not sure how to do Cartesian join when Employee can not 
-    // navigate to Dependent
-    @AllowFailure
-    public void testSubSelectMaxDateRange() {
-        String query = "SELECT e,d from Employee e, Dependent d "
-            + "WHERE e.empId = :empid "
-            + "AND d.id.empid = (SELECT MAX (e2.empId) FROM Employee e2) "
-            + "AND d.id.effDate > :minDate "
-            + "AND d.id.effDate < :maxDate ";
-    }
-
 }

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=785341&r1=785340&r2=785341&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 Jun 16 18:56:57 2009
@@ -29,6 +29,7 @@
 import javax.persistence.criteria.ListJoin;
 import javax.persistence.criteria.MapJoin;
 import javax.persistence.criteria.Root;
+import javax.persistence.criteria.SetJoin;
 import javax.persistence.criteria.Subquery;
 
 import org.apache.openjpa.persistence.test.AllowFailure;
@@ -193,7 +194,6 @@
         assertEquivalence(cq, jpql);
     }
     
-    @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'";
@@ -221,7 +221,7 @@
         assertEquivalence(c, jpql);
     }
 
-    @AllowFailure(message = "Fetch joins not implemented")
+    @AllowFailure(message="FetchJoin not implemented")
     public void testFetchJoins() {
         String jpql = "SELECT d FROM Department LEFT JOIN FETCH d.employees "
             + "WHERE d.deptNo = 1";
@@ -233,12 +233,15 @@
         assertEquivalence(q, jpql);
     }
 
-    @AllowFailure(message = "Invalid SQL is generated")
     public void testJoinedPathInProjection() {
-        String jpql = "SELECT p.vendor FROM Employee e JOIN "
+        String jpql1 = "SELECT p.vendor FROM Employee e JOIN "
             + "e.contactInfo.phones p "
             + "WHERE e.contactInfo.address.zipCode = '95054'";
-        
+
+        String jpql = "SELECT p.vendor FROM Employee e JOIN "
+            + "e.contactInfo c JOIN c.phones p "
+            + "WHERE c.address.zipCode = '95054'";
+
         CriteriaQuery cq = cb.create();
         Root<Employee> e = cq.from(Employee.class);
         Join<Contact, Phone> p = e.join(Employee_.contactInfo).join(
@@ -250,11 +253,14 @@
         assertEquivalence(cq, jpql);
     }
 
-    @AllowFailure(message = "Key expression not implemented")
     public void testKeyExpression() {
-        String jpql =
-            "SELECT i.name, p FROM Item i JOIN i.photos p WHERE KEY(p) "
-            + "LIKE '%egret%'";
+//        String jpql =
+//            "SELECT i.name, p FROM Item i JOIN i.photos p WHERE KEY(p) "
+//            + "LIKE '%egret%'";
+        String jpql = "select i.name, VALUE(p)"
+            + " from Item i join i.photos p"
+            + " where KEY(p) like 'egret'";
+
         CriteriaQuery q = cb.create();
         Root<Item> item = q.from(Item.class);
         MapJoin<Item, String, Photo> photo = item.join(Item_.photos);
@@ -264,7 +270,6 @@
         assertEquivalence(q, jpql);
     }
 
-    @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 "
@@ -273,9 +278,10 @@
         Root<CreditCard> c = q.from(CreditCard.class);
         ListJoin<CreditCard, TransactionHistory> t = c
         .join(CreditCard_.transactionHistory);
-        q.select(t).where(
-                cb.equal(c.get(CreditCard_.customer).get(Customer_.accountNum),
-                        321987), cb.between(t.index(), 0, 9));
+        q.select(t).where(cb.and(
+            cb.equal(c.get(CreditCard_.customer).get(Customer_.accountNum),
+                321987), 
+            cb.between(t.index(), 0, 9)));
 
         assertEquivalence(q, jpql);
     }
@@ -289,9 +295,8 @@
         assertEquivalence(q, jpql);
     }
 
-    @AllowFailure(message = "broken")
     public void testExpressionInProjection() {
-        String jpql = "SELECT o.quantity, o.totalCost*1.08 AS taxedCost, "
+        String jpql = "SELECT o.quantity, o.totalCost*1.08, "
             + "a.zipCode FROM Customer c JOIN c.orders o JOIN c.address a "
             + "WHERE a.state = 'CA' AND a.county = 'Santa Clara'";
         
@@ -299,8 +304,9 @@
         Root<Customer> c = cq.from(Customer.class);
         Join<Customer, Order> o = c.join(Customer_.orders);
         Join<Customer, Address> a = c.join(Customer_.address);
-        cq.where(cb.equal(a.get(Address_.state), "CA"), 
-                 cb.equal(a.get(Address_.county), "Santa Clara"));
+        cq.where(cb.and(
+            cb.equal(a.get(Address_.state), "CA"), 
+            cb.equal(a.get(Address_.county), "Santa Clara")));
         cq.select(o.get(Order_.quantity), cb.prod(o
                 .get(Order_.totalCost), 1.08), a.get(Address_.zipCode));
 
@@ -316,20 +322,19 @@
         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));
+        q.where(cb.and(
+            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 " + 
@@ -338,8 +343,9 @@
         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.where(cb.and(
+            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);
@@ -376,48 +382,32 @@
         assertEquivalence(q, jpql);
     }
 
-    @AllowFailure(message = "Extra Joins created")
     public void testExpression1() {
-        String jpql = "SELECT o.quantity, o.totalCost*1.08 AS taxedCost, "
+        String jpql = "SELECT o.quantity, o.totalCost*1.08, "
             + "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.where(cb.and(
+            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)));
+        q.where(cb.and(
+            cb.equal(course.get(Course_.name), "Calculus"),
+            cb.equal(w.index(), 0))).select(w.get(Student_.name));
 
         assertEquivalence(q, jpql);
     }
@@ -509,35 +499,34 @@
     }
 
     public void testParameters3() {
-        String jpql = "SELECT c FROM Customer c Where c.status = ?1";
+        String jpql = "SELECT c FROM Customer c Where c.status = :stat";
         CriteriaQuery q = cb.create();
         Root<Customer> c = q.from(Customer.class);
-        Parameter<Integer> param = cb.parameter(Integer.class);
+        Parameter<Integer> param = cb.parameter(Integer.class, "stat");
         q.select(c).where(cb.equal(c.get(Customer_.status), param));
-        assertEquivalence(q, jpql, new Object[] { 1 });
+        assertEquivalence(q, jpql, new String[]{"stat"}, 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";
+        String jpql = "SELECT c FROM Customer c Where c.status = :stat AND "
+            + "c.name = :name";
         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" });
+        Parameter<Integer> param1 = cb.parameter(Integer.class, "stat");
+        Parameter<String> param2 = cb.parameter(String.class, "name");
+        q.select(c).where(cb.and(cb.equal(c.get(Customer_.status), param1), 
+                cb.equal(c.get(Customer_.name), param2)));
+        assertEquivalence(q, jpql, new String[]{"stat", "name"},
+                new Object[] { 1, "test" });
     }
     
-    @AllowFailure(message = "Criteria API does not allow collection parameter")
+    @AllowFailure(message="collection valued parameter does not work in in()")
     public void testParameters5() {
         String jpql = "SELECT c FROM Customer c Where c.status IN (:coll)";
         CriteriaQuery q = cb.create();
         Root<Customer> c = q.from(Customer.class);
-        Parameter<List> param1 = cb.parameter(List.class);
+        Parameter<List> param1 = cb.parameter(List.class, "coll");
+        q.where(c.get(Customer_.status).in(param1));
         // q.select(c).where(cb.in(c.get(Customer_.status)).value(params1));
         List vals = new ArrayList();
         vals.add(1);
@@ -546,7 +535,7 @@
             new Object[] {vals});
     }
     
-    @AllowFailure(message="Value() expression not implemented")
+    @AllowFailure(message="Generates invalid SQL")
     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 = "
@@ -555,8 +544,9 @@
         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.where(cb.and(
+        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());
 
@@ -576,37 +566,39 @@
         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";
+    public void testConstructorInProjection() {
+        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);
+        SetJoin<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)));
+        q.select(cb.select(CustomerDetails.class, 
+                            c.get(Customer_.id), 
+                            c.get(Customer_.status), 
+                            o.get(Order_.quantity)));
 
         assertEquivalence(q, jpql);
     }
 
-    @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";
+    @AllowFailure(message="Projections of multiple NEW does not work")
+    public void testMultipleConstructorInProjection() {
+        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))
+        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() {
@@ -625,7 +617,6 @@
         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 ="
@@ -659,8 +650,6 @@
         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";
@@ -675,7 +664,6 @@
         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)";
@@ -692,7 +680,7 @@
         assertEquivalence(q, jpql);
     }
 
-    @AllowFailure(message="Subqueries not implemented")
+    @AllowFailure(message="Root of subquery.delgate is not set")
     public void testSubqueries6() {
         String jpql = "SELECT o FROM Order o JOIN o.customer c WHERE 10000 < "
             + "ALL (SELECT a.balance FROM c.accounts a)";
@@ -722,8 +710,6 @@
         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, "
@@ -740,7 +726,6 @@
         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' "
@@ -757,7 +742,6 @@
         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 "

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=785341&r1=785340&r2=785341&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 Tue Jun 16 18:56:57 2009
@@ -50,6 +50,7 @@
  * Acts as an adapter to OpenJPA ExpressionFactory.
  * 
  * @author Pinaki Poddar
+ * @author Fay Wang
  * 
  * @since 2.0.0
  *
@@ -445,11 +446,11 @@
     }
 
     public <N extends Number> Expression<N> neg(Expression<N> x) {
-        throw new AbstractMethodError();
+        return new Expressions.Diff<N>(0, x);
     }
 
     public Predicate not(Expression<Boolean> restriction) {
-        throw new AbstractMethodError();
+        return new Expressions.Not(restriction);
     }
 
     public Predicate notEqual(Expression<?> x, Expression<?> y) {
@@ -507,11 +508,12 @@
     }
 
     public <T> Parameter<T> parameter(Class<T> paramClass) {
-        return new ParameterImpl<T>(paramClass);
+        throw new UnsupportedOperationException("Unnamed parameter " +
+                "not supported for CriteriaQuery");
     }
 
     public <T> Parameter<T> parameter(Class<T> paramClass, String name) {
-        return new ParameterImpl<T>(paramClass).setName(name);
+        return new ParameterImpl<T>(paramClass, name);
     }
 
     public <N extends Number> Expression<N> prod(Expression<? extends N> x,
@@ -566,7 +568,8 @@
     }
 
     public <Y> Expression<Y> some(Subquery<Y> subquery) {
-        return new Expressions.Some<Y>(subquery);
+        //some and any are synonymous
+        return new Expressions.Any<Y>(subquery);
     }
 
     public Expression<Double> sqrt(Expression<? extends Number> x) {

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaExpressionBuilder.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaExpressionBuilder.java?rev=785341&r1=785340&r2=785341&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaExpressionBuilder.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaExpressionBuilder.java Tue Jun 16 18:56:57 2009
@@ -29,7 +29,7 @@
 import javax.persistence.criteria.Order;
 import javax.persistence.criteria.Root;
 import javax.persistence.criteria.Selection;
-import javax.persistence.metamodel.Entity;
+import javax.persistence.metamodel.Type.PersistenceType;
 
 import org.apache.openjpa.kernel.exps.ExpressionFactory;
 import org.apache.openjpa.kernel.exps.QueryExpressions;
@@ -45,7 +45,6 @@
  * 
  */
 public class CriteriaExpressionBuilder {
-    private int aliasCount = 0;
     
     public QueryExpressions getQueryExpressions(ExpressionFactory factory, 
         CriteriaQueryImpl q) {
@@ -69,8 +68,7 @@
 
         //exps.range = null; // Value[]
         //exps.resultClass = null; // Class
-        if (q.getParameterTypes() != null)
-            exps.parameterTypes = q.getParameterTypes();
+        exps.parameterTypes = q.getParameterTypes();
         return exps;
     }
 
@@ -79,14 +77,21 @@
         Set<ClassMetaData> metas = new HashSet<ClassMetaData>();
         Set<Root<?>> roots = q.getRoots();
         if (roots != null) {
+            MetamodelImpl metamodel = q.getMetamodel();    
             for (Root<?> root : roots) {
-                
                 metas.add(((Types.Managed<?>)root.getModel()).meta);
                 if (root.getJoins() != null) {
                     for (Join<?,?> join : root.getJoins()) {
                         Class<?> cls = join.getMember().getMemberJavaType();
-                        Entity<?> entity = q.getMetamodel().entity(cls);
-                        metas.add(((Types.Managed<?>)entity).meta);
+                        if (join.getMember().isAssociation()) {
+                            ClassMetaData meta = metamodel.repos.
+                                getMetaData(cls, null, true);
+                            PersistenceType type = metamodel.
+                                getPersistenceType(meta);
+                            if (type == PersistenceType.ENTITY ||
+                                type == PersistenceType.EMBEDDABLE) 
+                                metas.add(meta);
+                        }
                     }
                 }
             }
@@ -228,7 +233,7 @@
         //exps.fetchPaths = null;      // String[]
     }
 
-    protected org.apache.openjpa.kernel.exps.Expression and (
+    protected static org.apache.openjpa.kernel.exps.Expression and (
         ExpressionFactory factory,
         org.apache.openjpa.kernel.exps.Expression e1, 
         org.apache.openjpa.kernel.exps.Expression e2) {

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java?rev=785341&r1=785340&r2=785341&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java Tue Jun 16 18:56:57 2009
@@ -20,7 +20,10 @@
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
@@ -37,9 +40,11 @@
 import javax.persistence.metamodel.Entity;
 
 import org.apache.commons.collections.map.LinkedMap;
+import org.apache.openjpa.kernel.StoreQuery;
 import org.apache.openjpa.kernel.exps.ExpressionFactory;
 import org.apache.openjpa.kernel.exps.QueryExpressions;
 import org.apache.openjpa.kernel.exps.Value;
+import org.apache.openjpa.persistence.QueryImpl;
 import org.apache.openjpa.persistence.meta.MetamodelImpl;
 import org.apache.openjpa.persistence.meta.Types;
 
@@ -61,13 +66,12 @@
     private Set<Root<?>>        _roots;
     private PredicateImpl       _where;
     private List<Order>         _orders;
-    private Set<Parameter<?>>   _params;
+    private LinkedHashMap<Parameter<?>, Class<?>>           _paramTypes;
     private List<Selection<?>>  _selections;
     private List<Expression<?>> _groups;
     private PredicateImpl       _having;
     private List<Subquery<?>>   _subqueries;
     private Boolean             _distinct;
-    private LinkedMap           _parameterTypes;
     private SubqueryImpl<?>     _context;
     
     // AliasContext
@@ -106,8 +110,22 @@
         return _orders;
     }
 
+    /**
+     * Registers the given parameter.
+     * 
+     * @param p
+     */
+    public void registerParameter(ParameterImpl<?> p) {
+        if (_paramTypes == null) {
+            _paramTypes = new LinkedHashMap<Parameter<?>, Class<?>>();
+        }
+        _paramTypes.put(p, p.getJavaType());
+        if (p.getPosition() == null)
+            p.setPosition(_paramTypes.size());
+    }
+    
     public Set<Parameter<?>> getParameters() {
-        return _params;
+        return _paramTypes.keySet();
     }
 
     public List<Selection<?>> getSelectionList() {
@@ -213,11 +231,17 @@
     }
     
     public LinkedMap getParameterTypes() {
-        return _parameterTypes;
-    }
-    
-    public void setParameterTypes(LinkedMap parameterTypes) {
-        _parameterTypes = parameterTypes;
+        if (_paramTypes == null)
+            return StoreQuery.EMPTY_PARAMS;
+        LinkedMap  parameterTypes = new LinkedMap();
+        for (Parameter<?> p : _paramTypes.keySet()) {
+            if (p.getName() == null && p.getPosition() == null)
+                throw new RuntimeException(p + " is not set");
+            Object paramKey = p.getName() == null 
+               ? p.getPosition() : p.getName();
+            parameterTypes.put(paramKey, p.getJavaType());
+        }
+        return parameterTypes;
     }
     
     /**
@@ -271,6 +295,8 @@
      * on the variable and path.  
      */
     public void registerVariable(Selection<?> node, Value var, Value path) {
+        if (isRegistered(node))
+            throw new RuntimeException(node + " is already bound");
         if (!var.isVariable())
             throw new RuntimeException(var.getClass() + " is not a variable");
         if (var.getPath() != path)
@@ -291,8 +317,6 @@
                 throw new RuntimeException("Path alias " + path.getAlias() + 
                 " does not match expected selection alias " + alias);
         }
-        if (isRegistered(node))
-            throw new RuntimeException(node + " is already bound");
         _variables.put(node, var);
         _values.put(node, path);
         _aliases.put(node, alias);

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java?rev=785341&r1=785340&r2=785341&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java Tue Jun 16 18:56:57 2009
@@ -49,6 +49,12 @@
         MetamodelImpl model, CriteriaQueryImpl q) {
         return (e == null) ? factory.getNull() : e.toValue(factory, model, q);
     }
+     
+     static void setImplicitTypes(Value v1, Value v2, Class<?> expected, 
+             CriteriaQueryImpl q) {
+         JPQLExpressionBuilder.setImplicitTypes(v1, v2, expected, 
+             q.getMetamodel(), q.getParameterTypes(), q.toString());
+     }
     
     /**
      * Unary Functional Expression applies a unary function on a input
@@ -569,11 +575,9 @@
         org.apache.openjpa.kernel.exps.Expression toKernelExpression(
             ExpressionFactory factory, MetamodelImpl model, 
             CriteriaQueryImpl q) {
-            boolean isTypeExpr = false;
             Value val1 = Expressions.toValue(e1, factory, model, q);
             Value val2 = Expressions.toValue(e2, factory, model, q);
-            JPQLExpressionBuilder.setImplicitTypes(val1, val2, null, null, 
-                q.getParameterTypes(), null);
+            Expressions.setImplicitTypes(val1, val2, e1.getJavaType(), q);
             return isNegated() ? factory.notEqual(val1, val2) 
                     : factory.equal(val1, val2);
         }
@@ -594,8 +598,7 @@
             CriteriaQueryImpl q) {
             Value val1 = Expressions.toValue(e1, factory, model, q);
             Value val2 = Expressions.toValue(e2, factory, model, q); 
-            JPQLExpressionBuilder.setImplicitTypes(val1, val2, null, null, 
-                q.getParameterTypes(), null);
+            Expressions.setImplicitTypes(val1, val2, e1.getJavaType(), q); 
             return factory.greaterThan(val1, val2);
         }
     }
@@ -615,8 +618,7 @@
             CriteriaQueryImpl q) {
             Value val1 = Expressions.toValue(e1, factory, model, q);
             Value val2 = Expressions.toValue(e2, factory, model, q); 
-            JPQLExpressionBuilder.setImplicitTypes(val1, val2, null, null, 
-                q.getParameterTypes(), null);
+            Expressions.setImplicitTypes(val1, val2, e1.getJavaType(), q); 
             return factory.greaterThanEqual(val1, val2);
         }
     }
@@ -636,8 +638,7 @@
             CriteriaQueryImpl q) {
             Value val1 = Expressions.toValue(e1, factory, model, q);
             Value val2 = Expressions.toValue(e2, factory, model, q); 
-            JPQLExpressionBuilder.setImplicitTypes(val1, val2, null, null, 
-                ((CriteriaQueryImpl)q).getParameterTypes(), null);
+            Expressions.setImplicitTypes(val1, val2, e1.getJavaType(), q); 
             return factory.lessThan(val1, val2);
         }
     }
@@ -657,8 +658,7 @@
             CriteriaQueryImpl q) {
             Value val1 = Expressions.toValue(e1, factory, model, q);
             Value val2 = Expressions.toValue(e2, factory, model, q); 
-            JPQLExpressionBuilder.setImplicitTypes(val1, val2, null, null, 
-                q.getParameterTypes(), null);
+            Expressions.setImplicitTypes(val1, val2, e1.getJavaType(), q); 
             return factory.lessThanEqual(val1, val2);
         }
     }
@@ -689,33 +689,38 @@
         @Override
         public Value toValue(ExpressionFactory factory, MetamodelImpl model,
             CriteriaQueryImpl q) {
+            Object value = arg;
+            if (arg instanceof ParameterImpl) {
+                return ((ParameterImpl)arg).toValue(factory, model, q);
+            }
             int literalType = Literal.TYPE_UNKNOWN;
             if (arg != null) {
-                Class<?> literalClass = arg.getClass();
-                if (Number.class.isAssignableFrom(literalClass))
+                Class<?> literalClass = value.getClass();
+                if (Number.class.isAssignableFrom(literalClass)) {
                     literalType = Literal.TYPE_NUMBER;
-                else if (Boolean.class.isAssignableFrom(literalClass))
+                } else if (Boolean.class.isAssignableFrom(literalClass)) {
                     literalType = Literal.TYPE_BOOLEAN;
-                else if (String.class.isAssignableFrom(literalClass))
+                } else if (String.class.isAssignableFrom(literalClass)) {
                     literalType = Literal.TYPE_STRING;
-                else if (Enum.class.isAssignableFrom(literalClass))
+                } else if (Enum.class.isAssignableFrom(literalClass)) {
                     literalType = Literal.TYPE_ENUM;
-                else if (Class.class.isAssignableFrom(literalClass)) {
+                } else if (Class.class.isAssignableFrom(literalClass)) {
                     literalType = Literal.TYPE_CLASS;
-                    Literal lit = factory.newTypeLiteral(arg, 
+                    Literal lit = factory.newTypeLiteral(value, 
                         Literal.TYPE_CLASS);
-                    ClassMetaData can = 
-                        ((Types.Entity<X>)q.getRoot().getModel()).meta;
+                    ClassMetaData can = ((Types.Entity<X>)q.getRoot()
+                            .getModel()).meta;
                     Class<?> candidate = can.getDescribedType();
-                    if (candidate.isAssignableFrom((Class)arg))
-                        lit.setMetaData(model.repos.getMetaData((Class<?>)arg, 
-                            null, true));
-                    else
+                    if (candidate.isAssignableFrom((Class)value)) {
+                       lit.setMetaData(model.repos.getMetaData(
+                           (Class<?>)value, null, true));
+                    } else {
                         lit.setMetaData(can);
+                    }
                     return lit;
                 }
             }
-            return factory.newLiteral(arg, literalType);
+            return factory.newLiteral(value, literalType);
         }
     }
     
@@ -1239,18 +1244,22 @@
         }        
     }
 
-    public static class Some<X> extends ExpressionImpl<X> {
-        final SubqueryImpl<X> e;
-        public Some(Subquery<X> x) {
-            super(x.getJavaType());
-            e = (SubqueryImpl<X>)x;
+    public static class Not<X> extends PredicateImpl {
+        protected ExpressionImpl<Boolean> e;
+        public Not(Expression<Boolean> ne) {
+            super();
+            e = (ExpressionImpl<Boolean>)ne;
         }
         
         @Override
-        public Value toValue(ExpressionFactory factory, MetamodelImpl model,
-            CriteriaQueryImpl q) {
-            //return factory.some(Expressions.toValue(e, factory, model, q));
-            return null;
+        public PredicateImpl clone() {
+            return new Not<X>(e);
+        }
+        
+        @Override
+        public org.apache.openjpa.kernel.exps.Expression toKernelExpression(
+          ExpressionFactory factory, MetamodelImpl model, CriteriaQueryImpl q) {
+            return factory.not(super.toKernelExpression(factory, model, q));
         }        
     }
 

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Joins.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Joins.java?rev=785341&r1=785340&r2=785341&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Joins.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Joins.java Tue Jun 16 18:56:57 2009
@@ -77,11 +77,11 @@
             if (c.isRegistered(this))
                 return c.getValue(this);
             boolean allowNull = joinType != JoinType.INNER;
+            ClassMetaData meta = _member.fmd.getDeclaredTypeMetaData();
             org.apache.openjpa.kernel.exps.Path path = 
                 (org.apache.openjpa.kernel.exps.Path)
-                getParent().toValue(factory, model, c);
+                _parent.toValue(factory, model, c);
             path.get(_member.fmd, allowNull);
-            ClassMetaData meta = _member.fmd.getDeclaredTypeMetaData();
             path.setMetaData(meta);
             path.setImplicitType(meta.getDescribedType());
             return path;
@@ -91,15 +91,30 @@
         public org.apache.openjpa.kernel.exps.Expression toKernelExpression(
             ExpressionFactory factory, MetamodelImpl model, 
             CriteriaQueryImpl c) {
-            org.apache.openjpa.kernel.exps.Value path = this.toValue
-                (factory, model, c);
             ClassMetaData meta = _member.fmd.getDeclaredTypeMetaData();
+            org.apache.openjpa.kernel.exps.Path path = null;
+            if (c.isRegistered(_parent)) {
+               Value var = c.getVariable(_parent);
+               path = factory.newPath(var);
+               path.setMetaData(meta);
+               path.get(_member.fmd, false);
+            } else
+               path = 
+                (org.apache.openjpa.kernel.exps.Path)toValue(factory, model, c);
             Value var = factory.newBoundVariable(c.getAlias(this), 
                 meta.getDescribedType());
             org.apache.openjpa.kernel.exps.Expression join = factory
                 .bindVariable(var, path);
             c.registerVariable(this, var, path);
-            return join;
+            org.apache.openjpa.kernel.exps.Expression filter = null;
+            if (getJoins() != null) {
+                for (Join<?, ?> join1 : getJoins()) {
+                    filter = CriteriaExpressionBuilder.and(factory, 
+                        ((FromImpl<?,?>)join1).
+                        toKernelExpression(factory, model, c), filter);
+                }
+            }
+            return CriteriaExpressionBuilder.and(factory, join, filter);
         }
     }
     
@@ -153,14 +168,17 @@
         public Value toValue(ExpressionFactory factory, MetamodelImpl model,
             CriteriaQueryImpl c) {
             boolean allowNull = joinType != JoinType.INNER;
-            org.apache.openjpa.kernel.exps.Path path = 
-                (org.apache.openjpa.kernel.exps.Path)
-                _parent.toValue(factory, model, c);
-            path.get(_member.fmd, allowNull);
             ClassMetaData meta = _member.fmd.getElement()
-               .getDeclaredTypeMetaData();
-            path.setMetaData(meta);
-            path.setImplicitType(meta.getDescribedType());
+                .getDeclaredTypeMetaData();
+            org.apache.openjpa.kernel.exps.Path path = null;
+            if (c.isRegistered(this)) {
+                Value var = c.getVariable(this);
+                path = factory.newPath(var);
+            } else {
+                path = (org.apache.openjpa.kernel.exps.Path)
+                    _parent.toValue(factory, model, c);
+                path.get(_member.fmd, allowNull);
+            }
             return path;
         }
 
@@ -172,18 +190,35 @@
         public org.apache.openjpa.kernel.exps.Expression toKernelExpression(
             ExpressionFactory factory, MetamodelImpl model, 
             CriteriaQueryImpl c) {
-            org.apache.openjpa.kernel.exps.Value path = toValue
-               (factory, model, c);
-            
             ClassMetaData meta = _member.fmd.isElementCollection() 
                 ? _member.fmd.getEmbeddedMetaData()
                 : _member.fmd.getElement().getDeclaredTypeMetaData();
                 
+            org.apache.openjpa.kernel.exps.Path path = null;
+            if (c.isRegistered(_parent)) {
+                Value var = c.getVariable(_parent);
+                path = factory.newPath(var);
+                path.setMetaData(meta);
+                path.get(_member.fmd, false);
+            } else           
+                path = (org.apache.openjpa.kernel.exps.Path)
+                    toValue(factory, model, c);
+            
             Value var = factory.newBoundVariable(c.getAlias(this), 
                 meta.getDescribedType());
-            return factory.bindVariable(var, path);
-        }
-        
+            org.apache.openjpa.kernel.exps.Expression join = 
+                factory.bindVariable(var, path);
+            c.registerVariable(this, var, path);
+            org.apache.openjpa.kernel.exps.Expression filter = null;
+            if (getJoins() != null) {
+                for (Join<?, ?> join1 : getJoins()) {
+                    filter = CriteriaExpressionBuilder.and(factory, 
+                        ((FromImpl<?,?>)join1).
+                        toKernelExpression(factory, model, c), filter);
+                }
+            }
+            return CriteriaExpressionBuilder.and(factory, join, filter);
+       }
     }
     
     /**
@@ -285,11 +320,11 @@
         }
         
         public Path<K> key() {
-            throw new AbstractMethodError();
+            return new MapKey<Z,K>(this);
         }
         
         public Path<V> value() {
-            throw new AbstractMethodError();
+            return this;
         }
         
         @Override
@@ -311,4 +346,27 @@
             return join;
         }
     }
+    
+       
+   public static class MapKey<Z,K> extends PathImpl<Z,K> {
+       Map<?,K,?> map;
+       public MapKey(Map<Z,K,?> joinMap){
+           super(((javax.persistence.metamodel.Map<Z, K, ?>)joinMap.getMember())
+                   .getKeyJavaType());
+           this.map = joinMap;
+       }
+       
+       /**
+        * Convert this path to a join expression.
+        * 
+        */
+       @Override
+       public Value toValue(ExpressionFactory factory, MetamodelImpl model, 
+           CriteriaQueryImpl c) {
+           org.apache.openjpa.kernel.exps.Path path = 
+               factory.newPath(c.getVariable(map));
+           return factory.getKey(path);
+       }
+   }
+       
 }

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/ParameterImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/ParameterImpl.java?rev=785341&r1=785340&r2=785341&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/ParameterImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/ParameterImpl.java Tue Jun 16 18:56:57 2009
@@ -22,7 +22,6 @@
 
 import javax.persistence.Parameter;
 
-import org.apache.commons.collections.map.LinkedMap;
 import org.apache.openjpa.kernel.exps.ExpressionFactory;
 import org.apache.openjpa.kernel.exps.Value;
 import org.apache.openjpa.meta.ClassMetaData;
@@ -32,64 +31,60 @@
  * Parameter of a criteria query.
  * 
  * @author Pinaki Poddar
- *
+ * @author Fay wang
+ * 
  * @param <T> the type of value held by this parameter.
  */
 public class ParameterImpl<T> extends ExpressionImpl<T> implements Parameter<T>{
 	private String name;
-	private int position;
+	private Integer position;
 	
-    public ParameterImpl(Class<T> cls) {
+    public ParameterImpl(Class<T> cls, String name) {
         super(cls);
+        this.name = name;
     }
 
 	public final String getName() {
 		return name;
 	}
 	
-	public final ParameterImpl<T> setName(String name) {
-		this.name = name;
-		return this;
-	}
-
-	public final Integer getPosition() {
-		return position;
-	}
-
+    public Integer getPosition() {
+        return position;
+    }
+    
+    public void setPosition(int p) {
+        position = p;
+    }
+	
     @Override
     public Value toValue(ExpressionFactory factory, MetamodelImpl model,
         CriteriaQueryImpl q) {
-        boolean positional = false;
-        LinkedMap parameterTypes = ((CriteriaQueryImpl)q).getParameterTypes();
-        if (parameterTypes == null) {
-            parameterTypes = new LinkedMap(6);
-            ((CriteriaQueryImpl)q).setParameterTypes(parameterTypes);
-        } 
-        if (name == null) {
-            position = parameterTypes.size() + 1;
-            positional = true;
-        }
+        q.registerParameter(this);
         
-        Object paramKey = name == null ? Integer.valueOf(position) : name;
-        if (!parameterTypes.containsKey(paramKey))
-            parameterTypes.put(paramKey, Object.class);
 
         ClassMetaData meta = null;
-        Class clzz = getJavaType();
-        int index;
-        if (positional) 
-            index = position - 1;
-        else 
-            // otherwise the index is just the current size of the params
-            index = parameterTypes.indexOf(paramKey);
-        
+        Class<?> clzz = getJavaType();
+        Object paramKey = getKey();
+        int index = getIndex();
         boolean isCollectionValued  = Collection.class.isAssignableFrom(clzz);
         org.apache.openjpa.kernel.exps.Parameter param = isCollectionValued 
-            ? factory.newCollectionValuedParameter(paramKey, Object.class) 
-            : factory.newParameter(paramKey, Object.class);
+            ? factory.newCollectionValuedParameter(paramKey, clzz) 
+            : factory.newParameter(paramKey, clzz);
         param.setMetaData(meta);
         param.setIndex(index);
         
         return param;
     }	
+    
+    Object getKey() {
+        if (name == null && position == null)
+            throw new IllegalStateException(this + " key is not set");
+        return name != null ? name : position;
+    }
+    
+    int getIndex() {
+        if (position == null)
+            throw new IllegalStateException(this + " index is not set");
+        return position-1;
+    }
 }

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PathImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PathImpl.java?rev=785341&r1=785340&r2=785341&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PathImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PathImpl.java Tue Jun 16 18:56:57 2009
@@ -20,6 +20,8 @@
 package org.apache.openjpa.persistence.criteria;
 
 import javax.persistence.criteria.Expression;
+import javax.persistence.criteria.Join;
+import javax.persistence.criteria.JoinType;
 import javax.persistence.criteria.Path;
 import javax.persistence.metamodel.AbstractCollection;
 import javax.persistence.metamodel.Attribute;
@@ -30,6 +32,8 @@
 
 import org.apache.openjpa.kernel.exps.ExpressionFactory;
 import org.apache.openjpa.kernel.exps.Value;
+import org.apache.openjpa.meta.ClassMetaData;
+import org.apache.openjpa.meta.FieldMetaData;
 import org.apache.openjpa.meta.JavaTypes;
 import org.apache.openjpa.persistence.meta.Members;
 import org.apache.openjpa.persistence.meta.MetamodelImpl;
@@ -47,6 +51,7 @@
 public class PathImpl<Z,X> extends ExpressionImpl<X> implements Path<X> {
     protected final PathImpl<?,Z> _parent;
     protected final Members.Member<? super Z,?> _member;
+    private boolean isEmbedded = false;
     
     /**
      * Protected. use by root path which neither represent a member nor has a
@@ -67,11 +72,17 @@
         Class<X> cls) {
         super(cls);
         _parent = parent;
-        _member = member;
+        if (_parent.isEmbedded) {
+            FieldMetaData fmd = getEmbeddedFieldMetaData(member.fmd);
+            _member = new Members.Attribute(member.owner, fmd);
+        } else 
+            _member = member;
         if (parent == null)
             throw new NullPointerException("Null parent for member " + member);
         if (member == null)
             throw new NullPointerException("Null member for parent " + parent);
+        if (_member.fmd.isEmbedded())
+            isEmbedded = true;
     }
     
     public PathImpl<?,Z> getParentPath() {
@@ -82,6 +93,22 @@
         return (_parent == null) ? this : _parent.getInnermostParentPath();
     }
 
+    protected FieldMetaData getEmbeddedFieldMetaData(FieldMetaData fmd) {
+        Members.Member member = getInnermostMember(_parent,_member);
+        ClassMetaData embeddedMeta = member.fmd.getEmbeddedMetaData();
+        if (embeddedMeta != null)
+            return embeddedMeta.getField(fmd.getName());
+        else
+            return fmd;
+    }
+    
+    protected Members.Member getInnermostMember(PathImpl parent, 
+        Members.Member member) {
+        return member != null ? member : getInnermostMember(parent._parent,
+            parent._member); 
+    }
+    
+    
     /**
      * Convert this path to a kernel path.
      */
@@ -102,11 +129,14 @@
         } else if (_parent != null) { 
             if (q.isRegistered(_parent)) {
                 path = factory.newPath(q.getVariable(_parent));
+                ClassMetaData meta = _member.fmd.getDeclaredTypeMetaData();
+                path.setMetaData(meta);
             } else {
                 path = (org.apache.openjpa.kernel.exps.Path)
                      _parent.toValue(factory, model, q);
             }
-            boolean allowNull = false;
+            boolean allowNull = _parent instanceof Join 
+                    && ((Join<?,?>)_parent).getJoinType() != JoinType.INNER;
             path.get(_member.fmd, allowNull);
         } else {
             path = factory.newPath();

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SubqueryImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SubqueryImpl.java?rev=785341&r1=785340&r2=785341&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SubqueryImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SubqueryImpl.java Tue Jun 16 18:56:57 2009
@@ -160,21 +160,26 @@
     }
     
     public <X,Y> Join<X,Y> correlate(Join<X,Y> join) {
+        _delegate.from(join.getModel().getJavaType());
         return join;
     }
     public <X,Y> CollectionJoin<X,Y> correlate(CollectionJoin<X,Y> join) {
+        _delegate.from(join.getModel().getJavaType());
         return join;
     }
     
     public <X,Y> SetJoin<X,Y> correlate(SetJoin<X,Y> join) {
+        _delegate.from(join.getModel().getJavaType());
         return join;
     }
     
     public <X,Y> ListJoin<X,Y> correlate(ListJoin<X,Y> join) {
+        _delegate.from(join.getModel().getJavaType());
         return join;
     }
     
     public <X,K,V> MapJoin<X,K,V> correlate(MapJoin<X,K,V> join) {
+        _delegate.from(join.getModel().getJavaType());
         return join;
     }