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/30 15:40:18 UTC

svn commit: r789723 [2/2] - in /openjpa/trunk: openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/ openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/ openjpa-persistence/src/main/java/org/apache/open...

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=789723&r1=789722&r2=789723&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 30 13:40:17 2009
@@ -25,14 +25,17 @@
 import javax.persistence.Parameter;
 import javax.persistence.Tuple;
 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.MapJoin;
+import javax.persistence.criteria.ParameterExpression;
 import javax.persistence.criteria.Root;
 import javax.persistence.criteria.SetJoin;
 import javax.persistence.criteria.Subquery;
 import javax.persistence.criteria.QueryBuilder.Case;
+import javax.persistence.criteria.QueryBuilder.SimpleCase;
 
 import org.apache.openjpa.persistence.test.AllowFailure;
 
@@ -107,28 +110,29 @@
 
     public void testProjection() {
         String jpql = "select a.balance,a.loan from Account a";
-        CriteriaQuery<?> c = cb.createQuery();
+        CriteriaQuery<Tuple> c = cb.createTupleQuery();
         Root<Account> account = c.from(Account.class);
-//        c.select(account.get(Account_.balance), account.get(Account_.loan));
+        c.multiselect(account.get(Account_.balance), account.get(Account_.loan));
         assertEquivalence(c, jpql);
     }
 
     public void testAbsExpression() {
-        CriteriaQuery<?> c = cb.createQuery();
+        String jpql = "select a from Account a where abs(a.balance)=100";
+
+        CriteriaQuery<Account> c = cb.createQuery(Account.class);
         Root<Account> account = c.from(Account.class);
 
-        String jpql = "select a from Account a where abs(a.balance)=100";
-//        c.select(account).where(
-//                cb.equal(cb.abs(account.get(Account_.balance)), 100));
+        c.select(account).where(cb.equal(cb.abs(account.get(Account_.balance)), 100));
         assertEquivalence(c, jpql);
     }
 
     public void testAvgExpression() {
-        CriteriaQuery<?> c = cb.createQuery();
+        String jpql = "select avg(a.balance) from Account a";
+
+        CriteriaQuery<Double> c = cb.createQuery(Double.class);
         Root<Account> account = c.from(Account.class);
 
-        String jpql = "select avg(a.balance) from Account a";
-//        c.select(cb.avg(account.get(Account_.balance)));
+        c.select(cb.avg(account.get(Account_.balance)));
         assertEquivalence(c, jpql);
     }
 
@@ -330,9 +334,9 @@
     public void testTypeExpression() {
         String jpql = "SELECT TYPE(e) FROM Employee e WHERE TYPE(e) <> Exempt";
         
-        CriteriaQuery<?> q = cb.createQuery();
+        CriteriaQuery<Object> q = cb.createQuery();
         Root<Employee> emp = q.from(Employee.class);
-//        q.select(emp.type()).where(cb.notEqual(emp.type(), Exempt.class));
+        q.multiselect(emp.type()).where(cb.notEqual(emp.type(), Exempt.class));
 
         assertEquivalence(q, jpql);
     }
@@ -372,30 +376,28 @@
         String jpql = "SELECT SIZE(d.employees) FROM Department d "
             + "WHERE d.name = 'Sales'";
         
-        CriteriaQuery<?> q = cb.createQuery();
+        CriteriaQuery<Integer> q = cb.createQuery(Integer.class);
         Root<Department> d = q.from(Department.class);
         q.where(cb.equal(d.get(Department_.name), "Sales"));
-//        q.select(cb.size(d.get(Department_.employees)));
+        q.select(cb.size(d.get(Department_.employees)));
 
         assertEquivalence(q, jpql);
     }
 
     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 "
+        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'";
         CriteriaQuery<?> q = cb.createQuery();
         Root<Employee> e = q.from(Employee.class);
-        q.where(cb.equal(e.get(Employee_.department).get(Department_.name),
-        "Engineering"));
-//        q.select(e.get(Employee_.name), cb.multiselect(Case().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))));
+        q.where(cb.equal(e.get(Employee_.department).get(Department_.name), "Engineering"));
+        q.multiselect(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)));
 
         assertEquivalence(q, jpql);
     }
@@ -440,14 +442,12 @@
             + "FROM Employee e WHERE e.department.name = 'Engineering'";
         CriteriaQuery<?> q = cb.createQuery();
         Root<Employee> e = q.from(Employee.class);
-        q.where(cb.equal(e.get(Employee_.department).get(Department_.name),
-        "Engineering"));
-//        q.select(e.get(Employee_.name), cb.multiselect(Case().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)));
+        q.where(cb.equal(e.get(Employee_.department).get(Department_.name), "Engineering"));
+        q.multiselect(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)));
 
         assertEquivalence(q, jpql);
     }
@@ -457,14 +457,16 @@
             + "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.createQuery();
+        CriteriaQuery<Tuple> q = cb.createTupleQuery();
         Root<Employee> e = q.from(Employee.class);
-        q.where(cb.equal(e.get(Employee_.department).get(Department_.name),
-        "Engineering"));
-//        q.select(e.get(Employee_.name), cb.multiselect(Case(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)));
+        q.where(cb.equal(e.get(Employee_.department).get(Department_.name), "Engineering"));
+        Expression<Long> salary = e.get(Employee_.salary); 
+        Expression<Integer> rating  = e.get(Employee_.rating);
+        q.multiselect(e.get(Employee_.name),
+                      cb.selectCase(rating).
+                              when(1, cb.prod(salary, 1.1))
+                             .when(2, cb.prod(salary, 1.2))
+                             .otherwise(cb.prod(salary, 1.01)));
 
         assertEquivalence(q, jpql);
     }
@@ -473,46 +475,47 @@
         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'";
-        CriteriaQuery<?> q = cb.createQuery();
+        CriteriaQuery<Tuple> q = cb.createTupleQuery();
         Root<Employee> e = q.from(Employee.class);
-        q.where(cb.equal(e.get(Employee_.department).get(Department_.name),
-        "Engineering"));
-//        q.select(e.get(Employee_.name), cb.multiselect(Case(e.get(Employee_.rating))
-//                .when(1, 10).when(2, 20).otherwise(30));
+        Expression<Integer> rating  = e.get(Employee_.rating);
+        q.where(cb.equal(e.get(Employee_.department).get(Department_.name), "Engineering"));
+        q.multiselect(e.get(Employee_.name), 
+                cb.selectCase(rating)
+                  .when(1, 10)
+                  .when(2, 20)
+                  .otherwise(30));
         assertEquivalence(q, jpql);
     }
 
     public void testLiterals() {
-        String jpql = "SELECT p FROM Person p where 'Joe' MEMBER OF " +
-        "p.nickNames";
-        CriteriaQuery<?> q = cb.createQuery();
+        String jpql = "SELECT p FROM Person p where 'Joe' MEMBER OF p.nickNames";
+        CriteriaQuery<Person> q = cb.createQuery(Person.class);
         Root<Person> p = q.from(Person.class);
-//        q.select(p).where(
-//                cb.isMember(cb.literal("Joe"), p.get(Person_.nickNames)));
+        q.select(p).where(cb.isMember(cb.literal("Joe"), p.get(Person_.nickNames)));
 
         assertEquivalence(q, jpql);
     }
 
     public void testParameters1() {
         String jpql = "SELECT c FROM Customer c Where c.status = :stat";
-        CriteriaQuery<?> q = cb.createQuery();
+        
+        CriteriaQuery<Customer> q = cb.createQuery(Customer.class);
         Root<Customer> c = q.from(Customer.class);
         Parameter<Integer> param = cb.parameter(Integer.class, "stat");
-//        q.select(c).where(cb.equal(c.get(Customer_.status), param));
+        q.select(c).where(cb.equal(c.get(Customer_.status), param));
 
         assertEquivalence(q, jpql, new String[] { "stat" }, new Object[] { 1 });
     }
 
     public void testParameters2() {
-        String jpql = "SELECT c FROM Customer c Where c.status = :stat AND "
-            + "c.name = :name";
-        CriteriaQuery<?> q = cb.createQuery();
+        String jpql = "SELECT c FROM Customer c Where c.status = :stat AND c.name = :name";
+        
+        CriteriaQuery<Customer> q = cb.createQuery(Customer.class);
         Root<Customer> c = q.from(Customer.class);
         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)));
+        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" });
@@ -520,22 +523,24 @@
 
     public void testParameters3() {
         String jpql = "SELECT c FROM Customer c Where c.status = :stat";
-        CriteriaQuery<?> q = cb.createQuery();
+
+        CriteriaQuery<Customer> q = cb.createQuery(Customer.class);
         Root<Customer> c = q.from(Customer.class);
         Parameter<Integer> param = cb.parameter(Integer.class, "stat");
-//        q.select(c).where(cb.equal(c.get(Customer_.status), param));
+        q.select(c).where(cb.equal(c.get(Customer_.status), param));
+        
         assertEquivalence(q, jpql, new String[]{"stat"}, new Object[] { 1 });
     }
 
     public void testParameters4() {
-        String jpql = "SELECT c FROM Customer c Where c.status = :stat AND "
-            + "c.name = :name";
-        CriteriaQuery<?> q = cb.createQuery();
+        String jpql = "SELECT c FROM Customer c Where c.status = :stat AND c.name = :name";
+        
+        CriteriaQuery<Customer> q = cb.createQuery(Customer.class);
         Root<Customer> c = q.from(Customer.class);
         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)));
+        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" });
     }
@@ -543,16 +548,16 @@
     @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.createQuery();
+        
+        CriteriaQuery<Customer> q = cb.createQuery(Customer.class);
         Root<Customer> c = q.from(Customer.class);
-        Parameter<List> param1 = cb.parameter(List.class, "coll");
+        ParameterExpression<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));
+        q.select(c);
         List vals = new ArrayList();
         vals.add(1);
         vals.add(2);
-        assertEquivalence(q, jpql, new String[] {"coll"}, 
-            new Object[] {vals});
+        assertEquivalence(q, jpql, new String[] {"coll"}, new Object[] {vals});
     }
     
     @AllowFailure(message="Generates invalid SQL")
@@ -560,29 +565,27 @@
         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.createQuery();
+        
+        CriteriaQuery<Tuple> q = cb.createTupleQuery();
         Root<VideoStore> v = q.from(VideoStore.class);
-        MapJoin<VideoStore, Movie, Integer> inv = v
-        .join(VideoStore_.videoInventory);
+        MapJoin<VideoStore, Movie, Integer> i = v.join(VideoStore_.videoInventory);
         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());
+        cb.equal(v.get(VideoStore_.location).get(Address_.zipCode), "94301"), 
+        cb.gt(i.value(), 0)));
+        q.multiselect(v.get(VideoStore_.location).get(Address_.street), 
+                i.key().get(Movie_.title), 
+                i.value());
 
         assertEquivalence(q, jpql);
     }
 
     public void testNewConstruct() {
-        String jpql = "SELECT NEW CustomerDetails(c.id, c.status) FROM "
-            + "Customer c";
+        String jpql = "SELECT NEW CustomerDetails(c.id, c.status) FROM Customer c";
         
-        CriteriaQuery<?> q = cb.createQuery();
+        CriteriaQuery<CustomerDetails> q = cb.createQuery(CustomerDetails.class);
 
         Root<Customer> c = q.from(Customer.class);
-//        q.select(cb.multiselect(CustomerDetails.class, c.get(Customer_.id), 
-//                c.get(Customer_.status))
-//        );
+        q.select(cb.construct(CustomerDetails.class, c.get(Customer_.id), c.get(Customer_.status)));
         assertEquivalence(q, jpql);
     }
     
@@ -626,13 +629,13 @@
             + "goodCustomer.balanceOwed < (SELECT AVG(c.balanceOwed) " 
             + " FROM "
             + "Customer c)";
-        CriteriaQuery<?> q = cb.createQuery();
+        CriteriaQuery<Customer> q = cb.createQuery(Customer.class);
         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);
+        q.select(goodCustomer);
 
         assertEquivalence(q, jpql);
     }
@@ -641,14 +644,14 @@
         String jpql = "SELECT DISTINCT emp FROM Employee emp WHERE EXISTS ("
             + "SELECT spouseEmp FROM Employee spouseEmp WHERE spouseEmp ="
             + " emp.spouse)";
-        CriteriaQuery<?> q = cb.createQuery();
+        CriteriaQuery<Employee> q = cb.createQuery(Employee.class);
         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);
+        q.select(emp).distinct(true);
 
         assertEquivalence(q, jpql);
     }
@@ -657,9 +660,9 @@
         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.createQuery();
+        CriteriaQuery<Employee> q = cb.createQuery(Employee.class);
         Root<Employee> emp = q.from(Employee.class);
-//        q.select(emp);
+        q.select(emp);
         Subquery<BigDecimal> sq = q.subquery(BigDecimal.class);
         Root<Manager> m = sq.from(Manager.class);
         sq.select(m.get(Manager_.salary));
@@ -673,9 +676,9 @@
     public void testSubqueries4() {
         String jpql = "SELECT c FROM Customer c WHERE "
             + "(SELECT COUNT(o) FROM c.orders o) > 10";
-        CriteriaQuery<?> q = cb.createQuery();
+        CriteriaQuery<Customer> q = cb.createQuery(Customer.class);
         Root<Customer> c1 = q.from(Customer.class);
-//        q.select(c1);
+        q.select(c1);
         Subquery<Long> sq3 = q.subquery(Long.class);
         Root<Customer> c2 = sq3.correlate(c1);
         Join<Customer, Order> o = c2.join(Customer_.orders);
@@ -687,9 +690,9 @@
     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.createQuery();
+        CriteriaQuery<Order> q = cb.createQuery(Order.class);
         Root<Order> o = q.from(Order.class);
-//        q.select(o);
+        q.select(o);
         Subquery<Integer> sq = q.subquery(Integer.class);
         Root<Order> osq = sq.correlate(o);
         Join<Order, Customer> c = osq.join(Order_.customer);
@@ -700,13 +703,12 @@
         assertEquivalence(q, jpql);
     }
 
-    @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)";
-        CriteriaQuery<?> q = cb.createQuery();
+        CriteriaQuery<Order> q = cb.createQuery(Order.class);
         Root<Order> o = q.from(Order.class);
-//        q.select(o);
+        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);
@@ -720,12 +722,12 @@
     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)";
-        CriteriaQuery<?> q = cb.createQuery();
+        CriteriaQuery<Tuple> q = cb.createTupleQuery();
         Root<Customer> c = q.from(Customer.class);
         q.groupBy(c.get(Customer_.status));
         q.having(cb.in(c.get(Customer_.status)).value(1).value(2));
-//        q.select(c.get(Customer_.status), cb.avg(c
-//                .get(Customer_.filledOrderCount)), cb.count(c));
+        q.multiselect(c.get(Customer_.status), cb.avg(c
+                .get(Customer_.filledOrderCount)), cb.count(c));
 
         assertEquivalence(q, jpql);
     }
@@ -734,14 +736,14 @@
         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.createQuery();
+        CriteriaQuery<Order> q = cb.createQuery(Order.class);
         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);
+        q.select(o);
 
         assertEquivalence(q, jpql);
     }
@@ -750,14 +752,14 @@
         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.createQuery();
+        CriteriaQuery<Tuple> q = cb.createTupleQuery();
         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));
+        q.multiselect(o.get(Order_.quantity), a.get(Address_.zipCode));
 
         assertEquivalence(q, jpql);
     }
@@ -767,29 +769,29 @@
             + "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.createQuery();
+        CriteriaQuery<Tuple> q = cb.createTupleQuery();
         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)),
+        Expression<Double> taxedCost = cb.prod(o.get(Order_.totalCost), 1.08);
+        taxedCost.setAlias("taxedCost");
+        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(taxedCost),
                 cb.asc(a.get(Address_.zipCode)));
-//        q.select(o.get(Order_.quantity), cb.prod(
-//                o.get(Order_.totalCost), 1.08), a.get(Address_.zipCode));
+        q.multiselect(o.get(Order_.quantity), taxedCost, 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.createQuery();
+        String jpql = "SELECT c FROM Customer c ORDER BY c.name DESC, c.status";
+        CriteriaQuery<Customer> q = cb.createQuery(Customer.class);
         Root<Customer> c = q.from(Customer.class);
-        q.orderBy(cb.desc(c.get(Customer_.name)), cb.asc(c
-                .get(Customer_.status)));
-//        q.select(c);
+        q.orderBy(cb.desc(c.get(Customer_.name)), 
+                  cb.asc(c.get(Customer_.status)));
+        q.select(c);
 
         assertEquivalence(q, jpql);
     }

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/ImplicitFieldAccessMappedSuperclass_.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/ImplicitFieldAccessMappedSuperclass_.java?rev=789723&r1=789722&r2=789723&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/ImplicitFieldAccessMappedSuperclass_.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/ImplicitFieldAccessMappedSuperclass_.java Tue Jun 30 13:40:17 2009
@@ -12,4 +12,5 @@
 public class ImplicitFieldAccessMappedSuperclass_ {
     public static volatile SingularAttribute<ImplicitFieldAccessMappedSuperclass,Date> createTime;
     public static volatile SingularAttribute<ImplicitFieldAccessMappedSuperclass,Long> id;
+    public static volatile SingularAttribute<ImplicitFieldAccessMappedSuperclass,Integer> version;
 }

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/TestMetamodel.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/TestMetamodel.java?rev=789723&r1=789722&r2=789723&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/TestMetamodel.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/TestMetamodel.java Tue Jun 30 13:40:17 2009
@@ -35,7 +35,6 @@
 import javax.persistence.metamodel.Type.PersistenceType;
 
 import org.apache.openjpa.meta.ClassMetaData;
-import org.apache.openjpa.meta.MetaDataRepository;
 import org.apache.openjpa.persistence.enhance.identity.Book;
 import org.apache.openjpa.persistence.enhance.identity.BookId;
 import org.apache.openjpa.persistence.enhance.identity.Library;
@@ -82,10 +81,9 @@
     }
     
     public void testMetaClassFieldsArePopulated() {
-        EntityType<ImplicitFieldAccessSubclass> m = 
-            model.entity(ImplicitFieldAccessSubclass.class);
-        Class<?> mCls = m.getJavaType();
+        EntityType<ImplicitFieldAccessSubclass> m =  model.entity(ImplicitFieldAccessSubclass.class);
         assertNotNull(m);
+        Class<?> mCls = m.getJavaType();
         assertSame(ImplicitFieldAccessSubclass.class, mCls);
         
         Class<?> m2Cls = model.repos.getMetaModel(mCls, true);
@@ -102,7 +100,7 @@
         }
     }
     
-    public void testDomainClassAreCategorizedInPersistentCategory() {
+    public void testDomainClassCategorizedInPersistentCategory() {
     	assertCategory(PersistenceType.MAPPED_SUPERCLASS, ImplicitFieldAccessMappedSuperclass.class);
     	assertCategory(PersistenceType.ENTITY, ImplicitFieldAccessBase.class);
     	assertCategory(PersistenceType.ENTITY, ImplicitFieldAccessSubclass.class);
@@ -130,19 +128,15 @@
             e0.getSingularAttribute("f0", ExplicitFieldAccess.class);
             fail("Expected IllegalArgumentException");
         } catch (IllegalArgumentException e) {
-            
+            // good
         }
-        ManagedType<ImplicitFieldAccessSubclass> e1 = model.entity(
-        		ImplicitFieldAccessSubclass.class);
+        ManagedType<ImplicitFieldAccessSubclass> e1 = model.entity(ImplicitFieldAccessSubclass.class);
         assertNotNull(e1.getAttribute("f0"));
-        
     }
     
     public void testAttributeByDeclaration() {
-        ManagedType<ImplicitFieldAccessBase> e0 = 
-        	model.entity(ImplicitFieldAccessBase.class);
-        ManagedType<ImplicitFieldAccessSubclass> e1 = 
-        	model.entity(ImplicitFieldAccessSubclass.class);
+        ManagedType<ImplicitFieldAccessBase> e0 = model.entity(ImplicitFieldAccessBase.class);
+        ManagedType<ImplicitFieldAccessSubclass> e1 = model.entity(ImplicitFieldAccessSubclass.class);
         assertNotNull(e0.getAttribute("f0"));
         assertNotNull(e1.getAttribute("f0"));
         System.err.println(e0.getAttribute("f0"));
@@ -151,14 +145,13 @@
         assertSame(e0.getAttribute("f0"), e0.getSingularAttribute("f0", String.class));
         assertSame(e1.getAttribute("f0"), e1.getSingularAttribute("f0", String.class));
         assertNotSame(e0.getAttribute("f0"), e1.getAttribute("f0"));
-        assertNotSame(e0.getSingularAttribute("f0", String.class), e1.getSingularAttribute("f0",
-            String.class));
+        assertNotSame(e0.getSingularAttribute("f0", String.class), e1.getSingularAttribute("f0", String.class));
         assertNotNull(e0.getDeclaredAttribute("f0"));
         try {
             e1.getDeclaredAttribute("f0");
             fail("Expected IllegalArgumentException");
         } catch (IllegalArgumentException e) {
-            
+            // good
         }
     }
     
@@ -189,10 +182,8 @@
     }
     
     public void testPCSet() {
-        ManagedType<ImplicitFieldAccessBase> e0 = 
-        	model.entity(ImplicitFieldAccessBase.class);
-        ManagedType<ExplicitFieldAccess> r1 = 
-        	model.entity(ExplicitFieldAccess.class);
+        ManagedType<ImplicitFieldAccessBase> e0 = model.entity(ImplicitFieldAccessBase.class);
+        ManagedType<ExplicitFieldAccess> r1 = model.entity(ExplicitFieldAccess.class);
         SetAttribute<?, ?> relSet = e0.getSet("setRelation", ExplicitFieldAccess.class);
         assertEquals(javax.persistence.metamodel.PluralAttribute.CollectionType.SET, relSet.getCollectionType());
         assertEquals(e0, relSet.getDeclaringType());

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/ResultItemImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/ResultItemImpl.java?rev=789723&r1=789722&r2=789723&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/ResultItemImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/ResultItemImpl.java Tue Jun 30 13:40:17 2009
@@ -18,7 +18,7 @@
  */
 package org.apache.openjpa.persistence;
 
-import javax.persistence.ResultItem;
+import javax.persistence.TupleElement;
 
 /**
  * A single dimension of projection in query result.
@@ -27,9 +27,9 @@
  *
  * @param <X> type of the result
  */
-public class ResultItemImpl<X> implements ResultItem<X> {
+public class ResultItemImpl<X> implements TupleElement<X> {
     protected String _alias;
-    protected Class<X> _cls;
+    protected final Class<X> _cls;
 
     protected ResultItemImpl(Class<X> cls) {
         _cls = cls;

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=789723&r1=789722&r2=789723&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 30 13:40:17 2009
@@ -89,7 +89,7 @@
      *  @return query object
      */
     public <T> CriteriaQuery<T> createQuery(Class<T> resultClass) {
-        throw new UnsupportedOperationException();
+        return new CriteriaQueryImpl<T>(_model, resultClass);
     }
 
     /**
@@ -98,7 +98,7 @@
      *  @return query object
      */
     public CriteriaQuery<Tuple> createTupleQuery() {
-        throw new UnsupportedOperationException();
+        return new CriteriaQueryImpl<Tuple>(_model, Tuple.class);
     }
 
     public Object parse(String ql, ExpressionStoreQuery query) {
@@ -106,22 +106,12 @@
     }
 
     public void populate(Object parsed, ExpressionStoreQuery query) {
-        CriteriaQueryImpl c = (CriteriaQueryImpl) parsed;
+        CriteriaQueryImpl<?> c = (CriteriaQueryImpl<?>) parsed;
         query.invalidateCompilation();
         query.getContext().setCandidateType(c.getRoot().getJavaType(), true);
         query.setQuery(parsed);
     }
 
-    /**
-     * Define a select list item corresponding to a constructor.
-     * @param result  class whose instance is to be constructed
-     * @param selections  arguments to the constructor
-     * @return selection item
-     */
-    public <Y> Selection<Y> construct(Class<Y> result, Selection<?>... selections) {
-        throw new UnsupportedOperationException();
-    }
-    
     public <N extends Number> Expression<N> abs(Expression<N> x) {
         return new Expressions.Abs<N>(x);
     }
@@ -199,8 +189,8 @@
         return new Expressions.Count(x, true);
     }
 
-    public CriteriaQuery createQuery() {
-        return new CriteriaQueryImpl(_model);
+    public CriteriaQuery<Object> createQuery() {
+        return new CriteriaQueryImpl<Object>(_model, Object.class);
     }
 
     public Expression<Date> currentDate() {
@@ -305,8 +295,7 @@
         return new Expressions.In<T>(expression);
     }
 
-    public <C extends Collection<?>> Predicate isEmpty(
-        Expression<C> collection) {
+    public <C extends Collection<?>> Predicate isEmpty(Expression<C> collection) {
         return new Expressions.IsEmpty(collection);
     }
 
@@ -314,28 +303,23 @@
         return new Expressions.Equal(x, false);
     }
 
-    public <E, C extends Collection<E>> Predicate isMember(E e,
-        Expression<C> c) {
+    public <E, C extends Collection<E>> Predicate isMember(E e, Expression<C> c) {
         return new Expressions.IsMember<E>(e, c);
     }
 
-    public <E, C extends Collection<E>> Predicate isMember(Expression<E> e,
-        Expression<C> c) {
+    public <E, C extends Collection<E>> Predicate isMember(Expression<E> e, Expression<C> c) {
         return new Expressions.IsMember<E>(e.getJavaType(), e, c);
     }
 
-    public <C extends Collection<?>> Predicate isNotEmpty(
-        Expression<C> collection) {
-        return isEmpty(collection).negate();
+    public <C extends Collection<?>> Predicate isNotEmpty(Expression<C> collection) {
+        return new Expressions.IsNotEmpty(collection);
     }
 
-    public <E, C extends Collection<E>> Predicate isNotMember(E e,
-        Expression<C> c) {
+    public <E, C extends Collection<E>> Predicate isNotMember(E e, Expression<C> c) {
         return isMember(e, c).negate();
     }
 
-    public <E, C extends Collection<E>> Predicate isNotMember(
-        Expression<E> e, Expression<C> c) {
+    public <E, C extends Collection<E>> Predicate isNotMember(Expression<E> e, Expression<C> c) {
         return isMember(e, c).negate();
     }
 
@@ -347,8 +331,7 @@
         throw new AbstractMethodError();
     }
 
-    public Predicate le(Expression<? extends Number> x,
-        Expression<? extends Number> y) {
+    public Predicate le(Expression<? extends Number> x, Expression<? extends Number> y) {
         return new Expressions.LessThanEqual(x,y);
     }
 
@@ -365,24 +348,20 @@
 
     }
 
-    public <Y extends Comparable<Y>> Predicate lessThan(
-        Expression<? extends Y> x, Expression<? extends Y> y) {
+    public <Y extends Comparable<Y>> Predicate lessThan(Expression<? extends Y> x, Expression<? extends Y> y) {
         return new Expressions.LessThan(x,y);
     }
 
-    public <Y extends Comparable<Y>> Predicate lessThan(
-        Expression<? extends Y> x, Y y) {
+    public <Y extends Comparable<Y>> Predicate lessThan(Expression<? extends Y> x, Y y) {
         return new Expressions.LessThan(x,y);
 
     }
 
-    public <Y extends Comparable<Y>> Predicate lessThanOrEqualTo(
-        Expression<? extends Y> x, Expression<? extends Y> y) {
+    public <Y extends Comparable<Y>> Predicate lessThanOrEqualTo(Expression<? extends Y> x, Expression<? extends Y> y) {
         return new Expressions.LessThanEqual(x,y);
     }
 
-    public <Y extends Comparable<Y>> Predicate lessThanOrEqualTo(
-        Expression<? extends Y> x, Y y) {
+    public <Y extends Comparable<Y>> Predicate lessThanOrEqualTo(Expression<? extends Y> x, Y y) {
         return new Expressions.LessThanEqual(x,y);
     }
 
@@ -394,23 +373,19 @@
         return new Expressions.Like(x,pattern);
     }
 
-    public Predicate like(Expression<String> x, Expression<String> pattern,
-        Expression<Character> escapeChar) {
+    public Predicate like(Expression<String> x, Expression<String> pattern, Expression<Character> escapeChar) {
         return new Expressions.Like(x,pattern,escapeChar);
     }
 
-    public Predicate like(Expression<String> x, Expression<String> pattern,
-        char escapeChar) {
+    public Predicate like(Expression<String> x, Expression<String> pattern, char escapeChar) {
         return new Expressions.Like(x,pattern,escapeChar);
     }
 
-    public Predicate like(Expression<String> x, String pattern,
-        Expression<Character> escapeChar) {
+    public Predicate like(Expression<String> x, String pattern, Expression<Character> escapeChar) {
         return new Expressions.Like(x,pattern,escapeChar);
     }
 
-    public Predicate like(Expression<String> x, String pattern, 
-        char escapeChar) {
+    public Predicate like(Expression<String> x, String pattern, char escapeChar) {
         return new Expressions.Like(x,pattern,escapeChar);
     }
 
@@ -418,8 +393,7 @@
         return new Expressions.Constant<T>(value);
     }
 
-    public Expression<Integer> locate(Expression<String> x,
-        Expression<String> pattern) {
+    public Expression<Integer> locate(Expression<String> x, Expression<String> pattern) {
         return new Expressions.Locate(x, pattern);
     }
 
@@ -428,14 +402,12 @@
 
     }
 
-    public Expression<Integer> locate(Expression<String> x,
-        Expression<String> pattern, Expression<Integer> from) {
+    public Expression<Integer> locate(Expression<String> x, Expression<String> pattern, Expression<Integer> from) {
         return new Expressions.Locate(x, pattern, from);
 
     }
 
-    public Expression<Integer> locate(Expression<String> x, String pattern,
-        int from) {
+    public Expression<Integer> locate(Expression<String> x, String pattern, int from) {
         return new Expressions.Locate(x, pattern, from);
 
     }
@@ -445,8 +417,7 @@
 
     }
 
-    public Predicate lt(Expression<? extends Number> x,
-        Expression<? extends Number> y) {
+    public Predicate lt(Expression<? extends Number> x, Expression<? extends Number> y) {
         return new Expressions.LessThan(x,y);
     }
 
@@ -462,8 +433,7 @@
         return new Expressions.Min<N>(x);
     }
 
-    public Expression<Integer> mod(Expression<Integer> x, 
-        Expression<Integer> y) {
+    public Expression<Integer> mod(Expression<Integer> x, Expression<Integer> y) {
         return new Expressions.Mod(x,y);
     }
 
@@ -499,23 +469,19 @@
         return like(x, pattern).negate();
     }
 
-    public Predicate notLike(Expression<String> x, Expression<String> pattern,
-        Expression<Character> escapeChar) {
+    public Predicate notLike(Expression<String> x, Expression<String> pattern, Expression<Character> escapeChar) {
         return like(x, pattern, escapeChar).negate();
     }
 
-    public Predicate notLike(Expression<String> x, Expression<String> pattern,
-        char escapeChar) {
+    public Predicate notLike(Expression<String> x, Expression<String> pattern, char escapeChar) {
         return like(x, pattern, escapeChar).negate();
     }
 
-    public Predicate notLike(Expression<String> x, String pattern,
-        Expression<Character> escapeChar) {
+    public Predicate notLike(Expression<String> x, String pattern, Expression<Character> escapeChar) {
         return like(x, pattern, escapeChar).negate();
     }
 
-    public Predicate notLike(Expression<String> x, String pattern,
-        char escapeChar) {
+    public Predicate notLike(Expression<String> x, String pattern, char escapeChar) {
         return like(x, pattern, escapeChar).negate();
     }
 
@@ -546,23 +512,19 @@
         return new ParameterImpl<T>(paramClass, name);
     }
 
-    public <N extends Number> Expression<N> prod(Expression<? extends N> x,
-        Expression<? extends N> y) {
+    public <N extends Number> Expression<N> prod(Expression<? extends N> x, Expression<? extends N> y) {
         return new Expressions.Product<N>(x,y);
     }
 
-    public <N extends Number> Expression<N> prod(Expression<? extends N> x, 
-    	N y) {
+    public <N extends Number> Expression<N> prod(Expression<? extends N> x, N y) {
         return new Expressions.Product<N>(x,y);
     }
 
-    public <N extends Number> Expression<N> prod(N x, 
-        Expression<? extends N> y) {
+    public <N extends Number> Expression<N> prod(N x, Expression<? extends N> y) {
         return new Expressions.Product<N>(x,y);
     }
 
-    public Expression<Number> quot(Expression<? extends Number> x,
-        Expression<? extends Number> y) {
+    public Expression<Number> quot(Expression<? extends Number> x, Expression<? extends Number> y) {
         return new Expressions.Quotient<Number>(x,y);
     }
 
@@ -574,17 +536,21 @@
         return new Expressions.Quotient<Number>(x,y);
     }
 
-    public <Y> Selection<Y> select(Class<Y> result, 
-        Selection<?>... selections) {
-        return new SelectionImpl(result).setSelections(selections);
+    /**
+     * Define a select list item corresponding to a constructor.
+     * @param result  class whose instance is to be constructed
+     * @param selections  arguments to the constructor
+     * @return selection item
+     */
+    public <Y> Selection<Y> construct(Class<Y> result, Selection<?>... selections) {
+        return new NewInstanceSelection<Y>(result, selections);
     }
 
     public <R> Case<R> selectCase() {
         return new Expressions.Case();
     }
 
-    public <C, R> SimpleCase<C, R> selectCase(
-        Expression<? extends C> expression) {
+    public <C, R> SimpleCase<C, R> selectCase(Expression<? extends C> expression) {
         return new Expressions.SimpleCase(expression);
     }
 
@@ -592,8 +558,7 @@
         return new Expressions.Size(collection);
     }
 
-    public <C extends Collection<?>> Expression<Integer> size(
-        Expression<C> collection) {
+    public <C extends Collection<?>> Expression<Integer> size(Expression<C> collection) {
         return new Expressions.Size(collection);
     }
 
@@ -606,8 +571,7 @@
         return new Expressions.Sqrt(x);
     }
 
-    public Expression<String> substring(Expression<String> x,
-        Expression<Integer> from) {
+    public Expression<String> substring(Expression<String> x, Expression<Integer> from) {
     	return new Expressions.Substring(x, from);
     }
 
@@ -615,13 +579,11 @@
         return new Expressions.Substring(x, from);
     }
 
-    public Expression<String> substring(Expression<String> x,
-        Expression<Integer> from, Expression<Integer> len) {
+    public Expression<String> substring(Expression<String> x, Expression<Integer> from, Expression<Integer> len) {
         return new Expressions.Substring(x, from, len);
     }
 
-    public Expression<String> substring(Expression<String> x, int from, 
-        int len) {
+    public Expression<String> substring(Expression<String> x, int from, int len) {
         return new Expressions.Substring(x, from, len);
     }
 
@@ -629,28 +591,23 @@
         return new Expressions.Sum<N>(x);
     }
 
-    public <N extends Number> Expression<N> sum(Expression<? extends N> x,
-        Expression<? extends N> y) {
+    public <N extends Number> Expression<N> sum(Expression<? extends N> x, Expression<? extends N> y) {
         return new Expressions.Sum<N>(x,y);
     }
 
-    public <N extends Number> Expression<N> sum(Expression<? extends N> x, 
-        N y) {
+    public <N extends Number> Expression<N> sum(Expression<? extends N> x, N y) {
         return new Expressions.Sum<N>(x,y);
     }
 
-    public <N extends Number> Expression<N> sum(N x, 
-        Expression<? extends N> y) {
+    public <N extends Number> Expression<N> sum(N x, Expression<? extends N> y) {
         return new Expressions.Sum<N>(x,y);
     }
 
-    public Expression<BigDecimal> toBigDecimal(
-        Expression<? extends Number> number) {
+    public Expression<BigDecimal> toBigDecimal(Expression<? extends Number> number) {
         return new Expressions.Cast<BigDecimal>(number, BigDecimal.class);
     }
 
-    public Expression<BigInteger> toBigInteger(
-        Expression<? extends Number> number) {
+    public Expression<BigInteger> toBigInteger(Expression<? extends Number> number) {
         return new Expressions.Cast<BigInteger>(number, BigInteger.class);
     }
 
@@ -682,8 +639,7 @@
         return new Expressions.Trim(x, ts);
     }
 
-    public Expression<String> trim(Expression<Character> t, 
-        Expression<String> x) {
+    public Expression<String> trim(Expression<Character> t, Expression<String> x) {
         return new Expressions.Trim(x, t);
     }
 
@@ -691,8 +647,7 @@
         return new Expressions.Trim(x, t);
     }
 
-    public Expression<String> trim(Trimspec ts, Expression<Character> t,
-        Expression<String> x) {
+    public Expression<String> trim(Trimspec ts, Expression<Character> t, Expression<String> x) {
         return new Expressions.Trim(x, t, ts);
     }
 

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=789723&r1=789722&r2=789723&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 30 13:40:17 2009
@@ -87,16 +87,14 @@
                         Class<?> cls = join.getAttribute().getJavaType();
                         if (join.getAttribute().isAssociation()) {
                             ClassMetaData meta = metamodel.repos.getMetaData(cls, null, true);
-                            PersistenceType type = metamodel.getPersistenceType(meta);
+                            PersistenceType type = MetamodelImpl.getPersistenceType(meta);
                             if (type == PersistenceType.ENTITY || type == PersistenceType.EMBEDDABLE) 
                                 metas.add(meta);
                         }
                     }
                     if (root.getFetches() != null) {
                         for (Fetch<?,?> fetch : root.getFetches()) {
-                            metas.add(metamodel.repos.getMetaData(
-                            fetch.getAttribute().getJavaType(), 
-                            null, false));
+                            metas.add(metamodel.repos.getMetaData(fetch.getAttribute().getJavaType(), null, false));
                         }
                     }
                 }
@@ -140,12 +138,10 @@
         exps.grouping = new Value[groupByCount];
         for (int i = 0; i < groupByCount; i++) {
             Expression<?> groupBy = groups.get(i);    
-            exps.grouping[i] = Expressions.toValue(
-                    (ExpressionImpl<?>)groupBy, factory, model, q);;
+            exps.grouping[i] = Expressions.toValue((ExpressionImpl<?>)groupBy, factory, model, q);;
         }
 
-        exps.having = having == null ? factory.emptyExpression() 
-                : having.toKernelExpression(factory, model, q);
+        exps.having = having == null ? factory.emptyExpression() : having.toKernelExpression(factory, model, q);
     }
 
     protected void evalDistinct(QueryExpressions exps, ExpressionFactory factory, CriteriaQueryImpl<?> q) {
@@ -170,8 +166,7 @@
             for (Root<?> root : roots) {
                 if (root.getJoins() != null) {
                     for (Join<?, ?> join : root.getJoins()) {
-                        filter = and(factory, ((ExpressionImpl<?>)join)
-                                .toKernelExpression(factory, model, q), filter);
+                        filter = and(factory, ((ExpressionImpl<?>)join).toKernelExpression(factory, model, q), filter);
                     }
                 }
                 ((RootImpl<?>)root).addToContext(factory, model, q);
@@ -181,17 +176,17 @@
             List<Join<?,?>> corrJoins = subQuery.getCorrelatedJoins();
             if (corrJoins != null) {
                 for (int i = 0; i < corrJoins.size(); i++) 
-                    filter = and(factory, ((ExpressionImpl<?>)corrJoins.get(i))
-                            .toKernelExpression(factory, model, q), filter);
+                    filter = and(factory, ((ExpressionImpl<?>)corrJoins.get(i)).toKernelExpression(factory, model, q),  
+                            filter);
             }
         }
         
         if (where != null) {
-            filter = and(factory, where.toKernelExpression
-                    (factory, model, q), filter);
+            filter = and(factory, where.toKernelExpression(factory, model, q), filter);
         }
-        if (filter == null) 
+        if (filter == null) {
             filter = factory.emptyExpression();
+        }
         exps.filter = filter;
     }
 
@@ -207,27 +202,23 @@
         exps.projections = new Value[selections.size()];
         List<Value> projections = new ArrayList<Value>();
         List<String> aliases = new ArrayList<String>();
-        getProjections(exps, selections, projections, aliases, factory, q, 
-            model);
-        exps.projections = projections.toArray(new Value[0]);
-        exps.projectionAliases = aliases.toArray(new String[0]);
+        getProjections(exps, selections, projections, aliases, factory, q, model);
+        exps.projections = projections.toArray(new Value[projections.size()]);
+        exps.projectionAliases = aliases.toArray(new String[aliases.size()]);
     }
 
-    private void getProjections(QueryExpressions exps, 
-        List<Selection<?>> selections, List projections, List<String> aliases, 
+    private void getProjections(QueryExpressions exps, List<Selection<?>> selections, 
+        List<Value> projections, List<String> aliases, 
         ExpressionFactory factory, CriteriaQueryImpl<?> q, MetamodelImpl model) {
         for (Selection<?> s : selections) {
-            List<Selection<?>> sels = ((SelectionImpl)s).getSelections();
-            if (sels == null) {
-                projections.add(((ExpressionImpl<?>)s).
-                    toValue(factory, model, q));
-                aliases.add(q.getAlias(s));
-            } else {
-                // this is for constructor expression in the selection
+            if (s instanceof NewInstanceSelection<?>) {
                 exps.resultClass = s.getJavaType();
-                getProjections(exps, sels, projections, aliases, factory, q, 
-                    model);
-            }            
+                getProjections(exps, ((NewInstanceSelection)s).getConstructorArguments(), projections, aliases, 
+                        factory, q, model);               
+            } else {
+                projections.add(((ExpressionImpl<?>)s).toValue(factory, model, q));
+                aliases.add(q.getAlias(s));
+            }         
         }
     }
 
@@ -269,10 +260,8 @@
             exps.fetchPaths = oPaths.toArray(new String[oPaths.size()]);
     }
 
-    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) {
+    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) {
         return e1 == null ? e2 : e2 == null ? e1 : factory.and(e1, 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=789723&r1=789722&r2=789723&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 30 13:40:17 2009
@@ -71,6 +71,7 @@
     private List<Subquery<?>>   _subqueries;
     private Boolean             _distinct;
     private SubqueryImpl<?>     _delegator;
+    private final Class<T>      _resultClass;
     
     // AliasContext
     private int aliasCount = 0;
@@ -85,13 +86,15 @@
     // SubqueryContext
     //private Stack<Context> _contexts = null;
     
-    public CriteriaQueryImpl(MetamodelImpl model) {
+    public CriteriaQueryImpl(MetamodelImpl model, Class<T> resultClass) {
         this._model = model;
+        this._resultClass = resultClass;
         _aliases = new HashMap<Selection<?>, String>(); 
     }
     
-    public CriteriaQueryImpl(MetamodelImpl model, SubqueryImpl<?> delegator) {
+    public CriteriaQueryImpl(MetamodelImpl model, SubqueryImpl<T> delegator) {
         this._model = model;
+        this._resultClass = delegator.getJavaType();
         _delegator = delegator;
         _aliases = getAliases();
     }
@@ -112,7 +115,7 @@
     //    return _contexts;
     //}
     
-    public CriteriaQuery distinct(boolean distinct) {
+    public CriteriaQuery<T> distinct(boolean distinct) {
         _distinct = distinct;
         return this;
     }
@@ -171,7 +174,7 @@
      * @return the modified query
      */
     public CriteriaQuery<T> multiselect(Selection<?>... selections) {
-        throw new AbstractMethodError();
+        return select(selections);
     }
 
     /**
@@ -200,26 +203,26 @@
         return _selections;
     }
 
-    public CriteriaQuery groupBy(Expression<?>... grouping) {
+    public CriteriaQuery<T> groupBy(Expression<?>... grouping) {
     	_groups = new ArrayList<Expression<?>>();
     	for (Expression<?> e : grouping)
     		_groups.add(e);
         return this;
     }
 
-    public CriteriaQuery having(Expression<Boolean> restriction) {
+    public CriteriaQuery<T> having(Expression<Boolean> restriction) {
         _having = new PredicateImpl().add(restriction);
         return this;
     }
 
-    public CriteriaQuery having(Predicate... restrictions) {
+    public CriteriaQuery<T> having(Predicate... restrictions) {
         _having = new PredicateImpl();
         for (Predicate p : restrictions)
         	_having.add(p);
         return this;
     }
 
-    public CriteriaQuery orderBy(Order... o) {
+    public CriteriaQuery<T> orderBy(Order... o) {
         _orders = Arrays.asList(o);
         return this;
     }
@@ -232,7 +235,7 @@
      * @return the modified query
      */
     public CriteriaQuery<T> select(Selection<T> selection) {
-        throw new AbstractMethodError();
+        return select(new Selection<?>[]{selection});
     }
 
     public CriteriaQuery<T> select(Selection<?>... selections) {
@@ -348,18 +351,18 @@
     //    _contexts = contexts;
     //}
     
-    public CriteriaQueryImpl getInnermostParent() {
+    public CriteriaQueryImpl<?> getInnermostParent() {
         if (_delegator == null)
             return this;
-        AbstractQuery parent = _delegator.getParent();
+        AbstractQuery<?> parent = _delegator.getParent();
         if (parent instanceof CriteriaQueryImpl) 
-            return (CriteriaQueryImpl)parent;
+            return (CriteriaQueryImpl<?>)parent;
         // parent is a SubqueryImpl    
-        return ((SubqueryImpl)parent).getDelegate().getInnermostParent();
+        return ((SubqueryImpl<?>)parent).getDelegate().getInnermostParent();
     }
     
     public Map<Selection<?>,String> getAliases() {
-        CriteriaQueryImpl c = getInnermostParent();
+        CriteriaQueryImpl<?> c = getInnermostParent();
         if (c._aliases == null)
             c._aliases = new HashMap<Selection<?>, String>();
         return c._aliases;

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/ExpressionImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/ExpressionImpl.java?rev=789723&r1=789722&r2=789723&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/ExpressionImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/ExpressionImpl.java Tue Jun 30 13:40:17 2009
@@ -27,6 +27,7 @@
 
 import org.apache.openjpa.kernel.exps.ExpressionFactory;
 import org.apache.openjpa.kernel.exps.Value;
+import org.apache.openjpa.persistence.ResultItemImpl;
 import org.apache.openjpa.persistence.meta.MetamodelImpl;
 
 /**
@@ -36,13 +37,14 @@
  *
  * @param <X> the type of the value this expression represents.
  */
-public class ExpressionImpl<X> extends SelectionImpl<X> 
+public abstract class ExpressionImpl<X> extends ResultItemImpl<X> 
     implements Expression<X> {
 
-    Value toValue(ExpressionFactory factory, MetamodelImpl model,
-        CriteriaQueryImpl<?> q) {
-        throw new AbstractMethodError(this.getClass().getName());
-    }
+    abstract Value toValue(ExpressionFactory factory, MetamodelImpl model,
+        CriteriaQueryImpl<?> q);
+//    {
+//        throw new AbstractMethodError(this.getClass().getName());
+//    }
     
     org.apache.openjpa.kernel.exps.Expression toKernelExpression(
         ExpressionFactory factory, MetamodelImpl model,
@@ -65,7 +67,7 @@
      * @return expression
      */
     public <Y> Expression<Y> as(Class<Y> type) {
-       throw new AbstractMethodError();
+       return new Expressions.CastAs<Y>(type, this);
     }
 
     /**

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=789723&r1=789722&r2=789723&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 30 13:40:17 2009
@@ -62,7 +62,7 @@
      *
      * @param <X> the type of the resultant expression
      */
-    public static class UnaryFunctionalExpression<X> 
+    public abstract static class UnaryFunctionalExpression<X> 
         extends ExpressionImpl<X> {
         protected ExpressionImpl<?> e;
         
@@ -83,7 +83,7 @@
      *
      * @param <X> the type of the resultant expression
      */
-    public static class BinarayFunctionalExpression<X> 
+    public abstract static class BinarayFunctionalExpression<X> 
         extends ExpressionImpl<X>{
         protected ExpressionImpl<?> e1;
         protected ExpressionImpl<?> e2;
@@ -241,6 +241,7 @@
             return factory.cast(Expressions.toValue(e, factory, model, q), b);
         }
     }
+    
     public static class Concat extends BinarayFunctionalExpression<String> {
         public Concat(Expression<String> x, Expression<String> y) {
             super(String.class, x, y);
@@ -758,6 +759,29 @@
         }
     }
     
+    public static class IsNotEmpty extends PredicateImpl {
+        ExpressionImpl<?> collection;
+        public IsNotEmpty(Expression<?> collection) {
+            super();
+            this.collection = (ExpressionImpl<?>)collection;
+        }
+        
+        @Override
+        public PredicateImpl clone() {
+            return new IsNotEmpty(collection);
+        }
+        
+        @Override
+        public org.apache.openjpa.kernel.exps.Expression toKernelExpression(
+            ExpressionFactory factory, MetamodelImpl model, 
+            CriteriaQueryImpl<?> q) {
+            Value val = Expressions.toValue(collection, factory, model, q);
+            return (isNegated()) 
+                ? factory.isEmpty(val) : factory.isNotEmpty(val);
+        }
+    }
+
+    
     public static class Index extends UnaryFunctionalExpression<Integer> {
         public Index(Joins.List<?,?> e) {
             super(Integer.class, e);
@@ -1262,5 +1286,21 @@
             return factory.not(super.toKernelExpression(factory, model, q));
         }        
     }
+    
+    public static class CastAs<Y> extends ExpressionImpl<Y> {
+        protected final ExpressionImpl<?> actual;
+        public CastAs(Class<Y> cast, ExpressionImpl<?> actual) {
+            super(cast);
+            this.actual = actual;
+        }
+        
+        @Override
+        public org.apache.openjpa.kernel.exps.Value toValue(
+          ExpressionFactory factory, MetamodelImpl model, CriteriaQueryImpl<?> q) {
+            org.apache.openjpa.kernel.exps.Value e = actual.toValue(factory, model, q);
+            e.setImplicitType(getJavaType());
+            return e;
+        }        
+    }
 
 }

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/FetchPathImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/FetchPathImpl.java?rev=789723&r1=789722&r2=789723&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/FetchPathImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/FetchPathImpl.java Tue Jun 30 13:40:17 2009
@@ -47,8 +47,7 @@
         this(parent, member, JoinType.INNER);
     }
     
-    FetchPathImpl(FetchParent<?,Z> parent, Members.Member<? super Z,X> member, 
-        JoinType type) {
+    FetchPathImpl(FetchParent<?,Z> parent, Members.Member<? super Z,X> member, JoinType type) {
         super((PathImpl<?,Z>)parent, member, member.getJavaType());
         this.joinType = type;
     }

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=789723&r1=789722&r2=789723&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 30 13:40:17 2009
@@ -38,6 +38,7 @@
 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.persistence.meta.Members;
 import org.apache.openjpa.persistence.meta.MetamodelImpl;
 import org.apache.openjpa.persistence.meta.Members.Member;
@@ -56,7 +57,7 @@
      * @param <Z> type from which joining
      * @param <X> type of the attribute being joined
      */
-    public static class SingularJoin<Z,X> extends FromImpl<Z,X> implements Join<Z,X>{
+    public static class SingularJoin<Z,X> extends FromImpl<Z,X> implements Join<Z,X> {
         private final JoinType joinType;
         private boolean allowNull = false;
         
@@ -448,11 +449,7 @@
             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();
-                
-            Value var = factory.newBoundVariable(c.getAlias(this), meta.getDescribedType());
+            Value var = factory.newBoundVariable(c.getAlias(this), _member.fmd.getElement().getDeclaredType());
             org.apache.openjpa.kernel.exps.Expression join = factory.bindValueVariable(var, path);
             c.registerVariable(this, var, path);
             return join;

Added: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/NewInstanceSelection.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/NewInstanceSelection.java?rev=789723&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/NewInstanceSelection.java (added)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/NewInstanceSelection.java Tue Jun 30 13:40:17 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;
+
+import java.util.Arrays;
+import java.util.List;
+
+import javax.persistence.criteria.Selection;
+
+import org.apache.openjpa.persistence.ResultItemImpl;
+
+/**
+ * A selection item that constructs new instance of a user-defined class with arguments specified as other selected 
+ * items. 
+ * 
+ * @author Pinaki Poddar
+ *
+ * @param <X>
+ */
+public class NewInstanceSelection<X> extends ResultItemImpl<X> 
+    implements Selection<X> {
+    
+    private List<Selection<?>>  _args;
+    
+    public NewInstanceSelection(Class<X> cls, Selection<?>... selections) {
+        super(cls);
+        _args = Arrays.asList(selections);
+    }
+    
+    public List<Selection<?>> getConstructorArguments() {
+        return _args;
+    }
+}

Propchange: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/NewInstanceSelection.java
------------------------------------------------------------------------------
    svn:eol-style = native

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=789723&r1=789722&r2=789723&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 30 13:40:17 2009
@@ -36,7 +36,7 @@
  * 
  * @param <T> the type of value held by this parameter.
  */
-public class ParameterImpl<T> extends ExpressionImpl<T> implements ParameterExpression<T>{
+public class ParameterImpl<T> extends ExpressionImpl<T> implements ParameterExpression<T> {
 	private String name;
 	private Integer position;
 	
@@ -58,11 +58,9 @@
     }
 	
     @Override
-    public Value toValue(ExpressionFactory factory, MetamodelImpl model,
-        CriteriaQueryImpl<?> q) {
+    public Value toValue(ExpressionFactory factory, MetamodelImpl model,  CriteriaQueryImpl<?> q) {
         q.registerParameter(this);
         
-
         ClassMetaData meta = null;
         Class<?> clzz = getJavaType();
         Object paramKey = getKey();

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=789723&r1=789722&r2=789723&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 30 13:40:17 2009
@@ -29,6 +29,7 @@
 import javax.persistence.metamodel.PluralAttribute;
 import javax.persistence.metamodel.SingularAttribute;
 import javax.persistence.metamodel.Type;
+import javax.persistence.metamodel.Type.PersistenceType;
 
 import org.apache.openjpa.kernel.exps.ExpressionFactory;
 import org.apache.openjpa.kernel.exps.Value;
@@ -43,8 +44,9 @@
  * @param <X>  Type referenced by the path
  */
 /**
- * Path is an expression often representing a persistent member traversed
- * from another (parent) path.
+ * Path is an expression often representing a persistent attribute traversed from another (parent) path.
+ * The type of the path is the type of the persistent attribute.
+ * If the persistent attribute is bindable, then further path can be travesered from this path. 
  * 
  * @author Pinaki Poddar
  * @author Fay Wang
@@ -59,8 +61,7 @@
     protected PathImpl<?,?> _correlatedPath;
     
     /**
-     * Protected. use by root path which neither represent a member nor has a
-     * parent. 
+     * Protected constructor use by root path which neither represent a member nor has a parent. 
      */
     protected PathImpl(Class<X> cls) {
         super(cls);
@@ -69,12 +70,10 @@
     }
     
     /**
-     * Create a path from the given non-null parent representing the the given 
-     * non-null member. The given class denotes the type expressed by this
-     * path.
+     * Create a path from the given non-null parent representing the given non-null member. The given class denotes 
+     * the type expressed by this path.
      */
-    public PathImpl(PathImpl<?,Z> parent, Members.Member<? super Z, ?> member, 
-        Class<X> cls) {
+    public PathImpl(PathImpl<?,Z> parent, Members.Member<? super Z, ?> member, Class<X> cls) {
         super(cls);
         _parent = parent;
         if (_parent.isEmbedded) {
@@ -91,6 +90,9 @@
      *  
      */
     public Bindable<X> getModel() { 
+        if (_member instanceof Bindable<?> == false) {
+            throw new IllegalArgumentException(this + " represents a basic path and not a bindable");
+        }
         return (Bindable<X>)_member;
     }
     
@@ -101,6 +103,9 @@
         return _parent;
     }
     
+    /**
+     * Gets the path that originates this traversal. Can be itself if this itself is the origin.
+     */
     public PathImpl<?,?> getInnermostParentPath() {
         return (_parent == null) ? this : _parent.getInnermostParentPath();
     }
@@ -115,13 +120,13 @@
     }
     
     protected Members.Member<?,?> getInnermostMember(PathImpl<?,?> parent, Members.Member<?,?> member) {
-        return member != null ? member : getInnermostMember(parent._parent,
-            parent._member); 
+        return member != null ? member : getInnermostMember(parent._parent,  parent._member); 
     }
     
     public void setCorrelatedPath(PathImpl<?,?> correlatedPath) {
         _correlatedPath = correlatedPath;
     }
+    
     public PathImpl<?,?> getCorrelatedPath() {
         return _correlatedPath;
     }
@@ -130,8 +135,7 @@
      * Convert this path to a kernel path.
      */
     @Override
-    public Value toValue(
-        ExpressionFactory factory, MetamodelImpl model,  CriteriaQueryImpl<?> q) {
+    public Value toValue(ExpressionFactory factory, MetamodelImpl model,  CriteriaQueryImpl<?> q) {
         if (q.isRegistered(this))
             return q.getValue(this);
         org.apache.openjpa.kernel.exps.Path path = null;
@@ -151,8 +155,7 @@
             //path.setSchemaAlias(q.getAlias(_parent));
             traversePath(_parent, path, _member.fmd);
         } else if (_parent != null) {
-            path = (org.apache.openjpa.kernel.exps.Path)
-            _parent.toValue(factory, model, q);
+            path = (org.apache.openjpa.kernel.exps.Path)_parent.toValue(factory, model, q);
             path.get(_member.fmd, allowNull);
         } else if (_parent == null) {
             path = factory.newPath();
@@ -206,48 +209,41 @@
     }
     
     /**
-     *  Return the path corresponding to the referenced 
-     *  single-valued attribute.
-     *  @param atttribute single-valued attribute
-     *  @return path corresponding to the referenced attribute
-     */
-    /**
-     * Create a new path with this path as parent.
+     *  Gets a new path that represents the given single-valued attribute from this path.
      */
     public <Y> Path<Y> get(SingularAttribute<? super X, Y> attr) {
-        return new PathImpl<X,Y>(this, (Members.SingularAttributeImpl<? super X, Y>)attr, 
-            attr.getJavaType());
+        return new PathImpl<X,Y>(this, (Members.SingularAttributeImpl<? super X, Y>)attr, attr.getJavaType());
     }
     
     /**
-     *  Return the path corresponding to the referenced 
-     *  collection-valued attribute.
-     *  @param collection collection-valued attribute
-     *  @return expression corresponding to the referenced attribute
+     *  Gets a new path that represents the given multi-valued attribute from this path.
      */
     public <E, C extends java.util.Collection<E>> Expression<C>  get(PluralAttribute<X, C, E> coll) {
-        return new PathImpl<X,C>(this, (Members.Member<? super X, C>)coll, coll.getJavaType());
+        return new PathImpl<X,C>(this, (Members.PluralAttributeImpl<? super X, C, E>)coll, coll.getJavaType());
     }
 
     /**
-     *  Return the path corresponding to the referenced 
-     *  map-valued attribute.
-     *  @param map map-valued attribute
-     *  @return expression corresponding to the referenced attribute
+     *  Gets a new path that represents the given map-valued attribute from this path.
      */
     public <K, V, M extends java.util.Map<K, V>> Expression<M> get(MapAttribute<X, K, V> map) {
         return new PathImpl<X,M>(this, (Members.MapAttributeImpl<? super X,K,V>)map, (Class<M>)map.getJavaType());
     }
     
+    /**
+     * Gets a new path that represents the attribute of the given name from this path.
+     * 
+     * @exception IllegalArgumentException if this path represents a basic attribute that is can not be traversed 
+     * further.
+     */
     public <Y> Path<Y> get(String attName) {
-        Members.Member<? super X, Y> next = null;
         Type<?> type = _member.getType();
-        switch (type.getPersistenceType()) {
-        case BASIC:
-            throw new RuntimeException(attName + " not navigable from " + this);
-            default: next = (Members.Member<? super X, Y>) ((ManagedType<?>)type).getAttribute(attName);
+        if (type.getPersistenceType() == PersistenceType.BASIC) {
+            throw new IllegalArgumentException(this + " is a basic path and can not be navigated to " + attName);
         }
-        return new PathImpl<X,Y>(this, next, (Class<Y>)type.getClass());
+        
+        Members.Member<? super X, Y> next = (Members.Member<? super X, Y>) 
+           ((ManagedType<? super X>)type).getAttribute(attName);
+        return new PathImpl<X,Y>(this, next, next.getJavaType());
     }
     
     /**
@@ -255,5 +251,5 @@
      */
     public Expression<Class<? extends X>> type() {
         return new Expressions.Type<X>(this);
-    }   
+}
 }

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PredicateImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PredicateImpl.java?rev=789723&r1=789722&r2=789723&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PredicateImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PredicateImpl.java Tue Jun 30 13:40:17 2009
@@ -27,10 +27,9 @@
 import org.apache.openjpa.kernel.exps.ExpressionFactory;
 import org.apache.openjpa.persistence.meta.MetamodelImpl;
 
-public class PredicateImpl extends ExpressionImpl<Boolean> 
-implements Predicate {
+public class PredicateImpl extends ExpressionImpl<Boolean> implements Predicate {
     List<Expression<Boolean>> _exps;
-    BooleanOperator _op;
+    BooleanOperator _op = BooleanOperator.AND;
     boolean _negated = false;
 
     protected PredicateImpl() {
@@ -81,33 +80,36 @@
             clone._exps = new ArrayList<Expression<Boolean>>(this._exps);
         return clone;
     }
-
+    
     @Override
-    org.apache.openjpa.kernel.exps.Expression toKernelExpression(
-        ExpressionFactory factory, MetamodelImpl model, 
+    org.apache.openjpa.kernel.exps.Value toValue(ExpressionFactory factory, MetamodelImpl model, 
+        CriteriaQueryImpl<?> q) {
+        throw new AbstractMethodError();
+    }
+    
+    @Override
+    org.apache.openjpa.kernel.exps.Expression toKernelExpression(ExpressionFactory factory, MetamodelImpl model, 
         CriteriaQueryImpl<?> q) {
         if (_exps == null || _exps.isEmpty())
             return factory.emptyExpression();
+        
         if (_exps.size() == 1)
-            return ((ExpressionImpl<?>)_exps.get(0))
-            .toKernelExpression(factory, model, q);
+            return ((ExpressionImpl<?>)_exps.get(0)).toKernelExpression(factory, model, q);
+        
         ExpressionImpl<?> e1 = (ExpressionImpl<?>)_exps.get(0);
         ExpressionImpl<?> e2 = (ExpressionImpl<?>)_exps.get(1);
-        org.apache.openjpa.kernel.exps.Expression ke1 = 
-            e1.toKernelExpression(factory, model, q);
-        org.apache.openjpa.kernel.exps.Expression ke2 = 
-            e2.toKernelExpression(factory, model, q);
-        org.apache.openjpa.kernel.exps.Expression result = 
-            _op == BooleanOperator.AND 
+        org.apache.openjpa.kernel.exps.Expression ke1 = e1.toKernelExpression(factory, model, q);
+        org.apache.openjpa.kernel.exps.Expression ke2 = e2.toKernelExpression(factory, model, q);
+        org.apache.openjpa.kernel.exps.Expression result = _op == BooleanOperator.AND 
             ? factory.and(ke1,ke2) : factory.or(ke1, ke2);
 
-            for (int i = 2; i < _exps.size(); i++) {
-                ExpressionImpl<?> e = (ExpressionImpl<?>)_exps.get(i);
-                result = _op == BooleanOperator.AND 
-                ? factory.and(result, e.toKernelExpression(factory, model, q))
-                : factory.or(result, e.toKernelExpression(factory,model,q));
-            }
-            return _negated ? factory.not(result) : result;
+        for (int i = 2; i < _exps.size(); i++) {
+            ExpressionImpl<?> e = (ExpressionImpl<?>)_exps.get(i);
+            result = _op == BooleanOperator.AND 
+            ? factory.and(result, e.toKernelExpression(factory, model, q))
+            : factory.or(result, e.toKernelExpression(factory,model,q));
+        }
+        return _negated ? factory.not(result) : result;
     }
 
     public static class And extends PredicateImpl {

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SelectionImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SelectionImpl.java?rev=789723&r1=789722&r2=789723&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SelectionImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SelectionImpl.java Tue Jun 30 13:40:17 2009
@@ -41,12 +41,12 @@
         super(cls);
     }
     
-    public SelectionImpl<X> setSelections(Selection<?>... selections) {
-        _sels = Arrays.asList(selections);
-        return this;
-    }
-    
-    public List<Selection<?>> getSelections() {
-        return _sels;
-    }
+//    public SelectionImpl<X> setSelections(Selection<?>... selections) {
+//        _sels = Arrays.asList(selections);
+//        return this;
+//    }
+//    
+//    public List<Selection<?>> getSelections() {
+//        return _sels;
+//    }
 }

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=789723&r1=789722&r2=789723&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 30 13:40:17 2009
@@ -41,7 +41,6 @@
 import org.apache.openjpa.kernel.exps.Value;
 import org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder;
 import org.apache.openjpa.meta.ClassMetaData;
-import org.apache.openjpa.meta.FieldMetaData;
 import org.apache.openjpa.meta.JavaTypes;
 import org.apache.openjpa.persistence.meta.AbstractManagedType;
 import org.apache.openjpa.persistence.meta.Members;

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AbstractManagedType.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AbstractManagedType.java?rev=789723&r1=789722&r2=789723&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AbstractManagedType.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AbstractManagedType.java Tue Jun 30 13:40:17 2009
@@ -38,6 +38,7 @@
 import javax.persistence.metamodel.SingularAttribute;
 import javax.persistence.metamodel.PluralAttribute.CollectionType;
 
+import org.apache.openjpa.kernel.Filters;
 import org.apache.openjpa.lib.util.Localizer;
 import org.apache.openjpa.meta.ClassMetaData;
 import org.apache.openjpa.meta.FieldMetaData;
@@ -850,8 +851,7 @@
      * Selects if the attribute type matches the given Java class.
      * null matches any type.
      */
-    public static final class AttributeTypeFilter<X, Y> implements
-            Filter<Attribute<? super X, ?>> {
+    public static final class AttributeTypeFilter<X, Y> implements Filter<Attribute<? super X, ?>> {
         private final Class<Y> _type;
         private final boolean _invert;
 
@@ -865,13 +865,13 @@
         }
 
         public boolean selects(Attribute<? super X, ?> attr) {
-            boolean result = _type == null || attr.getJavaType() == _type;
+            boolean result = _type == null || Filters.canConvert(attr.getJavaType(), _type, false);
             return _invert ? !result : result;
         }
 
         public AttributeTypeFilter<X, Y> inverse() {
             return new AttributeTypeFilter<X, Y>(_type, !_invert);
-        }
+        }        
     }
 
     public static final class AttributeNameFilter<X> implements

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AnnotationProcessor6.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AnnotationProcessor6.java?rev=789723&r1=789722&r2=789723&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AnnotationProcessor6.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AnnotationProcessor6.java Tue Jun 30 13:40:17 2009
@@ -98,8 +98,7 @@
     private int generatedSourceVersion = 6;
     private CompileTimeLogger logger;
     private boolean addHeader = false;
-    private static Localizer _loc =
-        Localizer.forPackage(AnnotationProcessor6.class);
+    private static Localizer _loc =  Localizer.forPackage(AnnotationProcessor6.class);
 
     /**
      * Category of members as per JPA 2.0 type system.
@@ -181,13 +180,12 @@
         setSourceVersion();
         setFileManager();
         setNamingPolicy();
-        addHeader = "true".equalsIgnoreCase(processingEnv.getOptions()
-                .get("header"));
+        addHeader = "true".equalsIgnoreCase(processingEnv.getOptions().get("header"));
         handler = new SourceAnnotationHandler(processingEnv, logger);
     }
     
     /**
-     * The entry point for javac compiler.
+     * The entry point for java compiler.
      */
     @Override
     public boolean process(Set<? extends TypeElement> annos,

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/SourceAnnotationHandler.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/SourceAnnotationHandler.java?rev=789723&r1=789722&r2=789723&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/SourceAnnotationHandler.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/SourceAnnotationHandler.java Tue Jun 30 13:40:17 2009
@@ -370,9 +370,10 @@
      */
     static class TransientFilter implements InclusiveFilter<Element> {
         public boolean includes(Element obj) {
+            Set<Modifier> modifiers = obj.getModifiers();
             boolean isTransient = isAnnotatedWith(obj, Transient.class)
-                            || obj.getModifiers().contains(Modifier.TRANSIENT);
-            return !isTransient;
+                            || modifiers.contains(Modifier.TRANSIENT);
+           return !isTransient && !modifiers.contains(Modifier.STATIC);
         }
     }