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 [1/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...

Author: ppoddar
Date: Tue Jun 30 13:40:17 2009
New Revision: 789723

URL: http://svn.apache.org/viewvc?rev=789723&view=rev
Log:
OPENJPA-1143: Added support for construct(), as(). Metamodel excludes static fields. tests edited to compile against EA3 JPA API.

Added:
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/NewInstanceSelection.java   (with props)
Modified:
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CriteriaTest.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Magazine_.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Publisher_.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestJoinCondition.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestMetaModelTypesafeCriteria.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestSubqueries.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypeSafeCondExpression.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypesafeCriteria.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/ImplicitFieldAccessMappedSuperclass_.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/TestMetamodel.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/ResultItemImpl.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaBuilder.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaExpressionBuilder.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/ExpressionImpl.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/FetchPathImpl.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Joins.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/ParameterImpl.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PathImpl.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PredicateImpl.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SelectionImpl.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SubqueryImpl.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AbstractManagedType.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AnnotationProcessor6.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/SourceAnnotationHandler.java

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CriteriaTest.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CriteriaTest.java?rev=789723&r1=789722&r2=789723&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CriteriaTest.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CriteriaTest.java Tue Jun 30 13:40:17 2009
@@ -18,8 +18,11 @@
  */
 package org.apache.openjpa.persistence.criteria;
 
+import java.io.PrintWriter;
+import java.io.StringWriter;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -53,46 +56,48 @@
  */
 public abstract class CriteriaTest extends TestCase {
     protected static OpenJPAEntityManagerFactorySPI emf;
+    protected static SQLAuditor auditor;
+    
     QueryBuilder cb;
     EntityManager em;
-    protected List<String> sql = new ArrayList<String>();
+    
     protected static Class[] CLASSES = {
-    Account.class,
-    Address.class,
-    A.class,
-    B.class,
-    CompUser.class,
-    Contact.class,
-    Contractor.class,
-    Course.class,
-    CreditCard.class,
-    Customer.class,
-    C.class,
-    Department.class,
-    DependentId.class,
-    Dependent.class,
-    D.class,
-    Employee.class,
-    Exempt.class,
-    FemaleUser.class,
-    FrequentFlierPlan.class,
-    Item.class,
-    LineItem.class,
-    Magazine.class,
-    MaleUser.class,
-    Manager.class,
-    Movie.class,
-    Order.class,
-    Person.class,
-    Phone.class,
-    Photo.class,
-    Product.class,
-    Publisher.class,
-    Semester.class,
-    Student.class,
-    TransactionHistory.class,
-    Transaction.class,
-    VideoStore.class};
+            Account.class,
+            Address.class,
+            A.class,
+            B.class,
+            CompUser.class,
+            Contact.class,
+            Contractor.class,
+            Course.class,
+            CreditCard.class,
+            Customer.class,
+            C.class,
+            Department.class,
+            DependentId.class,
+            Dependent.class,
+            D.class,
+            Employee.class,
+            Exempt.class,
+            FemaleUser.class,
+            FrequentFlierPlan.class,
+            Item.class,
+            LineItem.class,
+            Magazine.class,
+            MaleUser.class,
+            Manager.class,
+            Movie.class,
+            Order.class,
+            Person.class,
+            Phone.class,
+            Photo.class,
+            Product.class,
+            Publisher.class,
+            Semester.class,
+            Student.class,
+            TransactionHistory.class,
+            Transaction.class,
+            VideoStore.class};
     
     protected Class[] getDomainClasses() {
         return CLASSES;
@@ -100,6 +105,7 @@
     
     public void setUp() {
         if (emf == null) {
+            auditor = new SQLAuditor();
             createNamedEMF(getDomainClasses());
             assertNotNull(emf);
             setDictionary();
@@ -107,6 +113,7 @@
         em = emf.createEntityManager();
         cb = emf.getQueryBuilder();
     }
+    
     /**
      * Create an entity manager factory for persistence unit <code>pu</code>.
      * Put {@link #CLEAR_TABLES} in
@@ -120,13 +127,12 @@
         Map<Object,Object> map = new HashMap<Object,Object>();
         map.put("openjpa.jdbc.SynchronizeMappings",
                 "buildSchema(ForeignKeys=true," 
-              + "SchemaAction='add,deleteTableContents')");
+              + "SchemaAction='add')");
         map.put("openjpa.jdbc.QuerySQLCache", "false");
         map.put("openjpa.DynamicEnhancementAgent", "false");
         map.put("openjpa.RuntimeUnenhancedClasses", "unsupported");
         map.put("openjpa.Compatibility", "QuotedNumbersInQueries=true");
-        map.put("openjpa.jdbc.JDBCListeners", 
-                new JDBCListener[] { new Listener() });
+        map.put("openjpa.jdbc.JDBCListeners", new JDBCListener[] { auditor });
         
             StringBuffer buf = new StringBuffer();
             for (Class<?> c : types) {
@@ -135,17 +141,11 @@
                 buf.append(c.getName());
             }
            
-            map.put("openjpa.MetaDataFactory",
-                "jpa(Types=" + buf.toString() + ")");
+            map.put("openjpa.MetaDataFactory", "jpa(Types=" + buf.toString() + ")");
         
-            Map config = new HashMap(System.getProperties());
+            Map<Object,Object> config = new HashMap<Object,Object>(System.getProperties());
             config.putAll(map);
-            emf = (OpenJPAEntityManagerFactorySPI) 
-                Persistence.createEntityManagerFactory("test", config);
-    }
-
-    public final void tearDown() {
-        // important: do nothing
+            emf = (OpenJPAEntityManagerFactorySPI) Persistence.createEntityManagerFactory("test", config);
     }
 
     void setDictionary() {
@@ -156,57 +156,36 @@
     }
 
     /**
-     * Executes the given CriteriaQuery and JPQL string and compare their
-     * respective SQLs for equality.
+     * Executes the given CriteriaQuery and JPQL string and compare their respective SQLs for equality.
      */
-    void assertEquivalence(CriteriaQuery c, String jpql, String[] paramNames,
-            Object[] params) {
+    void assertEquivalence(CriteriaQuery<?> c, String jpql) {
+        assertEquivalence(c, jpql, null);
+    }
+    
+    /**
+     * Executes the given CriteriaQuery and JPQL string and compare their respective SQLs for equality.
+     * Sets the supplied parameters, if any.
+     */
+    void assertEquivalence(CriteriaQuery<?> c, String jpql, String[] paramNames,  Object[] params) {
         Query cQ = em.createQuery(c);
-        for (int i = 0; i < paramNames.length; i++) {
-            cQ.setParameter(paramNames[i], params[i]);
-        }
         Query jQ = em.createQuery(jpql);
-        for (int i = 0; i < paramNames.length; i++) {
-            jQ.setParameter(paramNames[i], params[i]);
-        }
-        executeAndAssert(cQ, jQ);
+        setParameters(cQ, paramNames, params);
+        setParameters(jQ, paramNames, params);
+        
+        executeAndCompareSQL(jpql, cQ, jQ);
     }
 
     /**
-     * Executes the given CriteriaQuery and JPQL string and compare their
-     * respective SQLs for equality.
+     * Executes the given CriteriaQuery and JPQL string and compare their respective SQLs for equality.
      */
 
-    void assertEquivalence(CriteriaQuery c, String jpql, Object[] params) {
+    void assertEquivalence(CriteriaQuery<?> c, String jpql, Object[] params) {
         Query cQ = em.createQuery(c);
-        for (int i = 0; i < params.length; i++) {
-            cQ.setParameter(i + 1, params[i]);
-        }
-        
         Query jQ = em.createQuery(jpql);
-        for (int i = 0; i < params.length; i++) {
-            jQ.setParameter(i + 1, params[i]);
-        }
+        setParameters(cQ, params);
+        setParameters(jQ, params);
         
-        executeAndAssert(cQ, jQ);
-    }
-
-    void assertEquivalence(CriteriaQuery c, String jpql) {
-        executeAndAssert(em.createQuery(c), em.createQuery(jpql));
-    }
-
-    void executeAndAssert(Query cQ, Query jQ) {
-        List<String>[] sqls = new ArrayList[2];
-        String jpql = OpenJPAPersistence.cast(jQ).getQueryString();
-        if (!execute(jpql, cQ, jQ, sqls)) {
-            fail(sqlReport("Invalid SQL for Criteria",jpql, sqls[0], sqls[1]));
-        }
-        assertEquals(sqlReport("Unequal number of SQL ",jpql, sqls[0], sqls[1]) 
-              , sqls[0].size(), sqls[1].size());
-        for (int i = 0; i < sqls[0].size(); i++)
-            //sqlReport("Wrong SQL at " + i,jpql, sqls[0], sqls[1]),
-           assertEquals(
-                sqls[0].get(i), sqls[1].get(i));
+        executeAndCompareSQL(jpql, cQ, jQ);
     }
 
     /**
@@ -218,71 +197,82 @@
      *            array.
      * @return true if both queries execute successfully.
      */
-    boolean execute(String jpql, Query cQ, Query jQ, List<String>[] sqls) {
-        sql.clear();
+    void executeAndCompareSQL(String jpql, Query cQ, Query jQ) {
+        List<String> jSQL = null;
+        List<String> cSQL = null;
         try {
-            List jList = jQ.getResultList();
-        } catch (PersistenceException e) {
-            e.printStackTrace();
-            sqls[0] = new ArrayList<String>();
-            sqls[0].add(extractSQL(e));
-            fail("Wrong SQL for JPQL :" + jpql + "\r\nSQL  :" + sqls[0]);
+            jSQL = executeQueryAndCollectSQL(jQ);
         } catch (Exception e) {
-            e.printStackTrace();
-            fail("Wrong JPQL :" + jpql);
+            StringWriter w = new StringWriter();
+            e.printStackTrace(new PrintWriter(w));
+            fail("JPQL " + jpql + " failed to execute\r\n" + w);
         }
         
-        sqls[0] = new ArrayList<String>(sql);
-
-        sql.clear();
         try {
-            List cList = cQ.getResultList();
-        } catch (PersistenceException e) {
-            e.printStackTrace();
-            sqls[1] = new ArrayList<String>();
-            sqls[1].add(extractSQL(e));
-            return false;
-        }
-        sqls[1] = new ArrayList<String>(sql);
-
-        return true;
-    }
-    
-    List<String> executeJPQL(String jpql, Map<?,Object> params) {
-        sql.clear();
-        Query q  = em.createQuery(jpql);
-        if (params != null) {
-            for (Object key : params.keySet()) {
-                if (key instanceof String)
-                    q.setParameter(key.toString(), params.get(key));
-                else if (key instanceof String)
-                    q.setParameter(key.toString(), params.get(key));
-                else
-                    throw new RuntimeException("Bad Parameter key " + key);
-            }
+            cSQL = executeQueryAndCollectSQL(cQ);
+        } catch (Exception e) {
+            StringWriter w = new StringWriter();
+            e.printStackTrace(new PrintWriter(w));
+            fail("CriteriaQuery corresponding to " + jpql + " failed to execute\r\n" + w);
         }
         
-        return sql;
+        printSQL("Target SQL for JPQL", jSQL);
+        printSQL("Target SQL for CriteriaQuery", cSQL);
+        if (jSQL.size() != cSQL.size()) {
+            printSQL("Target SQL for JPQL", jSQL);
+            printSQL("Target SQL for CriteriaQuery", cSQL);
+            assertEquals("No. of SQL generated for JPQL and CriteriaQuery for " + jpql + " is different", 
+                 jSQL.size(), cSQL.size());
+        }
+        
+        for (int i = 0; i < jSQL.size(); i++) {
+            if (!jSQL.get(i).equals(cSQL.get(i))) {
+                printSQL("Target SQL for JPQL", jSQL);
+                printSQL("Target SQL for CriteriaQuery", cSQL);
+                assertEquals(i + "-th SQL for JPQL and CriteriaQuery for " + jpql + " is different",
+                     jSQL.get(i), cSQL.get(i));
+            }
+        }
+    }
+    
+    void printSQL(String header, List<String> sqls) {
+        System.err.println(header);
+        for (int i = 0; sqls != null && i < sqls.size(); i++) {
+            System.err.println(i + ":" + sqls.get(i));
+        }
+    }
+    
+    void setParameters(Query q, String[] paramNames, Object[] params) {
+        for (int i = 0; paramNames != null && i < paramNames.length; i++)
+            q.setParameter(paramNames[i], params[i]);
+    }
+    
+    void setParameters(Query q, Object[] params) {
+        for (int i = 0; params != null && i < params.length; i++)
+            q.setParameter(i+1, params[i]);
+    }
+    
+    /**
+     * Execute the given query and return the generated SQL.
+     * If the query execution fail because the generated SQL is ill-formed, then raised exception should
+     * carry the ill-formed SQL for diagnosis.  
+     */
+    List<String> executeQueryAndCollectSQL(Query q) {
+        auditor.clear();
+        try {
+            List<?> result = q.getResultList();
+        } catch (Exception e) {
+            throw new RuntimeException(extractSQL(e), e);
+        }    
+        assertFalse(auditor.getSQLs().isEmpty());
+        return auditor.getSQLs();
     }
 
-    String extractSQL(PersistenceException e) {
+    String extractSQL(Exception e) {
         Throwable t = e.getCause();
         if (t instanceof ReportingSQLException)
             return ((ReportingSQLException) t).getSQL();
-        return null;
-    }
-    
-    private String sqlReport(String header, String jpql, List<String> jSQLs, 
-            List<String> cSQLs) {
-        StringBuffer tmp = new StringBuffer(header).append("\r\n")
-            .append("JPQL:["+jpql+"]").append("\r\n");
-        tmp.append(jSQLs.size() + " target SQL for JPQL").append("\r\n");
-        for (String s : jSQLs)
-            tmp.append(s).append("\r\n");
-        tmp.append(cSQLs.size() + " target SQL for Critera").append("\r\n");
-        for (String s : cSQLs)
-            tmp.append(s).append("\r\n");
-        return tmp.toString();
+        return "Can not extract SQL from exception " + e;
     }
     
     @Override
@@ -327,14 +317,23 @@
     }
 
     
-    public class Listener
-    extends AbstractJDBCListener {
-
-    @Override
-    public void beforeExecuteStatement(JDBCEvent event) {
-        if (event.getSQL() != null && sql != null) {
-            sql.add(event.getSQL());
+    public class SQLAuditor extends AbstractJDBCListener {
+        private List<String> sqls = new ArrayList<String>();
+    
+        @Override
+        public void beforeExecuteStatement(JDBCEvent event) {
+            if (event.getSQL() != null && sqls != null) {
+                System.err.println("Adding " + event.getSQL());
+               sqls.add(event.getSQL());
+            }
+        }
+        
+        void clear() {
+            sqls.clear();
+        }
+        
+        List<String> getSQLs() {
+            return new ArrayList<String>(sqls);
         }
     }
 }
-}

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Magazine_.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Magazine_.java?rev=789723&r1=789722&r2=789723&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Magazine_.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Magazine_.java Tue Jun 30 13:40:17 2009
@@ -14,5 +14,4 @@
     public static volatile SingularAttribute<Magazine,Integer> id;
     public static volatile SingularAttribute<Magazine,Publisher> idPublisher;
     public static volatile SingularAttribute<Magazine,String> name;
-    public static volatile SingularAttribute<Magazine,Long> serialVersionUID;
 }

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Publisher_.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Publisher_.java?rev=789723&r1=789722&r2=789723&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Publisher_.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Publisher_.java Tue Jun 30 13:40:17 2009
@@ -13,5 +13,4 @@
     public static volatile SingularAttribute<Publisher,Integer> id;
     public static volatile SetAttribute<Publisher,Magazine> magazineCollection;
     public static volatile SingularAttribute<Publisher,String> name;
-    public static volatile SingularAttribute<Publisher,Long> serialVersionUID;
 }

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestJoinCondition.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestJoinCondition.java?rev=789723&r1=789722&r2=789723&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestJoinCondition.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestJoinCondition.java Tue Jun 30 13:40:17 2009
@@ -37,21 +37,21 @@
         CriteriaQuery<?> cq = cb.createQuery();
         Root<C> c = cq.from(C.class);
         CollectionJoin<C,D> d = c.join(C_.coll);
-        assertSame(Collection.class, d.getJavaType());
+        assertSame(D.class, d.getJavaType());
     }
     
     public void testSetJoinModel() {
         CriteriaQuery<?> cq = cb.createQuery();
         Root<C> c = cq.from(C.class);
         SetJoin<C,D> d = c.join(C_.set);
-        assertSame(Set.class, d.getJavaType());
+        assertSame(D.class, d.getJavaType());
     }
     
     public void testListJoinModel() {
         CriteriaQuery<?> cq = cb.createQuery();
         Root<C> c = cq.from(C.class);
         ListJoin<C,D> d = c.join(C_.list);
-        assertSame(List.class, d.getJavaType());
+        assertSame(D.class, d.getJavaType());
     }
     
     public void testInnerJoinSingleAttributeWithoutCondition() {

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestMetaModelTypesafeCriteria.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestMetaModelTypesafeCriteria.java?rev=789723&r1=789722&r2=789723&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestMetaModelTypesafeCriteria.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestMetaModelTypesafeCriteria.java Tue Jun 30 13:40:17 2009
@@ -22,11 +22,14 @@
 import java.util.List;
 
 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.Predicate;
 import javax.persistence.criteria.Root;
 import javax.persistence.criteria.SetJoin;
 import javax.persistence.criteria.Subquery;
@@ -139,7 +142,6 @@
         assertEquivalence(q, jpql);
     }
 
-    @AllowFailure(message="FetchJoin not implemented")
     public void testFetchJoins() {
         String jpql = "SELECT d FROM Department d LEFT JOIN FETCH d.employees "
                 + "WHERE d.deptNo = 1";
@@ -158,30 +160,28 @@
                     + "JOIN e.contactInfo.phones p  "
                     + "WHERE e.contactInfo.address.zipCode = '95054'";
         
-        CriteriaQuery q = cb.createQuery();
-        Root<Employee> emp = q.from(Employee.class);
-        Join<Contact, Phone> phone = emp.join(
-                employee_.getSingularAttribute("contactInfo", Contact.class)).join(
-                contact_.getList("phones", Phone.class));
-        q.where(cb.equal(emp.get(
-                employee_.getSingularAttribute("contactInfo", Contact.class)).get(
-                contact_.getSingularAttribute("address", Address.class)).get(
-                address_.getSingularAttribute("zipCode", String.class)), "95054"));
-        q.select(phone.get(phone_.getSingularAttribute("vendor", String.class)));
+        
+        CriteriaQuery<String> q = cb.createQuery(String.class);
+        Root<Employee> e = q.from(Employee.class);
+        Join<Contact, Phone> p = e.join(employee_.getSingularAttribute("contactInfo", Contact.class))
+                                  .join(contact_.getList("phones", Phone.class));
+        q.where(cb.equal(e.get(employee_.getSingularAttribute("contactInfo", Contact.class))
+                          .get(contact_.getSingularAttribute("address", Address.class))
+                          .get(address_.getSingularAttribute("zipCode", String.class)), 
+                         "95054"));
+        q.select(p.get(phone_.getSingularAttribute("vendor", String.class)));
 
         assertEquivalence(q, jpql);
     }
     
     public void testKeyPathNavigation() {
-        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%'";
 
-        CriteriaQuery q = cb.createQuery();
-        Root<Item> item = q.from(Item.class);
-        MapJoin<Item, String, Photo> photo = item.join(
-                item_.getMap("photos", String.class, Photo.class));
-        q.multiselect(item.get(item_.getSingularAttribute("name", String.class)), photo)
-                .where(cb.like(photo.key(), "%egret%"));
+        CriteriaQuery<Tuple> q = cb.createTupleQuery();
+        Root<Item> i = q.from(Item.class);
+        MapJoin<Item, String, Photo> p = i.join(item_.getMap("photos", String.class, Photo.class));
+        q.multiselect(i.get(item_.getSingularAttribute("name", String.class)), p)
+                .where(cb.like(p.key(), "%egret%"));
 
         assertEquivalence(q, jpql);
     }
@@ -191,23 +191,22 @@
                 + "WHERE c.customer.accountNum = 321987 AND INDEX(t) BETWEEN 0 "
                 + "AND 9";
         
-        CriteriaQuery cq = cb.createQuery();
+        CriteriaQuery<TransactionHistory> cq = cb.createQuery(TransactionHistory.class);
         Root<CreditCard> c = cq.from(CreditCard.class);
-        ListJoin<CreditCard, TransactionHistory> t = c.join(creditCard_
-                .getList("transactionHistory", TransactionHistory.class));
-        cq.select(t).where(
-                cb.equal(c.get(
-                        creditCard_.getSingularAttribute("customer", Customer.class))
-                        .get(customer_.getSingularAttribute("accountNum", Long.class)),
-                        321987), cb.between(t.index(), 0, 9));
+        ListJoin<CreditCard, TransactionHistory> t = c.join(creditCard_.getList("transactionHistory", 
+                TransactionHistory.class));
+        Predicate p1 = cb.equal(
+                c.get(creditCard_.getSingularAttribute("customer", Customer.class))
+                 .get(customer_.getSingularAttribute("accountNum", long.class)), 321987);
+        Predicate p2 = cb.between(t.index(), 0, 9);
+        cq.select(t).where(p1,p2);
 
         assertEquivalence(cq, jpql);
     }
     
-    @AllowFailure(message="as() not implemented")
     public void testIsEmptyExpressionOnJoin() {
         String jpql = "SELECT o FROM Order o WHERE o.lineItems IS EMPTY"; 
-        CriteriaQuery q = cb.createQuery(); 
+        CriteriaQuery<Order> q = cb.createQuery(Order.class); 
         Root<Order> o = q.from(Order.class);
         ListJoin<Order,LineItem> lineItems =
         o.join(order_.getList("lineItems", LineItem.class));
@@ -221,19 +220,17 @@
                 + "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.createQuery();
-        Root<Customer> cust = q.from(Customer.class);
-        Join<Customer, Order> order = cust.join(customer_.getSet("orders",
-                Order.class));
-        Join<Customer, Address> address = cust.join(customer_.getSingularAttribute(
-                "address", Address.class));
-        q.where(cb.equal(address.get(address_.getSingularAttribute("state",
-                String.class)), "CA"), cb.equal(address.get(address_
-                .getSingularAttribute("county", String.class)), "Santa Clara"));
-        q.multiselect(order.get(order_.getSingularAttribute("quantity", Integer.class)),
-                cb.prod(order.get(order_
-                        .getSingularAttribute("totalCost", Double.class)), 1.08),
-                address.get(address_.getSingularAttribute("zipCode", String.class)));
+        CriteriaQuery<Tuple> q = cb.createTupleQuery();
+        Root<Customer> c = q.from(Customer.class);
+        Join<Customer, Order> o = c.join(customer_.getSet("orders", Order.class));
+        Join<Customer, Address> a = c.join(customer_.getSingularAttribute("address", Address.class));
+        Expression<Double> taxedCost = cb.prod(o.get(order_.getSingularAttribute("totalCost", Double.class)), 1.08);
+        taxedCost.setAlias("taxedCost");
+        q.where(cb.equal(a.get(address_.getSingularAttribute("state", String.class)), "CA"), 
+                cb.equal(a.get(address_.getSingularAttribute("county", String.class)), "Santa Clara"));
+        q.multiselect(o.get(order_.getSingularAttribute("quantity", Integer.class)),
+                taxedCost,
+                a.get(address_.getSingularAttribute("zipCode", String.class)));
 
         assertEquivalence(q, jpql);
     }
@@ -251,15 +248,12 @@
        String jpql = "SELECT w.name FROM Course c JOIN c.studentWaitList w "
                 + "WHERE c.name = 'Calculus' AND INDEX(w) = 0";
         
-       CriteriaQuery q = cb.createQuery();
+       CriteriaQuery<String> q = cb.createQuery(String.class);
         Root<Course> course = q.from(Course.class);
-        ListJoin<Course, Student> w = course.join(course_.getList(
-                "studentWaitList", Student.class));
-        q.where(
-                cb.equal(
-                        course.get(course_.getSingularAttribute("name", String.class)),
-                        "Calculus"), cb.equal(w.index(), 0)).select(
-                w.get(student_.getSingularAttribute("name", String.class)));
+        ListJoin<Course, Student> w = course.join(course_.getList("studentWaitList", Student.class));
+        q.where(cb.equal(course.get(course_.getSingularAttribute("name", String.class)), "Calculus"), 
+                cb.equal(w.index(), 0))
+          .select(w.get(student_.getSingularAttribute("name", String.class)));
 
         assertEquivalence(q, jpql);
     }
@@ -274,10 +268,8 @@
                 LineItem.class));
         Join<Order, Customer> c = o.join(order_.getSingularAttribute("customer",
                 Customer.class));
-        q.where(cb
-                .equal(c.get(customer_.getSingularAttribute("lastName", String.class)),
-                        "Smith"), cb.equal(c.get(customer_.getSingularAttribute(
-                "firstName", String.class)), "John"));
+        q.where(cb.equal(c.get(customer_.getSingularAttribute("lastName", String.class)), "Smith"), 
+                cb.equal(c.get(customer_.getSingularAttribute("firstName", String.class)), "John"));
         q.select(cb.sum(i.get(lineItem_.getSingularAttribute("price", Double.class))));
 
         assertEquivalence(q, jpql);
@@ -312,18 +304,13 @@
                         employee_.getSingularAttribute("department", Department.class))
                         .get(department_.getSingularAttribute("name", String.class)),
                         "Engineering"));
-        q.multiselect(e.get(employee_.getSingularAttribute("name", String.class)), cb
-                .selectCase().when(
-                        cb.equal(e.get(employee_.getSingularAttribute("rating",
-                                Integer.class)), 1),
-                        cb.prod(e.get(employee_.getSingularAttribute("salary",
-                                Long.class)), 1.1)).when(
-                        cb.equal(e.get(employee_.getSingularAttribute("rating",
-                                Integer.class)), 2),
-                        cb.prod(e.get(employee_.getSingularAttribute("salary",
-                                Long.class)), 1.2)).otherwise(
-                        cb.prod(e.get(employee_.getSingularAttribute("salary",
-                                Long.class)), 1.01)));
+        q.multiselect(e.get(employee_.getSingularAttribute("name", String.class)), 
+                cb.selectCase().when(
+                        cb.equal(e.get(employee_.getSingularAttribute("rating", Integer.class)), 1),
+                        cb.prod(e.get(employee_.getSingularAttribute("salary",  Long.class)), 1.1)).when(
+                        cb.equal(e.get(employee_.getSingularAttribute("rating", Integer.class)), 2),
+                        cb.prod(e.get(employee_.getSingularAttribute("salary",  Long.class)), 1.2)).otherwise(
+                        cb.prod(e.get(employee_.getSingularAttribute("salary",  Long.class)), 1.01)));
 
         assertEquivalence(q, jpql);
     }
@@ -350,22 +337,21 @@
         assertEquivalence(q, jpql, new String[] { "stat" }, new Object[] { 1 });
     }
 
-    @AllowFailure(message="Generates invalid SQL")
     public void testKeyExpressionInSelectList() {
-        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";
+        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();
         Root<VideoStore> v = q.from(VideoStore.class);
-        MapJoin<VideoStore, Movie, Integer> inv = v.join(videoStore_.getMap(
-                "videoInventory", Movie.class, Integer.class));
-        q.where(cb.equal(v.get(
-                videoStore_.getSingularAttribute("location", Address.class)).get(
-                address_.getSingularAttribute("zipCode", String.class)), "94301"), cb
-                .gt(inv.value(), 0));
+        MapJoin<VideoStore, Movie, Integer> i = v.join(videoStore_.getMap("videoInventory", Movie.class,Integer.class));
+        q.where(cb.equal(v.get(videoStore_.getSingularAttribute("location", Address.class))
+                          .get(address_.getSingularAttribute("zipCode", String.class)), "94301"), 
+                          cb.gt(i.value(), 0));
         q.multiselect(v.get(videoStore_.getSingularAttribute("location", Address.class))
-                .get(address_.getSingularAttribute("street", String.class)), inv.key()
-                .get(movie_.getSingularAttribute("title", String.class)), inv.value());
+                .get(address_.getSingularAttribute("street", String.class)), 
+                i.key().get(movie_.getSingularAttribute("title", String.class)), 
+                i.value());
 
         assertEquivalence(q, jpql);
     }
@@ -474,7 +460,6 @@
         assertEquivalence(q, jpql);
     }
     
-    @AllowFailure(message="Root of the subquery._delegate not set")
     public void testCorrelatedSubqueryWithAllClause() {
         String jpql = "SELECT o FROM Order o JOIN o.customer c "
                     + "WHERE 10000 < ALL (SELECT a.balance FROM c.accounts a)";
@@ -557,30 +542,25 @@
     }
     
     public void testOrderingWithNumericalExpressionInSelection() {
-        String jpql = "SELECT o.quantity, o.totalCost * 1.08 AS taxedCost, "
-                + "a.zipCode "
+        String jpql = "SELECT o.quantity, o.totalCost * 1.08 AS taxedCost, a.zipCode "
                 + "FROM Customer c JOIN c.orders o JOIN c.address a "
                 + "WHERE a.state = 'CA' AND a.county = 'Santa Clara' "
                 + "ORDER BY o.quantity, taxedCost, a.zipCode";
         
         CriteriaQuery<?> q = cb.createQuery();
         Root<Customer> c = q.from(Customer.class);
-        Join<Customer, Order> o = c.join(customer_.getSet("orders",
-                Order.class));
-        Join<Customer, Address> a = c.join(customer_.getSingularAttribute("address",
-                Address.class));
-        q.where(cb.equal(a.get(address_.getSingularAttribute("state", String.class)),
-                "CA"), cb.equal(a.get(address_.getSingularAttribute("county",
-                String.class)), "Santa Clara"));
-        q.orderBy(
-                cb.asc(o.get(order_.getSingularAttribute("quantity", Integer.class))),
-                cb.asc(cb.prod(o.get(order_.getSingularAttribute("totalCost",
-                        Double.class)), 1.08)), cb.asc(a.get(address_
-                        .getSingularAttribute("zipCode", String.class))));
-        q.multiselect(o.get(order_.getSingularAttribute("quantity", Integer.class)), cb
-                .prod(o.get(order_.getSingularAttribute("totalCost", Double.class)),
-                        1.08), a.get(address_.getSingularAttribute("zipCode",
-                String.class)));
+        Join<Customer, Order> o = c.join(customer_.getSet("orders",  Order.class));
+        Join<Customer, Address> a = c.join(customer_.getSingularAttribute("address", Address.class));
+        Expression<Double> taxedCost = cb.prod(o.get(order_.getSingularAttribute("totalCost", Double.class)), 1.08);
+        taxedCost.setAlias("taxedCost");
+        q.where(cb.equal(a.get(address_.getSingularAttribute("state", String.class)), "CA"), 
+                cb.equal(a.get(address_.getSingularAttribute("county", String.class)), "Santa Clara"));
+        q.orderBy(cb.asc(o.get(order_.getSingularAttribute("quantity", Integer.class))),
+                  cb.asc(taxedCost), 
+                  cb.asc(a.get(address_.getSingularAttribute("zipCode", String.class))));
+        q.multiselect(o.get(order_.getSingularAttribute("quantity", Integer.class)), 
+                      taxedCost, 
+                      a.get(address_.getSingularAttribute("zipCode", String.class)));
         assertEquivalence(q, jpql);
     }
 }

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestSubqueries.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestSubqueries.java?rev=789723&r1=789722&r2=789723&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestSubqueries.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestSubqueries.java Tue Jun 30 13:40:17 2009
@@ -2,6 +2,7 @@
 
 import java.sql.Timestamp;
 
+import javax.persistence.Tuple;
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Expression;
 import javax.persistence.criteria.Join;
@@ -20,7 +21,7 @@
         String query = "SELECT DISTINCT o.name FROM CompUser o WHERE EXISTS"
                 + " (SELECT c FROM Address c WHERE c = o.address )";
 
-        CriteriaQuery<?> q = cb.createQuery();
+        CriteriaQuery<String> q = cb.createQuery(String.class);
         Root<CompUser> o = q.from(CompUser.class);
         Subquery<Address> sq = q.subquery(Address.class);
         sq.correlate(o);
@@ -28,7 +29,7 @@
         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);
+        q.select(o.get(CompUser_.name)).distinct(true);
         assertEquivalence(q, query);
     }
 
@@ -38,7 +39,7 @@
                 + " (SELECT s FROM CompUser s WHERE s.address.country = "
                 + "o.address.country)";
 
-        CriteriaQuery<?> q = cb.createQuery();
+        CriteriaQuery<String> q = cb.createQuery(String.class);
         Root<CompUser> o = q.from(CompUser.class);
         Subquery<CompUser> sq = q.subquery(CompUser.class);
         sq.correlate(o);
@@ -47,7 +48,7 @@
         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);
+        q.select(o.get(CompUser_.name)).distinct(true);
 
         assertEquivalence(q, query);
     }
@@ -58,9 +59,9 @@
                      + " ANY (SELECT s.computerName " 
                      + " FROM CompUser s WHERE s.address.country IS NOT NULL)";
 
-        CriteriaQuery<?> q = cb.createQuery();
+        CriteriaQuery<String> q = cb.createQuery(String.class);
         Root<CompUser> o = q.from(CompUser.class);
-//        q.select(o.get(CompUser_.name));
+        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));
@@ -77,9 +78,9 @@
                 + " (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.createQuery();
+        CriteriaQuery<Integer> q = cb.createQuery(Integer.class);
         Root<Order> o1 = q.from(Order.class);
-//        q.select(o1.get(Order_.id));
+        q.select(o1.get(Order_.id));
 
         Subquery<Integer> sq = q.subquery(Integer.class);
         Root<LineItem> i = sq.from(LineItem.class);
@@ -98,9 +99,10 @@
         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.createQuery();
+        
+        CriteriaQuery<Integer> q = cb.createQuery(Integer.class);
         Root<Order> o = q.from(Order.class);
-//        q.select(o.get(Order_.id));
+        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(
@@ -116,9 +118,10 @@
         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.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> o2 = sq.from(Order.class);
         sq.where(cb.equal(o.get(Order_.customer).get(Customer_.id), o2.get(
@@ -133,9 +136,10 @@
     public void testSubquery04() {
         String query = "select o.id from Order o where o.quantity >"
                 + " (select count(i) from o.lineItems i)";
-        CriteriaQuery<?> q = cb.createQuery();
+        
+        CriteriaQuery<Integer> q = cb.createQuery(Integer.class);
         Root<Order> o = q.from(Order.class);
-//        q.select(o.get(Order_.id));
+        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);
@@ -146,9 +150,10 @@
     public void testSubquery05() {
         String query = "select o.id from Order o where o.quantity >"
                 + " (select count(o.quantity) from Order o)";
-        CriteriaQuery<?> q = cb.createQuery();
+        
+        CriteriaQuery<Integer> q = cb.createQuery(Integer.class);
         Root<Order> o = q.from(Order.class);
-//        q.select(o.get(Order_.id));
+        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
@@ -161,9 +166,10 @@
     public void testSubquery06() {
         String query = "select o.id from Order o where o.quantity >"
                 + " (select count(o.id) from Order o)";
-        CriteriaQuery<?> q = cb.createQuery();
+
+        CriteriaQuery<Integer> q = cb.createQuery(Integer.class);
         Root<Order> o = q.from(Order.class);
-//        q.select(o.get(Order_.id));
+        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
@@ -176,9 +182,10 @@
     public void testSubquery07() {
         String query = "select o.id from Order o where o.quantity >"
                 + " (select avg(o.quantity) from Order o)";
-        CriteriaQuery<?> q = cb.createQuery();
+
+        CriteriaQuery<Integer> q = cb.createQuery(Integer.class);
         Root<Order> o = q.from(Order.class);
-//        q.select(o.get(Order_.id));
+        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
@@ -190,12 +197,12 @@
     @AllowFailure(message="JPQL generates invalid SQL")
     public void testSubquery08() {
         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)";
+                + "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.createQuery();
+        CriteriaQuery<String> q = cb.createQuery(String.class);
         Root<Customer> c = q.from(Customer.class);
-//        q.select(c.get(Customer_.name));
+        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);
@@ -217,9 +224,10 @@
                 + "where o.quantity between "
                 + "(select max(o.quantity) from Order o) and "
                 + "(select avg(o.quantity) from Order o) ";
-        CriteriaQuery<?> q = cb.createQuery();
+        
+        CriteriaQuery<String> q = cb.createQuery(String.class);
         Root<Customer> c = q.from(Customer.class);
-//        q.select(c.get(Customer_.name));
+        q.select(c.get(Customer_.name));
 
         Subquery<Integer> sq1 = q.subquery(Integer.class);
         Root<Order> o1 = sq1.from(Order.class);
@@ -230,9 +238,7 @@
         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));
+        q.where(cb.between(o.get(Order_.quantity), sq1, sq2.as(Integer.class)));
         
         assertEquivalence(q, query);
     }
@@ -243,9 +249,10 @@
                 + " (select sum(o2.quantity) from Customer c, " 
                 + "in(c.orders) o2) ";
         
-        CriteriaQuery<?> q = cb.createQuery();
+
+        CriteriaQuery<Integer> q = cb.createQuery(Integer.class);
         Root<Order> o = q.from(Order.class);
-//        q.select(o.get(Order_.id));
+        q.select(o.get(Order_.id));
 
         Subquery<Integer> sq = q.subquery(Integer.class);
         Root<Customer> c = sq.from(Customer.class);
@@ -263,9 +270,10 @@
                 + " (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.createQuery();
+
+        CriteriaQuery<Integer> q = cb.createQuery(Integer.class);
         Root<Order> o = q.from(Order.class);
-//        q.select(o.get(Order_.id));
+        q.select(o.get(Order_.id));
 
         Subquery<Double> sq1 = q.subquery(Double.class);
         Root<Customer> c = sq1.from(Customer.class);
@@ -277,21 +285,20 @@
         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));
+        q.where(cb.between(o2.get(Order_.quantity), sq1.as(Integer.class), sq2));
         assertEquivalence(q, query);
     }
 
     
     public void testSubquery12() {
-        String query =
-            "select o.id from Customer c, in(c.orders)o "
+        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.createQuery();
+
+        CriteriaQuery<Integer> q = cb.createQuery(Integer.class);
         Root<Customer> c = q.from(Customer.class);
         SetJoin<Customer, Order> o = c.join(Customer_.orders);
-//        q.select(o.get(Order_.id));
+        q.select(o.get(Order_.id));
 
         Subquery<Integer> sq = q.subquery(Integer.class);
         Root<Customer> sqc = sq.correlate(c);
@@ -307,10 +314,11 @@
         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.createQuery();
+        
+        CriteriaQuery<Tuple> q = cb.createTupleQuery();
         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));
+        q.multiselect(o1.get(Order_.id), c.get(Customer_.name));
 
         Subquery<Integer> sq = q.subquery(Integer.class);
         Join<Order, Customer> sqc = sq.correlate(c);
@@ -331,11 +339,11 @@
             + "(SELECT MAX(m3.id) FROM Magazine m3 "
             + "WHERE m3.idPublisher.id = p.id)) ";
 
-        CriteriaQuery<?> q = cb.createQuery();
+        CriteriaQuery<Tuple> q = cb.createTupleQuery();
         Root<Publisher> p = q.from(Publisher.class);
         Join<Publisher, Magazine> m = p.join(Publisher_.magazineCollection,
             JoinType.LEFT);
-//        q.select(p, m);
+        q.multiselect(p, m);
 
         Subquery<Integer> sq = q.subquery(Integer.class);
         Root<Magazine> m2 = sq.from(Magazine.class);
@@ -376,9 +384,10 @@
                 + "     WHEN o2.quantity = 10 THEN false "
                 + "     ELSE false END from Order o2"
                 + " where o.customer.id = o2.customer.id)";
-        CriteriaQuery<?> q = cb.createQuery();
+
+        CriteriaQuery<Integer> q = cb.createQuery(Integer.class);
         Root<Order> o = q.from(Order.class);
-//        q.select(o.get(Order_.id));
+        q.select(o.get(Order_.id));
 
         Subquery<Boolean> sq = q.subquery(Boolean.class);
         Root<Order> o2 = sq.from(Order.class);
@@ -402,9 +411,10 @@
                 + " (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.createQuery();
+
+        CriteriaQuery<Integer> q = cb.createQuery(Integer.class);
         Root<Order> o1 = q.from(Order.class);
-//        q.select(o1.get(Order_.id));
+        q.select(o1.get(Order_.id));
 
         Subquery<Integer> sq = q.subquery(Integer.class);
         Root<LineItem> i = sq.from(LineItem.class);
@@ -424,9 +434,10 @@
         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.createQuery();
+
+        CriteriaQuery<Integer> q = cb.createQuery(Integer.class);
         Root<Order> o = q.from(Order.class);
-//        q.select(o.get(Order_.customer).get(Customer_.name));
+        q.select(o.get(Order_.id));
 
         Subquery<String> sq = q.subquery(String.class);
         Root<Order> o2 = sq.from(Order.class);
@@ -444,9 +455,10 @@
     public void testSubquery18() {
         String query = "select o.id from Order o where o.orderTs >"
                 + " (select CURRENT_TIMESTAMP from o.lineItems i)";
-        CriteriaQuery<?> q = cb.createQuery();
+
+        CriteriaQuery<Integer> q = cb.createQuery(Integer.class);
         Root<Order> o = q.from(Order.class);
-//        q.select(o.get(Order_.id));
+        q.select(o.get(Order_.id));
 
         Subquery<Timestamp> sq = q.subquery(Timestamp.class);
         Root<Order> o2 = sq.correlate(o);

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=789723&r1=789722&r2=789723&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 30 13:40:17 2009
@@ -37,11 +37,16 @@
 package org.apache.openjpa.persistence.criteria;
 
 import javax.persistence.Parameter;
+import javax.persistence.Tuple;
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Expression;
+import javax.persistence.criteria.ParameterExpression;
 import javax.persistence.criteria.Root;
+import javax.persistence.criteria.Selection;
 import javax.persistence.criteria.Subquery;
 
+import org.apache.openjpa.persistence.inheritance.entity.ComputerUser;
+
 /**
  * Tests type-strict version of Criteria API. The test scenarios are adapted
  * from TestEJBQLCondExpression in
@@ -86,26 +91,24 @@
     }
 
     public void testInExpr() {
-        String jpql = "SELECT o.name FROM CompUser o "
-                     + "WHERE o.age IN (29, 40, 10)";
+        String jpql = "SELECT o.name FROM CompUser o WHERE o.age IN (29, 40, 10)";
         
-        CriteriaQuery<?> cq = cb.createQuery();
+        CriteriaQuery<String> cq = cb.createQuery(String.class);
         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));
+        cq.select(o.get(CompUser_.name));
         
         assertEquivalence(cq, jpql);
     }
 
     public void testNotIn() {
-        String jpql = "SELECT o.name FROM CompUser o "
-                    + "WHERE o.age NOT IN (29, 40, 10)";
+        String jpql = "SELECT o.name FROM CompUser o WHERE o.age NOT IN (29, 40, 10)";
 
-        CriteriaQuery<?> cq = cb.createQuery();
+        CriteriaQuery<String> cq = cb.createQuery(String.class);
         Root<CompUser> o = cq.from(CompUser.class);
         cq.where(cb.in(o.get(CompUser_.age)).value(29).value(40).value(10)
             .negate());
-//        cq.select(o.get(CompUser_.name));
+        cq.select(o.get(CompUser_.name));
         
         assertEquivalence(cq, jpql);
     }
@@ -114,14 +117,14 @@
         String jpql = "SELECT o.computerName FROM CompUser o "
                  + "WHERE o.name LIKE 'Sha%' AND o.computerName NOT IN ('PC')";
 
-        CriteriaQuery<?> cq = cb.createQuery();
+        CriteriaQuery<String> cq = cb.createQuery(String.class);
         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()
                 ));
         
-//        cq.select(o.get(CompUser_.computerName));
+        cq.select(o.get(CompUser_.computerName));
 
         assertEquivalence(cq, jpql);
     }
@@ -153,22 +156,20 @@
     }
     
     public void testLikeWithEscapeCharacter() {
-        String query = "SELECT o.name FROM CompUser o "
-            + "WHERE o.name LIKE :name ESCAPE '|'";
-        CriteriaQuery<?> cq = cb.createQuery();
+        String query = "SELECT o.name FROM CompUser o WHERE o.name LIKE :name ESCAPE '|'";
+        
+        CriteriaQuery<String> cq = cb.createQuery(String.class);
         Root<CompUser> c = cq.from(CompUser.class);
-        Parameter<String> param = cb.parameter(String.class, "name");
-//        cq.where(cb.like(c.get(CompUser_.name), param, '|'));
-//        cq.select(c.get(CompUser_.name));
+        ParameterExpression<String> param = cb.parameter(String.class, "name");
+        cq.where(cb.like(c.get(CompUser_.name), param, '|'));
+        cq.select(c.get(CompUser_.name));
         
-        assertEquivalence(cq, query, new String[]{"name"}, 
-                new Object[] {"%|_%"});
+        assertEquivalence(cq, query, new String[]{"name"}, new Object[] {"%|_%"});
     }
 
     public void testNullExpression() {
-        String query =
-            "SELECT o.name FROM CompUser o WHERE o.age IS NOT NULL AND " +
-            "o.computerName = 'PC' ";
+        String query = "SELECT o.name FROM CompUser o "
+                     + "WHERE o.age IS NOT NULL AND o.computerName = 'PC'";
         
         CriteriaQuery<String> cq = cb.createQuery(String.class);
         Root<CompUser> c = cq.from(CompUser.class);
@@ -195,8 +196,7 @@
     // do not support isEmpty for array fields
     
     public void testIsEmptyExprUsingCriteria() {
-        String query =
-            "SELECT o.name FROM CompUser o WHERE o.nicknames IS NOT EMPTY";
+        String query = "SELECT o.name FROM CompUser o WHERE o.nicknames IS NOT EMPTY";
 
         CriteriaQuery<String> cq = cb.createQuery(String.class);
         Root<CompUser> o = cq.from(CompUser.class);
@@ -208,17 +208,16 @@
     
     
     public void testConstructorExprUsingCriteria() {
-        String query =
-            "SELECT NEW org.apache.openjpa.persistence.criteria.MaleUser(" +
+        String query = "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'";
         
-        CriteriaQuery<?> cq = cb.createQuery();
+        CriteriaQuery<MaleUser> cq = cb.createQuery(MaleUser.class);
         Root<CompUser> c = cq.from(CompUser.class);
         cq.where(cb.equal(c.get(CompUser_.name), "Seetha"));
-//        cq.select(cb.select(MaleUser.class, c.get(CompUser_.name), 
-//            c.get(CompUser_.computerName), c.get(CompUser_.address),
-//            c.get(CompUser_.age), c.get(CompUser_.userid)));
+        cq.select(cb.construct(MaleUser.class, c.get(CompUser_.name), 
+            c.get(CompUser_.computerName), c.get(CompUser_.address),
+            c.get(CompUser_.age), c.get(CompUser_.userid)));
         
         assertEquivalence(cq, query);
    }
@@ -389,11 +388,11 @@
     }
     
     public void testArithmFunc2() {
-        String query =
-            "select SQRT(e.age) From CompUser e WHERE e.name='Seetha'";
-        CriteriaQuery<?> q = cb.createQuery();
+        String query = "select SQRT(e.age) From CompUser e WHERE e.name='Seetha'";
+        
+        CriteriaQuery<Double> q = cb.createQuery(Double.class);
         Root<CompUser> e = q.from(CompUser.class);
-//        q.select(cb.sqrt(e.get(CompUser_.age)));
+        q.select(cb.sqrt(e.get(CompUser_.age)));
         q.where(cb.equal(e.get(CompUser_.name), "Seetha"));
         
         assertEquivalence(q, query);
@@ -401,50 +400,46 @@
     
     
     public void testArithmFunc3() {
-        String query =
-            "select MOD(e.age, 4) From CompUser e WHERE e.name='Seetha'";
-        CriteriaQuery<?> q = cb.createQuery();
+        String query = "select MOD(e.age, 4) From CompUser e WHERE e.name='Seetha'";
+        
+        CriteriaQuery<Integer> q = cb.createQuery(Integer.class);
         Root<CompUser> e = q.from(CompUser.class);
-//        q.select(cb.mod(e.get(CompUser_.age), 4));
+        q.select(cb.mod(e.get(CompUser_.age), 4));
         q.where(cb.equal(e.get(CompUser_.name), "Seetha"));
         
         assertEquivalence(q, query);
     }
     
     public void testArithmFunc4() {
-        String query = "SELECT e.name FROM CompUser e WHERE " +
-        		"SIZE(e.nicknames) = 6";
-        CriteriaQuery<?> q = cb.createQuery();
+        String query = "SELECT e.name FROM CompUser e WHERE SIZE(e.nicknames) = 6";
+        
+        CriteriaQuery<String> q = cb.createQuery(String.class);
         Root<CompUser> e = q.from(CompUser.class);
-        //q.where(cb.equal(cb.size(e.get(CompUser_.nicknames)), 6));
-//        q.select(e.get(CompUser_.name));
+        q.where(cb.equal(cb.size(e.get(CompUser_.nicknames)), 6));
+        q.select(e.get(CompUser_.name));
         
         assertEquivalence(q, query);
     }
 
     public void testGroupByHavingClause() {
-        String query =
-            "SELECT c.name FROM CompUser c GROUP BY c.name HAVING c.name " +
-            "LIKE 'S%'";
+        String query = "SELECT c.name FROM CompUser c GROUP BY c.name HAVING c.name LIKE 'S%'";
 
-        CriteriaQuery<?> q = cb.createQuery();
+        CriteriaQuery<String> q = cb.createQuery(String.class);
         Root<CompUser> e = q.from(CompUser.class);
         q.groupBy(e.get(CompUser_.name));
         q.having(cb.like(e.get(CompUser_.name), "S%"));
-//        q.select(e.get(CompUser_.name));
+        q.select(e.get(CompUser_.name));
         
         assertEquivalence(q, query);
     }
 
     public void testOrderByClause() {
-        String query =
-            "SELECT c.name FROM CompUser c WHERE c.name LIKE 'S%' " +
-            "ORDER BY c.name";
+        String query = "SELECT c.name FROM CompUser c WHERE c.name LIKE 'S%' ORDER BY c.name";
 
-        CriteriaQuery<?> q = cb.createQuery();
+        CriteriaQuery<String> q = cb.createQuery(String.class);
         Root<CompUser> e = q.from(CompUser.class);
         q.where(cb.like(e.get(CompUser_.name), "S%"));
-//        q.select(e.get(CompUser_.name));
+        q.select(e.get(CompUser_.name));
         q.orderBy(cb.asc(e.get(CompUser_.name)));
         
         assertEquivalence(q, query);
@@ -454,9 +449,9 @@
         //To be Tested: AVG, COUNT, MAX, MIN, SUM
         String query = "SELECT AVG(e.age) FROM CompUser e";
         
-        CriteriaQuery<?> q = cb.createQuery();
+        CriteriaQuery<Double> q = cb.createQuery(Double.class);
         Root<CompUser> e = q.from(CompUser.class);
-//        q.select(cb.avg(e.get(CompUser_.age)));
+        q.select(cb.avg(e.get(CompUser_.age)));
         
         assertEquivalence(q, query);
     }
@@ -464,9 +459,9 @@
     public void testCOUNTAggregFunc() {
         String query = "SELECT COUNT(c.name) FROM CompUser c";
 
-        CriteriaQuery<?> q = cb.createQuery();
+        CriteriaQuery<Long> q = cb.createQuery(Long.class);
         Root<CompUser> e = q.from(CompUser.class);
-//        q.select(cb.count(e.get(CompUser_.name)));
+        q.select(cb.count(e.get(CompUser_.name)));
         
         assertEquivalence(q, query);
     }
@@ -474,9 +469,9 @@
     public void testMAXAggregFunc() {
         String query = "SELECT DISTINCT MAX(c.age) FROM CompUser c";
 
-        CriteriaQuery<?> q = cb.createQuery();
+        CriteriaQuery<Integer> q = cb.createQuery(Integer.class);
         Root<CompUser> e = q.from(CompUser.class);
-//        q.select(cb.max(e.get(CompUser_.age))).distinct(true);
+        q.select(cb.max(e.get(CompUser_.age))).distinct(true);
         
         assertEquivalence(q, query);
     }
@@ -484,9 +479,9 @@
     public void testMINAggregFunc() {
         String query = "SELECT DISTINCT MIN(c.age) FROM CompUser c";
 
-        CriteriaQuery<?> q = cb.createQuery();
+        CriteriaQuery<Integer> q = cb.createQuery(Integer.class);
         Root<CompUser> e = q.from(CompUser.class);
-//        q.select(cb.min(e.get(CompUser_.age))).distinct(true);
+        q.select(cb.min(e.get(CompUser_.age))).distinct(true);
         
         assertEquivalence(q, query);
     }
@@ -494,20 +489,19 @@
     public void testSUMAggregFunc() {
         String query = "SELECT SUM(c.age) FROM CompUser c";
 
-        CriteriaQuery<?> q = cb.createQuery();
+        CriteriaQuery<Integer> q = cb.createQuery(Integer.class);
         Root<CompUser> e = q.from(CompUser.class);
-//        q.select(cb.sum(e.get(CompUser_.age)));
+        q.select(cb.sum(e.get(CompUser_.age)));
         
         assertEquivalence(q, query);
     }
 
     public void testTypeExpression1() {
-        String jpql = "SELECT e FROM CompUser e where TYPE(e) in (:a, :b) " +
-            "ORDER By e.name";
+        String jpql = "SELECT e FROM CompUser e where TYPE(e) in (:a, :b) ORDER By e.name";
         
-        CriteriaQuery<?> cq = cb.createQuery();
+        CriteriaQuery<CompUser> cq = cb.createQuery(CompUser.class);
         Root<CompUser> e = cq.from(CompUser.class);
-//        cq.select(e);
+        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));
@@ -520,27 +514,29 @@
     
     public void testTypeExpression2() {
         String query = "SELECT TYPE(e) FROM CompUser e where TYPE(e) <> :t";
-        CriteriaQuery<?> q = cb.createQuery();
+        
+        CriteriaQuery<Tuple> q = cb.createTupleQuery();
         Root<CompUser> e = q.from(CompUser.class);
         Parameter<Class> param1 = cb.parameter(Class.class, "t");
-//        q.select(e.type());
+        Expression<Class<? extends CompUser>> etype = e.type();
+        // how to specify the following
+        q.multiselect(e.type());
         q.where(cb.equal(e.type(), param1).negate());
         
-        assertEquivalence(q, query, new String[]{"t"}, 
-                new Class[]{MaleUser.class});
+        assertEquivalence(q, query, new String[]{"t"}, new Class[]{MaleUser.class});
     }
 
     // Type literal
     // this Cartesian problem can not be rewritten to use JOIN
     
     public void testTypeExpression3() {
-        String query = "SELECT e, FemaleUser, a FROM Address a, FemaleUser e "
-                + " where e.address IS NOT NULL";
-        CriteriaQuery<?> q = cb.createQuery();
+        String query = "SELECT e, FemaleUser, a FROM Address a, FemaleUser e where e.address IS NOT NULL";
+        
+        CriteriaQuery<Tuple> q = cb.createTupleQuery();
         Root<Address> a = q.from(Address.class);
-        // Join<Address,FemaleUser> e = a.join(Address_.user);
-        // q.select(cb.literal(FemaleUser.class), e.get(CompUser_.address));
-        // q.where(cb.equal(e.type(), null).negate());
+        Root<FemaleUser> e = q.from(FemaleUser.class);
+        q.multiselect(e, cb.literal(FemaleUser.class), e.get(CompUser_.address));
+        q.where(e.get(FemaleUser_.address).isNotNull());
         
         assertEquivalence(q, query);
     }
@@ -548,9 +544,9 @@
     public void testTypeExpression4() {
         String query = "SELECT e FROM CompUser e where TYPE(e) = MaleUser";
         
-        CriteriaQuery<?> cq = cb.createQuery();
+        CriteriaQuery<CompUser> cq = cb.createQuery(CompUser.class);
         Root<CompUser> e = cq.from(CompUser.class);
-//        cq.select(e);
+        cq.select(e);
         cq.where(cb.equal(e.type(), cb.literal(MaleUser.class)));
         
         assertEquivalence(cq, query);
@@ -581,9 +577,9 @@
     
     public void testTypeExpression7() {
         String query = "SELECT TYPE(a.b) FROM A a";
-        CriteriaQuery<?> q = cb.createQuery();
+        CriteriaQuery<Tuple> q = cb.createTupleQuery();
         Root<A> a = q.from(A.class);
-//        q.select(a.get(A_.b).type());
+        q.multiselect(a.get(A_.b).type());
         
         assertEquivalence(q, query);
     }
@@ -591,9 +587,9 @@
     public void testTypeExpression8() {
         String query = "SELECT MaleUser FROM A a";
         
-        CriteriaQuery<?> q = cb.createQuery();
+        CriteriaQuery<Class> q = cb.createQuery(Class.class);
         Root<A> a = q.from(A.class);
-//        q.select(cb.literal(MaleUser.class));
+        q.multiselect(cb.literal(MaleUser.class));
         
         assertEquivalence(q, query);
     }
@@ -602,36 +598,34 @@
         String query = "SELECT "
                 + " CASE TYPE(e) WHEN FemaleUser THEN 'Female' "
                 + " ELSE 'Male' END FROM CompUser e";
-        CriteriaQuery<?> q = cb.createQuery();
+        CriteriaQuery<Object> q = cb.createQuery();
         Root<CompUser> e = q.from(CompUser.class);
-//        q.select(cb.selectCase(e.type()).when(FemaleUser.class, "Female")
-//                .otherwise("Male"));
+        q.select(cb.selectCase(e.type())
+                    .when(FemaleUser.class, "Female")
+                    .otherwise("Male"));
         
         assertEquivalence(q, query);
     }
 
     public void testCoalesceExpressions() {
-         String query = "SELECT e.name, "
-                + "COALESCE (e.address.country, 'Unknown')"
-                + " FROM CompUser e ORDER BY e.name DESC";
+         String query = "SELECT e.name, COALESCE (e.address.country, 'Unknown') FROM CompUser e ORDER BY e.name DESC";
 
-        CriteriaQuery<?> q = cb.createQuery();
+        CriteriaQuery<Tuple> q = cb.createTupleQuery();
         Root<CompUser> e = q.from(CompUser.class);
-//        q.select(e.get(CompUser_.name), cb.coalesce().value(
-//                e.get(CompUser_.address).get(Address_.country))
-//                .value("Unknown"));
+        q.multiselect(e.get(CompUser_.name), 
+                      cb.coalesce().value(e.get(CompUser_.address).get(Address_.country)).value("Unknown"));
         q.orderBy(cb.desc(e.get(CompUser_.name)));
         
         assertEquivalence(q, query);
     }
 
     public void testNullIfExpressions() {
-        String query = "SELECT e.name, NULLIF (e.address.country, 'USA')"
-                + " FROM CompUser e ORDER BY e.name DESC";
-        CriteriaQuery<?> q = cb.createQuery();
+        String query = "SELECT e.name, NULLIF (e.address.country, 'USA') FROM CompUser e ORDER BY e.name DESC";
+        
+        CriteriaQuery<Tuple> q = cb.createTupleQuery();
         Root<CompUser> e = q.from(CompUser.class);
-//        q.select(e.get(CompUser_.name), cb.nullif(e.get(CompUser_.address).get(
-//                Address_.country), "USA"));
+        q.multiselect(e.get(CompUser_.name), 
+                cb.nullif(e.get(CompUser_.address).get(Address_.country), "USA"));
         q.orderBy(cb.desc(e.get(CompUser_.name)));
         
         assertEquivalence(q, query);
@@ -642,14 +636,15 @@
                 + "CASE e.address.country WHEN 'USA' THEN 'us' "
                 + " ELSE 'non-us' END, e.address.country "
                 + " FROM CompUser e";
-        CriteriaQuery<?> q = cb.createQuery();
+        
+        CriteriaQuery<Tuple> q = cb.createTupleQuery();
         Root<CompUser> e = q.from(CompUser.class);
         Expression<Integer> cage = cb.sum(e.get(CompUser_.age), 1);
         Expression d2 = cb.selectCase(
                 e.get(CompUser_.address).get(Address_.country)).when("USA",
                 "us").otherwise("non-us");
-//        q.select(e.get(CompUser_.name), cage, d2, e.get(CompUser_.address).get(
-//                Address_.country));
+        q.multiselect(e.get(CompUser_.name), cage, d2, e.get(CompUser_.address).get(
+                Address_.country));
         
         assertEquivalence(q, query);
     }
@@ -660,15 +655,15 @@
                 + " THEN 'United-States' "
                 + " ELSE e.address.country  END," + " e.address.country "
                 + " FROM CompUser e";
-        CriteriaQuery<?> q = cb.createQuery();
+        CriteriaQuery<Tuple> q = cb.createTupleQuery();
         Root<CompUser> e = q.from(CompUser.class);
         Expression cage = cb.sum(e.get(CompUser_.age), 1);
         Expression d2 = cb.selectCase(
                 e.get(CompUser_.address).get(Address_.country)).when("USA",
                 "United-States").otherwise(
                 e.get(CompUser_.address).get(Address_.country));
-//        q.select(e.get(CompUser_.name), cage, d2, e.get(CompUser_.address).get(
-//                Address_.country));
+        q.multiselect(e.get(CompUser_.name), cage, d2, e.get(CompUser_.address).get(
+                Address_.country));
         
         assertEquivalence(q, query);
     }
@@ -679,11 +674,11 @@
                 + " ELSE 'Male' END"
                 + " FROM CompUser e WHERE e.name like 'S%' "
                 + " ORDER BY e.name DESC";
-        CriteriaQuery<?> q = cb.createQuery();
+        CriteriaQuery<Tuple> q = cb.createTupleQuery();
         Root<CompUser> e = q.from(CompUser.class);
-//        q.select(e.get(CompUser_.name), 
-//            cb.selectCase(e.type()).when(FemaleUser.class, "Female")
-//            .otherwise("Male"));
+        q.multiselect(e.get(CompUser_.name), 
+            cb.selectCase(e.type()).when(FemaleUser.class, "Female")
+            .otherwise("Male"));
         q.where(cb.like(e.get(CompUser_.name), "S%"));
         q.orderBy(cb.desc(e.get(CompUser_.name)));
         
@@ -694,13 +689,13 @@
         String query = "SELECT e.name, CASE e.address.country WHEN 'USA'"
                 + " THEN true ELSE false END,"
                 + " e.address.country FROM CompUser e";
-        CriteriaQuery<?> q = cb.createQuery();
+        CriteriaQuery<Tuple> q = cb.createTupleQuery();
         Root<CompUser> e = q.from(CompUser.class);
         Expression b = cb.selectCase(
                 e.get(CompUser_.address).get(Address_.country)).when("USA",
                 true).otherwise(false);
-//        q.select(e.get(CompUser_.name), b, e.get(CompUser_.address).get(
-//                Address_.country));
+        q.multiselect(e.get(CompUser_.name), b, e.get(CompUser_.address).get(
+                Address_.country));
         
         assertEquivalence(q, query);
     }
@@ -710,14 +705,14 @@
                 + " CASE WHEN e.age > 30 THEN e.age - 1 "
                 + " WHEN e.age < 15 THEN e.age + 1 ELSE e.age + 0 "
                 + " END FROM CompUser e";
-        CriteriaQuery<?> q = cb.createQuery();
+        CriteriaQuery<Tuple> q = cb.createTupleQuery();
         Root<CompUser> e = q.from(CompUser.class);
         Expression cage = cb.selectCase().when(cb.gt(e.get(CompUser_.age), 30),
                 cb.diff(e.get(CompUser_.age), 1)).when(
                 cb.lt(e.get(CompUser_.age), 15),
                 cb.sum(e.get(CompUser_.age), 1)).otherwise(
                 cb.sum(e.get(CompUser_.age), 0));
-//        q.select(e.get(CompUser_.name), e.get(CompUser_.age), cage);
+        q.multiselect(e.get(CompUser_.name), e.get(CompUser_.age), cage);
 
         assertEquivalence(q, query);
     }
@@ -729,7 +724,7 @@
                 + " ELSE 'Non United-States'  END,"
                 + " e.address.country "
                 + " FROM CompUser e";
-        CriteriaQuery<?> q = cb.createQuery();
+        CriteriaQuery<Tuple> q = cb.createTupleQuery();
         Root<CompUser> e = q.from(CompUser.class);
         Expression d2 = cb.selectCase()
                 .when(
@@ -738,8 +733,8 @@
                                 "USA"), "United-States").otherwise(
                         "Non United-States");
         Expression cage = cb.sum(e.get(CompUser_.age), 1);
-//        q.select(e.get(CompUser_.name), cage, d2, e.get(CompUser_.address).get(
-//                Address_.country));
+        q.multiselect(e.get(CompUser_.name), cage, d2, e.get(CompUser_.address).get(
+                Address_.country));
 
         assertEquivalence(q, query);
     }
@@ -756,13 +751,13 @@
             + "org.apache.openjpa.persistence.criteria.CompUser$" 
             + "CreditRating.EXCELLENT"
             + " END FROM CompUser e ORDER BY e.age";
-        CriteriaQuery<?> q = cb.createQuery();
+        CriteriaQuery<Tuple> q = cb.createTupleQuery();
         Root<CompUser> e = q.from(CompUser.class);
-//        q.select(e.get(CompUser_.name), cb.selectCase().when(
-//                cb.equal(e.get(CompUser_.age), 11), CompUser.CreditRating.POOR)
-//                .when(cb.equal(e.get(CompUser_.age), 35),
-//                        CompUser.CreditRating.GOOD).otherwise(
-//                        CompUser.CreditRating.EXCELLENT));
+        q.multiselect(e.get(CompUser_.name), cb.selectCase().when(
+                cb.equal(e.get(CompUser_.age), 11), CompUser.CreditRating.POOR)
+                .when(cb.equal(e.get(CompUser_.age), 35),
+                        CompUser.CreditRating.GOOD).otherwise(
+                        CompUser.CreditRating.EXCELLENT));
 
         q.orderBy(cb.asc(e.get(CompUser_.age)));
 
@@ -787,21 +782,20 @@
             + "CreditRating.EXCELLENT"
             + " END from CompUser e1"
             + " where e.userid = e1.userid) ORDER BY e.age";
-        CriteriaQuery<?> q = cb.createQuery();
+        CriteriaQuery<Tuple> q = cb.createTupleQuery();
         Root<CompUser> e = q.from(CompUser.class);
-//        q.select(e.get(CompUser_.name), e.get(CompUser_.creditRating));
+        q.multiselect(e.get(CompUser_.name), e.get(CompUser_.creditRating));
         q.orderBy(cb.asc(e.get(CompUser_.age)));
-        Subquery<Integer> sq = q.subquery(Integer.class);
+        Subquery<Object> sq = q.subquery(Object.class);
         Root<CompUser> e1 = sq.from(CompUser.class);
         sq.where(cb.equal(e.get(CompUser_.userid), e1.get(CompUser_.userid)));
 
         q.where(cb.equal(e.get(CompUser_.creditRating),
-        // sq.select(
-                cb.selectCase().when(cb.equal(e1.get(CompUser_.age), 11),
-                        CompUser.CreditRating.POOR).when(
-                        cb.equal(e1.get(CompUser_.age), 35),
-                        CompUser.CreditRating.GOOD).otherwise(
-                        CompUser.CreditRating.EXCELLENT)));
+           sq.select(
+                cb.selectCase()
+                  .when(cb.equal(e1.get(CompUser_.age), 11), CompUser.CreditRating.POOR)
+                  .when(cb.equal(e1.get(CompUser_.age), 35), CompUser.CreditRating.GOOD)
+                  .otherwise(CompUser.CreditRating.EXCELLENT))));
 
         q.orderBy(cb.asc(e.get(CompUser_.age)));