You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by mi...@apache.org on 2009/05/28 02:22:34 UTC

svn commit: r779361 [1/3] - in /openjpa/trunk: ./ openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/access/xml/ openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/ openjpa-persistence-jdbc/src/test/java/o...

Author: mikedd
Date: Thu May 28 00:22:33 2009
New Revision: 779361

URL: http://svn.apache.org/viewvc?rev=779361&view=rev
Log:
OPENJPA-1015. Enforce column width for testcases

Modified:
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/access/xml/XMLDefPropMixedFieldAccess2.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CompUser_.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CreditCard.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Customer_.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Employee_.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/FemaleUser_.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/FrequentFlierPlan_.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/MaleUser_.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestCriteria.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/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/criteria/Transaction_.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/delimited/identifiers/EntityF.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/kernel/TestFieldRange.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/ArrayMember_.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/Embed0_.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/Embed1_.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/ExplicitFieldAccess.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/ExplicitFieldAccessMixed_.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/ExplicitFieldAccess_.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/ExplicitPropertyAccessMixed_.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/ExplicitPropertyAccess_.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/ImplicitFieldAccessBase.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/ImplicitFieldAccessBase_.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/ImplicitFieldAccessSubclass.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/ImplicitFieldAccessSubclass_.java
    openjpa/trunk/openjpa-slice/src/test/java/org/apache/openjpa/slice/TestQuery.java
    openjpa/trunk/openjpa-slice/src/test/java/org/apache/openjpa/slice/TestQueryMultiThreaded.java
    openjpa/trunk/pom.xml

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/access/xml/XMLDefPropMixedFieldAccess2.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/access/xml/XMLDefPropMixedFieldAccess2.java?rev=779361&r1=779360&r2=779361&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/access/xml/XMLDefPropMixedFieldAccess2.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/access/xml/XMLDefPropMixedFieldAccess2.java Thu May 28 00:22:33 2009
@@ -52,9 +52,10 @@
     
     public boolean equals(Object obj) {
         if (obj instanceof XMLDefPropMixedFieldAccess2) {
-            XMLDefPropMixedFieldAccess2 dpmfa = (XMLDefPropMixedFieldAccess2)obj;
-            return getId() == dpmfa.getId() &&
-                getStrField().equals(dpmfa.getStrProp());
+            XMLDefPropMixedFieldAccess2 dpmfa =
+                (XMLDefPropMixedFieldAccess2) obj;
+            return getId() == dpmfa.getId()
+                && getStrField().equals(dpmfa.getStrProp());
         }
         return false;
     }

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CompUser_.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CompUser_.java?rev=779361&r1=779360&r2=779361&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CompUser_.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CompUser_.java Thu May 28 00:22:33 2009
@@ -7,12 +7,14 @@
 import javax.persistence.metamodel.Attribute;
 import javax.persistence.metamodel.List;
 
-@javax.persistence.metamodel.TypesafeMetamodel(value=org.apache.openjpa.persistence.criteria.CompUser.class)
+@javax.persistence.metamodel.TypesafeMetamodel(
+    value=org.apache.openjpa.persistence.criteria.CompUser.class)
 public class CompUser_ {
     public static volatile Attribute<CompUser,Address> address;
     public static volatile Attribute<CompUser,Integer> age;
     public static volatile Attribute<CompUser,String> computerName;
-    public static volatile Attribute<CompUser,CompUser.CreditRating> creditRating;
+    public static volatile Attribute<CompUser,
+        CompUser.CreditRating> creditRating;
     public static volatile Attribute<CompUser,String> name;
     public static volatile List<CompUser,String> nicknames;
     public static volatile Attribute<CompUser,Integer> userid;

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CreditCard.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CreditCard.java?rev=779361&r1=779360&r2=779361&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CreditCard.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CreditCard.java Thu May 28 00:22:33 2009
@@ -50,7 +50,8 @@
         return transactionHistory;
     }
     
-    public void setTransactionHistory(List<TransactionHistory> transactionHistory) {
+    public void setTransactionHistory(List<TransactionHistory> 
+        transactionHistory) {
         this.transactionHistory = transactionHistory;
     }
     

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Customer_.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Customer_.java?rev=779361&r1=779360&r2=779361&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Customer_.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Customer_.java Thu May 28 00:22:33 2009
@@ -22,5 +22,6 @@
     public static volatile Attribute<Customer,String> name;
     public static volatile Set<Customer,Order> orders;
     public static volatile Attribute<Customer,Integer> status;
-    public static volatile Attribute<Customer,Customer.CreditRating> creditRating;
+    public static volatile Attribute<Customer,Customer.CreditRating> 
+        creditRating;
 }

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Employee_.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Employee_.java?rev=779361&r1=779360&r2=779361&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Employee_.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Employee_.java Thu May 28 00:22:33 2009
@@ -12,7 +12,8 @@
     public static volatile Attribute<Employee,Contact> contactInfo;
     public static volatile Attribute<Employee,Department> department;
     public static volatile Attribute<Employee,Integer> empId;
-    public static volatile Attribute<Employee,FrequentFlierPlan> frequentFlierPlan;
+    public static volatile Attribute<Employee,FrequentFlierPlan>
+        frequentFlierPlan;
     public static volatile Attribute<Employee,Manager> manager;
     public static volatile Attribute<Employee,String> name;
     public static volatile Attribute<Employee,Integer> rating;

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/FemaleUser_.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/FemaleUser_.java?rev=779361&r1=779360&r2=779361&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/FemaleUser_.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/FemaleUser_.java Thu May 28 00:22:33 2009
@@ -5,6 +5,7 @@
 package org.apache.openjpa.persistence.criteria;
 
 
-@javax.persistence.metamodel.TypesafeMetamodel(value=org.apache.openjpa.persistence.criteria.FemaleUser.class)
+@javax.persistence.metamodel.TypesafeMetamodel(
+    value=org.apache.openjpa.persistence.criteria.FemaleUser.class)
 public class FemaleUser_ extends CompUser_  {
 }

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/FrequentFlierPlan_.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/FrequentFlierPlan_.java?rev=779361&r1=779360&r2=779361&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/FrequentFlierPlan_.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/FrequentFlierPlan_.java Thu May 28 00:22:33 2009
@@ -6,7 +6,8 @@
 
 import javax.persistence.metamodel.Attribute;
 
-@javax.persistence.metamodel.TypesafeMetamodel(value=org.apache.openjpa.persistence.criteria.FrequentFlierPlan.class)
+@javax.persistence.metamodel.TypesafeMetamodel(
+    value=org.apache.openjpa.persistence.criteria.FrequentFlierPlan.class)
 public class FrequentFlierPlan_ {
     public static volatile Attribute<FrequentFlierPlan,Integer> annualMiles;
     public static volatile Attribute<FrequentFlierPlan,String> id;

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/MaleUser_.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/MaleUser_.java?rev=779361&r1=779360&r2=779361&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/MaleUser_.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/MaleUser_.java Thu May 28 00:22:33 2009
@@ -5,6 +5,7 @@
 package org.apache.openjpa.persistence.criteria;
 
 
-@javax.persistence.metamodel.TypesafeMetamodel(value=org.apache.openjpa.persistence.criteria.MaleUser.class)
+@javax.persistence.metamodel.TypesafeMetamodel(
+        value=org.apache.openjpa.persistence.criteria.MaleUser.class)
 public class MaleUser_ extends CompUser_  {
 }

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestCriteria.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestCriteria.java?rev=779361&r1=779360&r2=779361&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestCriteria.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestCriteria.java Thu May 28 00:22:33 2009
@@ -51,550 +51,558 @@
  *
  */
 public class TestCriteria extends SingleEMFTestCase {
-	protected OpenJPAQueryBuilder qb; 
-	protected StringComparison comparator = new StringComparison();
-	
-	public void setUp() {
-		    super.setUp(CLEAR_TABLES,
-		    	Account.class,
-				Address.class, 
-				CompUser.class,
-				Contact.class,
-				Contractor.class, 
-				Course.class, 
-				CreditCard.class, 
-				Customer.class, 
-				Department.class, 
-				Employee.class, 
-				Exempt.class, 
-				FrequentFlierPlan.class,
-				Item.class,
-				LineItem.class,
-				Manager.class, 
-				Person.class, 
-				Order.class, 
-				Phone.class,
-				Photo.class,
-				Student.class, 
-				Transaction.class,
-				VideoStore.class);
-		qb = (QueryBuilderImpl)emf.getDynamicQueryBuilder();
-		emf.createEntityManager();
-	}
-	
-	public void tearDown() {
-		// do nothing as we may not have a database connection
-	}
-	
-	public void testLogicalPredicateAssociativity() {
-		DomainObject e = qb.createQueryDefinition(Employee.class);
-		Predicate p1 = e.get("salary").greaterThan(100);
-		Predicate p2 = e.get("rating").equal(5);
-		Predicate p3 = e.get("name").like("John");
-		Predicate w1 = p1.and(p2.or(p3));
-		Predicate w2 = (p1.and(p2)).or(p3);
-		QueryDefinition q1 = e.select(e).where(w1);
-		String jpql1 = qb.toJPQL(q1);
-		emf.createEntityManager().createDynamicQuery(q1).getResultList();
-		
-		QueryDefinition q2 = e.select(e).where(w2);
-		String jpql2 = qb.toJPQL(q2);
-		System.err.println(jpql1);
-		System.err.println(jpql2);
-		assertNotEquals(jpql1, jpql2);
-		emf.createEntityManager().createDynamicQuery(q2).getResultList();
-	}
-	
-	public void testMultipleDomainOfSameClass() {
-		DomainObject o1 = qb.createQueryDefinition(Order.class);
-		DomainObject o2 = o1.addRoot(Order.class);
-		o1.select(o1)
-		  .where(o1.get("quantity").greaterThan(o2.get("quantity"))
-		    .and(o2.get("customer").get("lastName").equal("Smith"))
-		    .and(o2.get("customer").get("firstName").equal("John")));
-		
-		String jpql = "select o from Order o, Order o2" +
-		              " where o.quantity > o2.quantity" +
-		              " and o2.customer.lastName = 'Smith'" +
-		              " and o2.customer.firstName = 'John'";
-		compare(jpql, o1);
-	}
+    protected OpenJPAQueryBuilder qb; 
+    protected StringComparison comparator = new StringComparison();
+    
+    public void setUp() {
+            super.setUp(CLEAR_TABLES,
+                Account.class,
+                Address.class, 
+                CompUser.class,
+                Contact.class,
+                Contractor.class, 
+                Course.class, 
+                CreditCard.class, 
+                Customer.class, 
+                Department.class, 
+                Employee.class, 
+                Exempt.class, 
+                FrequentFlierPlan.class,
+                Item.class,
+                LineItem.class,
+                Manager.class, 
+                Person.class, 
+                Order.class, 
+                Phone.class,
+                Photo.class,
+                Student.class, 
+                Transaction.class,
+                VideoStore.class);
+        qb = (QueryBuilderImpl)emf.getDynamicQueryBuilder();
+        emf.createEntityManager();
+    }
+    
+    public void tearDown() {
+        // do nothing as we may not have a database connection
+    }
+    
+    public void testLogicalPredicateAssociativity() {
+        DomainObject e = qb.createQueryDefinition(Employee.class);
+        Predicate p1 = e.get("salary").greaterThan(100);
+        Predicate p2 = e.get("rating").equal(5);
+        Predicate p3 = e.get("name").like("John");
+        Predicate w1 = p1.and(p2.or(p3));
+        Predicate w2 = (p1.and(p2)).or(p3);
+        QueryDefinition q1 = e.select(e).where(w1);
+        String jpql1 = qb.toJPQL(q1);
+        emf.createEntityManager().createDynamicQuery(q1).getResultList();
+        
+        QueryDefinition q2 = e.select(e).where(w2);
+        String jpql2 = qb.toJPQL(q2);
+        System.err.println(jpql1);
+        System.err.println(jpql2);
+        assertNotEquals(jpql1, jpql2);
+        emf.createEntityManager().createDynamicQuery(q2).getResultList();
+    }
+    
+    public void testMultipleDomainOfSameClass() {
+        DomainObject o1 = qb.createQueryDefinition(Order.class);
+        DomainObject o2 = o1.addRoot(Order.class);
+        o1.select(o1)
+          .where(o1.get("quantity").greaterThan(o2.get("quantity"))
+            .and(o2.get("customer").get("lastName").equal("Smith"))
+            .and(o2.get("customer").get("firstName").equal("John")));
+        
+        String jpql = "select o from Order o, Order o2" +
+                      " where o.quantity > o2.quantity" +
+                      " and o2.customer.lastName = 'Smith'" +
+                      " and o2.customer.firstName = 'John'";
+        compare(jpql, o1);
+    }
 
-	public void testFetchJoin() {
-		DomainObject d = qb.createQueryDefinition(Department.class);
-		d.leftJoinFetch("employees");
-		d.where(d.get("deptNo").equal(1));
-		
-		
-		String jpql = "select d from Department d" +
-		              " LEFT JOIN FETCH d.employees" +
-		              " where d.deptNo = 1";
-		compare(jpql, d);
-	}
-	
-	public void testMultipartNavigation() {
-		DomainObject e = qb.createQueryDefinition(Employee.class);
-		DomainObject p = e.join("contactInfo").join("phones");
-		e.where(e.get("contactInfo").get("address").get("zipCode")
-				.equal("95094")).select(p.get("vendor"));
-				
-		
-		String jpql = "select p.vendor from Employee e" +
-		              " JOIN e.contactInfo c JOIN c.phones p" +
-		              " where e.contactInfo.address.zipCode = '95094'";
-		compare(jpql, e);
-	}
-	
-	public void testOperatorPath() {
-		QueryDefinition qdef = qb.createQueryDefinition();
-		DomainObject item = qdef.addRoot(Item.class);
-		DomainObject photo = item.join("photos");
-		qdef.select(item.get("name"), photo.value())
-		    .where(photo.key().like("egret"));
-		
-		
-		String jpql = "select i.name, VALUE(p)"
-			        + " from Item i join i.photos p"
-			        + " where KEY(p) like 'egret'";
-		compare(jpql, qdef);
-	}
-	
-	public void testLiteral() {
-		DomainObject c = qb.createQueryDefinition(Customer.class);
-		DomainObject o = c.join("orders");
-		DomainObject a = c.join("address");
-		o.where(a.get("state").equal("CA").and(a.get("county").equal("Santa Clara")));
-		o.select(o.get("quantity"), o.get("cost").times(1.08), a.get("zipCode"));
-		
-		String jpql = "select o.quantity, o.cost*1.08, a.zipCode" +
-		              " from Customer c join c.orders o join c.address a" +
-		              " where a.state = 'CA' and a.county = 'Santa Clara'";
-		compare(jpql, c);
-	}
-	
-	public void testTypeExpression() {
-		DomainObject e = qb.createQueryDefinition(Employee.class);
-		e.select(e.type())
-		 .where(e.type().equal(Exempt.class).not());
-		
-		String jpql = "select TYPE(e)" +
-		              " from Employee e" +
-		              " where TYPE(e) <> Exempt";
-		compare(jpql, e);
-	}
+    public void testFetchJoin() {
+        DomainObject d = qb.createQueryDefinition(Department.class);
+        d.leftJoinFetch("employees");
+        d.where(d.get("deptNo").equal(1));
+        
+        
+        String jpql = "select d from Department d" +
+                      " LEFT JOIN FETCH d.employees" +
+                      " where d.deptNo = 1";
+        compare(jpql, d);
+    }
+    
+    public void testMultipartNavigation() {
+        DomainObject e = qb.createQueryDefinition(Employee.class);
+        DomainObject p = e.join("contactInfo").join("phones");
+        e.where(e.get("contactInfo").get("address").get("zipCode")
+                .equal("95094")).select(p.get("vendor"));
+                
+        
+        String jpql = "select p.vendor from Employee e" +
+                      " JOIN e.contactInfo c JOIN c.phones p" +
+                      " where e.contactInfo.address.zipCode = '95094'";
+        compare(jpql, e);
+    }
+    
+    public void testOperatorPath() {
+        QueryDefinition qdef = qb.createQueryDefinition();
+        DomainObject item = qdef.addRoot(Item.class);
+        DomainObject photo = item.join("photos");
+        qdef.select(item.get("name"), photo.value())
+            .where(photo.key().like("egret"));
+        
+        
+        String jpql = "select i.name, VALUE(p)"
+                    + " from Item i join i.photos p"
+                    + " where KEY(p) like 'egret'";
+        compare(jpql, qdef);
+    }
+    
+    public void testLiteral() {
+        DomainObject c = qb.createQueryDefinition(Customer.class);
+        DomainObject o = c.join("orders");
+        DomainObject a = c.join("address");
+        o.where(a.get("state").equal("CA").and(
+            a.get("county").equal("Santa Clara")));
+        o
+            .select(o.get("quantity"), o.get("cost").times(1.08), a
+                .get("zipCode"));
+        
+        String jpql = "select o.quantity, o.cost*1.08, a.zipCode" +
+                      " from Customer c join c.orders o join c.address a" +
+                      " where a.state = 'CA' and a.county = 'Santa Clara'";
+        compare(jpql, c);
+    }
+    
+    public void testTypeExpression() {
+        DomainObject e = qb.createQueryDefinition(Employee.class);
+        e.select(e.type())
+         .where(e.type().equal(Exempt.class).not());
+        
+        String jpql = "select TYPE(e)" +
+                      " from Employee e" +
+                      " where TYPE(e) <> Exempt";
+        compare(jpql, e);
+    }
 
-	public void testIndex() {
-		DomainObject c = qb.createQueryDefinition(Course.class);
-		DomainObject w = c.join("studentWaitList");
-		c.where(c.get("name").equal("Calculus").and(w.index().equal(0)))
-		 .select(w.get("name"));
-		
-		String jpql = "select s.name" +
-		              " from Course c join c.studentWaitList s" +
-		              " where c.name = 'Calculus' and INDEX(s) = 0";
-		compare(jpql, c);
-	}
-	
-	public void testSum() {
-		DomainObject o = qb.createQueryDefinition(Order.class);
-		DomainObject l = o.join("lineItems");
-		DomainObject c = o.join("customer");
-		c.where(c.get("lastName").equal("Smith").and(c.get("firstName").equal("John")))
-		 .select(l.get("price").sum());
-		
-		String jpql = "select SUM(l.price)" +
-		              " from Order o join o.lineItems l JOIN o.customer c" +
-		              " where c.lastName = 'Smith' and c.firstName = 'John'";
-		compare(jpql, c);
-	}
-	
-	public void testSize() {
-		DomainObject d = qb.createQueryDefinition(Department.class);
-		d.where(d.get("name").equal("Sales"))
-		 .select(d.get("employees").size());
-		
-		String jpql = "select SIZE(d.employees)" +
-		              " from Department d " +
-		              " where d.name = 'Sales'";
-		compare(jpql, d);
-	}
-	
-	public void testGeneralCase() {
-		DomainObject e = qb.createQueryDefinition(Employee.class);
-		e.where(e.get("department").get("name").equal("Engineering"));
-		e.select(e.get("name"),
-		e.generalCase()
-		.when(e.get("rating").equal(1))
-		.then(e.get("salary").times(1.1))
-		.when(e.get("rating").equal(2))
-		.then(e.get("salary").times(1.2))
-		.elseCase(e.get("salary").times(1.01)));
-		
-		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'";
-		
-		compare(jpql, e);
-	}
-	
-	public void testMemberOf() {
-		DomainObject p = qb.createQueryDefinition(Person.class);
-		p.where(p.literal("Joe").member(p.get("nicknames")));
-		
-		String jpql = "select p from Person p " +
-		              " where 'Joe' MEMBER OF p.nicknames";
-		compare(jpql, p);
-	}
-	
-	public void testParamater() {
-		QueryDefinition qdef = qb.createQueryDefinition();
-		DomainObject customer = qdef.addRoot(Customer.class);
-		qdef.where(customer.get("status").equal(qdef.param("status")));
-		
-		String jpql = "select c from Customer c " +
-		              " where c.status = :status";
-		compare(jpql, qdef, "status", 1);
-	}
-	
-	public void testBetween() {
-		DomainObject c = qb.createQueryDefinition(CreditCard.class);
-		DomainObject t = c.join("transactionHistory");
-		c.select(t).where(c.get("holder").get("name").equal("John Doe")
-				.and(t.index().between(0, 9)));
-		
-		
-		String jpql = "select t from CreditCard c JOIN c.transactionHistory t" +
-		              " where c.holder.name = 'John Doe' AND INDEX(t) " +
-		              " BETWEEN 0 AND 9";
-		
-		compare(jpql, c);
-	}
-	
-	public void testIsEmpty() {
-		DomainObject o = qb.createQueryDefinition(Order.class);
-		o.where(o.get("lineItems").isEmpty());
-		
-		
-		String jpql = "select o from Order o " +
-		              " where o.lineItems IS EMPTY";
-		compare(jpql, o);
-	}
+    public void testIndex() {
+        DomainObject c = qb.createQueryDefinition(Course.class);
+        DomainObject w = c.join("studentWaitList");
+        c.where(c.get("name").equal("Calculus").and(w.index().equal(0)))
+         .select(w.get("name"));
+        
+        String jpql = "select s.name" +
+                      " from Course c join c.studentWaitList s" +
+                      " where c.name = 'Calculus' and INDEX(s) = 0";
+        compare(jpql, c);
+    }
+    
+    public void testSum() {
+        DomainObject o = qb.createQueryDefinition(Order.class);
+        DomainObject l = o.join("lineItems");
+        DomainObject c = o.join("customer");
+        c.where(c.get("lastName").equal("Smith").and(c.get("firstName").
+            equal("John"))).select(l.get("price").sum());
+        
+        String jpql = "select SUM(l.price)" +
+                      " from Order o join o.lineItems l JOIN o.customer c" +
+                      " where c.lastName = 'Smith' and c.firstName = 'John'";
+        compare(jpql, c);
+    }
+    
+    public void testSize() {
+        DomainObject d = qb.createQueryDefinition(Department.class);
+        d.where(d.get("name").equal("Sales"))
+         .select(d.get("employees").size());
+        
+        String jpql = "select SIZE(d.employees)" +
+                      " from Department d " +
+                      " where d.name = 'Sales'";
+        compare(jpql, d);
+    }
+    
+    public void testGeneralCase() {
+        DomainObject e = qb.createQueryDefinition(Employee.class);
+        e.where(e.get("department").get("name").equal("Engineering"));
+        e.select(e.get("name"),
+        e.generalCase()
+        .when(e.get("rating").equal(1))
+        .then(e.get("salary").times(1.1))
+        .when(e.get("rating").equal(2))
+        .then(e.get("salary").times(1.2))
+        .elseCase(e.get("salary").times(1.01)));
+        
+        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'";
+        
+        compare(jpql, e);
+    }
+    
+    public void testMemberOf() {
+        DomainObject p = qb.createQueryDefinition(Person.class);
+        p.where(p.literal("Joe").member(p.get("nicknames")));
+        
+        String jpql = "select p from Person p " +
+                      " where 'Joe' MEMBER OF p.nicknames";
+        compare(jpql, p);
+    }
+    
+    public void testParamater() {
+        QueryDefinition qdef = qb.createQueryDefinition();
+        DomainObject customer = qdef.addRoot(Customer.class);
+        qdef.where(customer.get("status").equal(qdef.param("status")));
+        
+        String jpql = "select c from Customer c " +
+                      " where c.status = :status";
+        compare(jpql, qdef, "status", 1);
+    }
+    
+    public void testBetween() {
+        DomainObject c = qb.createQueryDefinition(CreditCard.class);
+        DomainObject t = c.join("transactionHistory");
+        c.select(t).where(c.get("holder").get("name").equal("John Doe")
+                .and(t.index().between(0, 9)));
+        
+        
+        String jpql = "select t from CreditCard c JOIN c.transactionHistory t" +
+                      " where c.holder.name = 'John Doe' AND INDEX(t) " +
+                      " BETWEEN 0 AND 9";
+        
+        compare(jpql, c);
+    }
+    
+    public void testIsEmpty() {
+        DomainObject o = qb.createQueryDefinition(Order.class);
+        o.where(o.get("lineItems").isEmpty());
+        
+        
+        String jpql = "select o from Order o " +
+                      " where o.lineItems IS EMPTY";
+        compare(jpql, o);
+    }
 
-	public void testNonCorrelatedSubQuery() {
-		QueryDefinition q1 = qb.createQueryDefinition();
-		DomainObject goodCustomer = q1.addRoot(Customer.class);
-		
-		QueryDefinition q2 = qb.createQueryDefinition();
-		DomainObject customer = q2.addRoot(Customer.class);
-		
-		q1.where(goodCustomer.get("balanceOwned")
-				.lessThan(q2.select(customer.get("balanceOwned").avg())));
-		
-		String jpql = "select c from Customer c "
-					+ " where c.balanceOwned < " 
-					+ "(select AVG(c2.balanceOwned) from Customer c2)";
-		compare(jpql, q1);
-	}
+    public void testNonCorrelatedSubQuery() {
+        QueryDefinition q1 = qb.createQueryDefinition();
+        DomainObject goodCustomer = q1.addRoot(Customer.class);
+        
+        QueryDefinition q2 = qb.createQueryDefinition();
+        DomainObject customer = q2.addRoot(Customer.class);
+        
+        q1.where(goodCustomer.get("balanceOwned")
+                .lessThan(q2.select(customer.get("balanceOwned").avg())));
+        
+        String jpql = "select c from Customer c "
+                    + " where c.balanceOwned < " 
+                    + "(select AVG(c2.balanceOwned) from Customer c2)";
+        compare(jpql, q1);
+    }
 
-	public void testNew() {
-		QueryDefinition q = qb.createQueryDefinition();
-		DomainObject customer = q.addRoot(Customer.class);
-		DomainObject order = customer.join("orders");
-		q.where(order.get("count").greaterThan(100))
-		 .select(q.newInstance(Customer.class, customer.get("id"),
-		                                       customer.get("status"),
-		                                       order.get("count")));
-		
-		
-		String jpql = "SELECT NEW org.apache.openjpa.persistence.criteria.Customer" 
-					+ "(c.id, c.status, o.count)"
-					+ " FROM Customer c JOIN c.orders o" 
-					+ " WHERE o.count > 100";
-		compare(jpql, q);
-	}
-	
-	public void testKeyValueOperatorPath() {
-		QueryDefinition q = qb.createQueryDefinition();
-		DomainObject v = q.addRoot(VideoStore.class);
-		DomainObject i = v.join("videoInventory");
-		q.where(v.get("location").get("zipCode").equal("94301")
-		 .and(i.value().greaterThan(0)));
-		q.select(v.get("location").get("street"), i.key().get("title"), i.value());
-		
-		String jpql = "SELECT v.location.street, KEY(v2).title, VALUE(v2)" 
-					+ " FROM VideoStore v JOIN v.videoInventory v2"
-					+ " WHERE v.location.zipCode = '94301' AND VALUE(v2) > 0";
-		
-		compare(jpql, q);
-	}
-	
-	public void testGroupByHaving() {
-		QueryDefinition q = qb.createQueryDefinition();
-		DomainObject customer = q.addRoot(Customer.class);
-		q.select(customer.get("status"), customer.get("filledOrderCount").avg(),
-		         customer.count())
-		 .groupBy(customer.get("status"))
-		 .having(customer.get("status").in(1, 2));
-		
-		String jpql = "SELECT c.status, AVG(c.filledOrderCount), COUNT(c)"
-					+ " FROM Customer c"
-					+ " GROUP BY c.status"
-					+ " HAVING c.status IN (1, 2)";
-		
-		compare(jpql, q);
-	}
-	
-	public void testGroupByHaving2() {
-		QueryDefinition q = qb.createQueryDefinition();
-		DomainObject customer = q.addRoot(Customer.class);
-		q.select(customer.get("country"), customer.count())
-		 .groupBy(customer.get("country"))
-		 .having(customer.count().greaterThan(30));
-		
-		String jpql = "SELECT c.country, COUNT(c)" 
-					+ " FROM Customer c"
-					+ " GROUP BY c.country"
-					+ " HAVING COUNT(c) > 30";
-		compare(jpql, q);
-	}
-	
-	public void testOrderBy() {
-		QueryDefinition q = qb.createQueryDefinition();
-		DomainObject customer = q.addRoot(Customer.class);
-		DomainObject order = customer.join("orders");
-		DomainObject address = customer.join("address");
-		q.where(address.get("state").equal("CA"))
-		.select(order)
-		.orderBy(order.get("quantity").desc(), order.get("totalcost"));
-		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";		
-		compare(jpql, q);
-	}
-	
-	public void testOrderBy2() {
-		QueryDefinition q = qb.createQueryDefinition();
-		DomainObject customer = q.addRoot(Customer.class);
-		DomainObject order = customer.join("orders");
-		DomainObject address = customer.join("address");
-		q.where(address.get("state").equal("CA"))
-		.select(order.get("quantity"), address.get("zipCode"))
-		.orderBy(order.get("quantity").desc(), address.get("zipCode"));
-		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 DESC, a.zipCode";
-		compare(jpql, q);
-	}
-	
-	public void testOrderByExpression() {
-		DomainObject o = qb.createQueryDefinition(Order.class);
-		DomainObject a = o.join("customer").join("address");
-		SelectItem taxedCost = o.get("cost").times(1.08);
-		o.select(o.get("quantity"), taxedCost, a.get("zipCode"))
-		.where(a.get("state").equal("CA")
-		.and(a.get("county").equal("Santa Clara")))
-		.orderBy(o.get("quantity"), taxedCost, a.get("zipCode"));
-		
-		String jpql = "SELECT o.quantity, o.cost*1.08 as o2, a.zipCode" 
-					+ " FROM Order o JOIN o.customer c JOIN c.address a"
-					+ " WHERE a.state = 'CA' AND a.county = 'Santa Clara'"
-					+ " ORDER BY o.quantity, o2, a.zipCode";
-		
-		compare(jpql, o);
-	}
-	
-	public void testCorrelatedSubquery() {
-		QueryDefinition q1 = qb.createQueryDefinition();
-		DomainObject emp = q1.addRoot(Employee.class);
-		
-		QueryDefinition q2 = qb.createQueryDefinition();
-		DomainObject spouseEmp = q2.addRoot(Employee.class);
-		
-		q2.where(spouseEmp.equal(emp.get("spouse"))).select(spouseEmp);
-		q1.selectDistinct(emp).where(q2.exists());
-		
-		String jpql = "SELECT DISTINCT e "
-					+ " FROM Employee e"
-					+ " WHERE EXISTS ("
-					        + " SELECT e2 " 
-					        + " FROM Employee e2"
-					        + " WHERE e2 = e.spouse)";
-		
-		compare(jpql, q1);
-	}
-	
-	public void testCreateSubquery() {
-		DomainObject customer = qb.createQueryDefinition(Customer.class);
-		DomainObject order = qb.createSubqueryDefinition(customer.get("orders"));
-		customer.where(order.select(order.get("cost").avg()).greaterThan(100));
-		
-		String jpql = "SELECT c "
-					+ " FROM Customer c"
-					+ " WHERE (SELECT AVG(o.cost) FROM c.orders o) > 100";
-		
-		compare(jpql, customer);
-	}
-	
-	public void testTypeList() {
-		DomainObject q = qb.createQueryDefinition(Employee.class);
-		q.where(q.type().in(Exempt.class, Contractor.class));
-		
-		String jpql = "SELECT e "
-			+ " FROM Employee e"
-			+ " WHERE TYPE(e) IN (Exempt, Contractor)";
-		
-		compare(jpql, q);
-	}
-	
-	public void testStringList() {
-		DomainObject q = qb.createQueryDefinition(Customer.class);
-		q.where(q.get("country").in("USA", "UK", "France"));
-		
-		String jpql = "SELECT c "
-			+ " FROM Customer c"
-			+ " WHERE c.country IN ('USA', 'UK', 'France')";
-		compare(jpql, q);
-	}
-	
-	public void testConcat() {
-		DomainObject e = qb.createQueryDefinition(Employee.class);
-		DomainObject f = e.join("frequentFlierPlan");
-		Expression c = 
-		e.generalCase().when(f.get("annualMiles").greaterThan(50000)).then("Platinum")
-		               .when(f.get("annualMiles").greaterThan(25000)).then("Gold")
-		               .elseCase("XYZ");
-		e.select(e.get("name"), f.get("name"), e.concat(c,e.literal("Frequent Flyer")));
-		
-		String jpql = "SELECT e.name, f.name, CONCAT(" 
-			+ " CASE WHEN f.annualMiles > 50000 THEN 'Platinum'" 
-			+ " WHEN f.annualMiles > 25000 THEN 'Gold'" 
-			+ " ELSE 'XYZ' END, 'Frequent Flyer')" 
-			+ " FROM Employee e JOIN e.frequentFlierPlan f";
-			
-		compare(jpql, e);
-	}
-	
-	public void testCorrelatedSubquerySpecialCase1() {
-		DomainObject o = qb.createQueryDefinition(Order.class);
-		DomainObject a = qb.createSubqueryDefinition(o.get("customer").get("accounts"));
-		o.select(o)
-		 .where(o.literal(10000).lessThan(a.select(a.get("balance")).all()));
-		
-		String jpql = "select o from Order o"
-			        + " where 10000 < ALL "
-			        + " (select a.balance from o.customer c join o.customer.accounts a)";
-		
-		compare(jpql, o);
-	}
-	
-	public void testCorrelatedSubquerySpecialCase2() {
-		DomainObject o = qb.createQueryDefinition(Order.class);
-		DomainObject c = o.join("customer");
-		DomainObject a = qb.createSubqueryDefinition(c.get("accounts"));
-		o.select(o)
-		 .where(o.literal(10000).lessThan(a.select(a.get("balance")).all()));
-		
-		String jpql = "select o from Order o JOIN o.customer c"
-			        + " where 10000 < ALL "
-			        + " (select a.balance from c.accounts a)";
-		
-		compare(jpql, o);
-	}
-	
-	public void testRecursiveDefinitionIsNotAllowed() {
-		DomainObject q = qb.createQueryDefinition(Customer.class);
-		q.where(q.exists().and(q.get("name").equal("wrong")));
-		
-		try {
-			qb.toJPQL(q);
-			fail();
-		} catch (RuntimeException e) {
-			// good
-		}
-	}
-	
-	// ---------------------------------------------------------------------
-	// verification methods
-	// ---------------------------------------------------------------------
-	
-	/**
-	 * Compare by executing the queries generated from the given JPQL and 
-	 * QueryDefinition. 
-	 */
-	void compare(String jpql, QueryDefinition q) {
-		compare(jpql, q, (Object[])null);
-	}
-	
-	/**
-	 * Compare hand crafted JPQL and QueryDefinition.
-	 * If skip is null then execute both queries against the database, otherwise
-	 * compare them literally. 
-	 */
-	void compare(String jpql, QueryDefinition q, Object...p) {
-		executeActually(jpql, q, p);
-	}
-	
-	/**
-	 * Compare the string version of QueryDefinition and given JPQL string with
-	 * some flexibility of case-insensitive reserved words.
-	 */
-	private void compareLiterally(String jpql, QueryDefinition q) {
-		String actual = qb.toJPQL(q);
-		if (!comparator.compare(jpql,actual)) 
-			fail("\r\nExpected: [" + jpql + "]\r\nActual  : [" + actual + "]");
-	}
-	
-	/**
-	 * Executes the given JPQL and QueryDefinition independently and compare 
-	 * their results.
-	 */
-	private void executeActually(String jpql, QueryDefinition q, Object...p) {
-		OpenJPAEntityManager em = emf.createEntityManager();
-		List<?> criteriaResult = null;
-		List<?> jpqlResult = null;
-		Throwable criteriaError = null;
-		Throwable jpqlError = null;
-		
-		try {
-			Query cq = em.createDynamicQuery(q);
-			setParameters(cq, p);
-			criteriaResult = cq.getResultList();
-		} catch (Exception e) {
-			criteriaError = e;	
-		}
-		try {
-			Query nq = em.createQuery(jpql);
-			setParameters(nq, p);
-			jpqlResult = nq.getResultList();
-		} catch (Exception e) {
-			jpqlError = e;
-		}
-		
-		if (criteriaError == null && jpqlError == null) {
-			assertEquals(criteriaResult.size(), jpqlResult.size());
-		} else if (criteriaError != null && jpqlError == null) {
-			fail("QueryDefinition generated invalid JPQL\r\n" 
-				+ "Criteria [" + qb.toJPQL(q) + "]\r\n"
-				+ "error : " + criteriaError.getMessage());
-		} else if (criteriaError == null && jpqlError != null) {
-			fail("Handcrafted JPQL is invalid \r\n" 
-					+ "JPQL [" + jpql + "]\r\n"
-					+ "error : " + jpqlError.getMessage());
-		} else {
-			compareLiterally(jpql, q);
-		}
-	}
-	
    void setParameters(Query q, Object...p) {
-		if (p == null)
-			return;
-		for (int i = 0; i < p.length; i += 2) {
-			q.setParameter(p[i].toString(), p[i+1]);
-		}
+    public void testNew() {
+        QueryDefinition q = qb.createQueryDefinition();
+        DomainObject customer = q.addRoot(Customer.class);
+        DomainObject order = customer.join("orders");
+        q.where(order.get("count").greaterThan(100))
+         .select(q.newInstance(Customer.class, customer.get("id"),
+                                               customer.get("status"),
+                                               order.get("count")));
+        
+        
+        String jpql =
+            "SELECT NEW org.apache.openjpa.persistence.criteria.Customer"
+                + "(c.id, c.status, o.count)"
+                + " FROM Customer c JOIN c.orders o" + " WHERE o.count > 100";
+        compare(jpql, q);
+    }
+    
+    public void testKeyValueOperatorPath() {
+        QueryDefinition q = qb.createQueryDefinition();
+        DomainObject v = q.addRoot(VideoStore.class);
+        DomainObject i = v.join("videoInventory");
+        q.where(v.get("location").get("zipCode").equal("94301").and(
+            i.value().greaterThan(0)));
+        q.select(v.get("location").get("street"), i.key().get("title"), i
+            .value());
+        
+        String jpql = "SELECT v.location.street, KEY(v2).title, VALUE(v2)" 
+                    + " FROM VideoStore v JOIN v.videoInventory v2"
+                    + " WHERE v.location.zipCode = '94301' AND VALUE(v2) > 0";
+        
+        compare(jpql, q);
+    }
+    
+    public void testGroupByHaving() {
+        QueryDefinition q = qb.createQueryDefinition();
+        DomainObject customer = q.addRoot(Customer.class);
+        q.select(customer.get("status"), customer.get("filledOrderCount").avg(),
+                 customer.count())
+         .groupBy(customer.get("status"))
+         .having(customer.get("status").in(1, 2));
+        
+        String jpql = "SELECT c.status, AVG(c.filledOrderCount), COUNT(c)"
+                    + " FROM Customer c"
+                    + " GROUP BY c.status"
+                    + " HAVING c.status IN (1, 2)";
+        
+        compare(jpql, q);
+    }
+    
+    public void testGroupByHaving2() {
+        QueryDefinition q = qb.createQueryDefinition();
+        DomainObject customer = q.addRoot(Customer.class);
+        q.select(customer.get("country"), customer.count())
+         .groupBy(customer.get("country"))
+         .having(customer.count().greaterThan(30));
+        
+        String jpql = "SELECT c.country, COUNT(c)" 
+                    + " FROM Customer c"
+                    + " GROUP BY c.country"
+                    + " HAVING COUNT(c) > 30";
+        compare(jpql, q);
+    }
+    
+    public void testOrderBy() {
+        QueryDefinition q = qb.createQueryDefinition();
+        DomainObject customer = q.addRoot(Customer.class);
+        DomainObject order = customer.join("orders");
+        DomainObject address = customer.join("address");
+        q.where(address.get("state").equal("CA"))
+        .select(order)
+        .orderBy(order.get("quantity").desc(), order.get("totalcost"));
+        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";        
+        compare(jpql, q);
+    }
+    
+    public void testOrderBy2() {
+        QueryDefinition q = qb.createQueryDefinition();
+        DomainObject customer = q.addRoot(Customer.class);
+        DomainObject order = customer.join("orders");
+        DomainObject address = customer.join("address");
+        q.where(address.get("state").equal("CA"))
+        .select(order.get("quantity"), address.get("zipCode"))
+        .orderBy(order.get("quantity").desc(), address.get("zipCode"));
+        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 DESC, a.zipCode";
+        compare(jpql, q);
+    }
+    
+    public void testOrderByExpression() {
+        DomainObject o = qb.createQueryDefinition(Order.class);
+        DomainObject a = o.join("customer").join("address");
+        SelectItem taxedCost = o.get("cost").times(1.08);
+        o.select(o.get("quantity"), taxedCost, a.get("zipCode"))
+        .where(a.get("state").equal("CA")
+        .and(a.get("county").equal("Santa Clara")))
+        .orderBy(o.get("quantity"), taxedCost, a.get("zipCode"));
+        
+        String jpql = "SELECT o.quantity, o.cost*1.08 as o2, a.zipCode" 
+                    + " FROM Order o JOIN o.customer c JOIN c.address a"
+                    + " WHERE a.state = 'CA' AND a.county = 'Santa Clara'"
+                    + " ORDER BY o.quantity, o2, a.zipCode";
+        
+        compare(jpql, o);
+    }
+    
+    public void testCorrelatedSubquery() {
+        QueryDefinition q1 = qb.createQueryDefinition();
+        DomainObject emp = q1.addRoot(Employee.class);
+        
+        QueryDefinition q2 = qb.createQueryDefinition();
+        DomainObject spouseEmp = q2.addRoot(Employee.class);
+        
+        q2.where(spouseEmp.equal(emp.get("spouse"))).select(spouseEmp);
+        q1.selectDistinct(emp).where(q2.exists());
+        
+        String jpql = "SELECT DISTINCT e "
+                    + " FROM Employee e"
+                    + " WHERE EXISTS ("
+                            + " SELECT e2 " 
+                            + " FROM Employee e2"
+                            + " WHERE e2 = e.spouse)";
+        
+        compare(jpql, q1);
+    }
+    
+    public void testCreateSubquery() {
+        DomainObject customer = qb.createQueryDefinition(Customer.class);
+        DomainObject order =
+            qb.createSubqueryDefinition(customer.get("orders"));
+        customer.where(order.select(order.get("cost").avg()).greaterThan(100));
+        
+        String jpql = "SELECT c "
+                    + " FROM Customer c"
+                    + " WHERE (SELECT AVG(o.cost) FROM c.orders o) > 100";
+        
+        compare(jpql, customer);
+    }
+    
+    public void testTypeList() {
+        DomainObject q = qb.createQueryDefinition(Employee.class);
+        q.where(q.type().in(Exempt.class, Contractor.class));
+        
+        String jpql = "SELECT e "
+            + " FROM Employee e"
+            + " WHERE TYPE(e) IN (Exempt, Contractor)";
+        
+        compare(jpql, q);
+    }
+    
+    public void testStringList() {
+        DomainObject q = qb.createQueryDefinition(Customer.class);
+        q.where(q.get("country").in("USA", "UK", "France"));
+        
+        String jpql = "SELECT c "
+            + " FROM Customer c"
+            + " WHERE c.country IN ('USA', 'UK', 'France')";
+        compare(jpql, q);
+    }
+    
+    public void testConcat() {
+        DomainObject e = qb.createQueryDefinition(Employee.class);
+        DomainObject f = e.join("frequentFlierPlan");
+        Expression c = 
+        e.generalCase().when(f.get("annualMiles").greaterThan(50000)).then(
+                "Platinum").when(f.get("annualMiles").greaterThan(25000)).then(
+                "Gold").elseCase("XYZ");
+        e.select(e.get("name"), f.get("name"), e.concat(c, e
+            .literal("Frequent Flyer")));
+        
+        String jpql = "SELECT e.name, f.name, CONCAT(" 
+            + " CASE WHEN f.annualMiles > 50000 THEN 'Platinum'" 
+            + " WHEN f.annualMiles > 25000 THEN 'Gold'" 
+            + " ELSE 'XYZ' END, 'Frequent Flyer')" 
+            + " FROM Employee e JOIN e.frequentFlierPlan f";
+            
+        compare(jpql, e);
+    }
+    
+    public void testCorrelatedSubquerySpecialCase1() {
+        DomainObject o = qb.createQueryDefinition(Order.class);
+        DomainObject a = qb.createSubqueryDefinition(o.get("customer").
+            get("accounts"));
+        o.select(o)
+         .where(o.literal(10000).lessThan(a.select(a.get("balance")).all()));
+        
+        String jpql =
+            "select o from Order o" + " where 10000 < ALL "
+                + " (select a.balance from o.customer c "
+                + "join o.customer.accounts a)";
+        
+        compare(jpql, o);
+    }
+    
+    public void testCorrelatedSubquerySpecialCase2() {
+        DomainObject o = qb.createQueryDefinition(Order.class);
+        DomainObject c = o.join("customer");
+        DomainObject a = qb.createSubqueryDefinition(c.get("accounts"));
+        o.select(o)
+         .where(o.literal(10000).lessThan(a.select(a.get("balance")).all()));
+        
+        String jpql = "select o from Order o JOIN o.customer c"
+                    + " where 10000 < ALL "
+                    + " (select a.balance from c.accounts a)";
+        
+        compare(jpql, o);
+    }
+    
+    public void testRecursiveDefinitionIsNotAllowed() {
+        DomainObject q = qb.createQueryDefinition(Customer.class);
+        q.where(q.exists().and(q.get("name").equal("wrong")));
+        
+        try {
+            qb.toJPQL(q);
+            fail();
+        } catch (RuntimeException e) {
+            // good
+        }
+    }
+    
+    // ---------------------------------------------------------------------
+    // verification methods
+    // ---------------------------------------------------------------------
+    
+    /**
+     * Compare by executing the queries generated from the given JPQL and 
+     * QueryDefinition. 
+     */
+    void compare(String jpql, QueryDefinition q) {
+        compare(jpql, q, (Object[])null);
+    }
+    
+    /**
+     * Compare hand crafted JPQL and QueryDefinition.
+     * If skip is null then execute both queries against the database, otherwise
+     * compare them literally. 
+     */
+    void compare(String jpql, QueryDefinition q, Object...p) {
+        executeActually(jpql, q, p);
+    }
+    
+    /**
+     * Compare the string version of QueryDefinition and given JPQL string with
+     * some flexibility of case-insensitive reserved words.
+     */
+    private void compareLiterally(String jpql, QueryDefinition q) {
+        String actual = qb.toJPQL(q);
+        if (!comparator.compare(jpql,actual)) 
+            fail("\r\nExpected: [" + jpql + "]\r\nActual  : [" + actual + "]");
+    }
+    
+    /**
+     * Executes the given JPQL and QueryDefinition independently and compare 
+     * their results.
+     */
+    private void executeActually(String jpql, QueryDefinition q, Object...p) {
+        OpenJPAEntityManager em = emf.createEntityManager();
+        List<?> criteriaResult = null;
+        List<?> jpqlResult = null;
+        Throwable criteriaError = null;
+        Throwable jpqlError = null;
+        
+        try {
+            Query cq = em.createDynamicQuery(q);
+            setParameters(cq, p);
+            criteriaResult = cq.getResultList();
+        } catch (Exception e) {
+            criteriaError = e;    
+        }
+        try {
+            Query nq = em.createQuery(jpql);
+            setParameters(nq, p);
+            jpqlResult = nq.getResultList();
+        } catch (Exception e) {
+            jpqlError = e;
+        }
+        
+        if (criteriaError == null && jpqlError == null) {
+            assertEquals(criteriaResult.size(), jpqlResult.size());
+        } else if (criteriaError != null && jpqlError == null) {
+            fail("QueryDefinition generated invalid JPQL\r\n" 
+                + "Criteria [" + qb.toJPQL(q) + "]\r\n"
+                + "error : " + criteriaError.getMessage());
+        } else if (criteriaError == null && jpqlError != null) {
+            fail("Handcrafted JPQL is invalid \r\n" 
+                    + "JPQL [" + jpql + "]\r\n"
+                    + "error : " + jpqlError.getMessage());
+        } else {
+            compareLiterally(jpql, q);
+        }
+    }
+    
    void setParameters(Query q, Object...p) {
+        if (p == null)
+            return;
+        for (int i = 0; i < p.length; i += 2) {
+            q.setParameter(p[i].toString(), p[i+1]);
+        }
     } 
 }

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=779361&r1=779360&r2=779361&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 Thu May 28 00:22:33 2009
@@ -153,8 +153,9 @@
     
     @AllowFailure
     public void testFetchJoins() {
-        String jpql = "SELECT d FROM Department LEFT JOIN FETCH d.employees " + 
-            "WHERE d.deptNo = 1";
+        String jpql =
+            "SELECT d FROM Department LEFT JOIN FETCH d.employees "
+                + "WHERE d.deptNo = 1";
         CriteriaQuery q = cb.create();
         Root<Department> d = q.from(Department.class);
         d.fetch(department_.getSet("employees", Employee.class), JoinType.LEFT);
@@ -174,11 +175,11 @@
         Join<Contact, Phone> phone = emp.join(
             employee_.getAttribute("contactInfo", Contact.class)).
             join(contact_.getList("phones", Phone.class));
-        q.where(cb.equal(emp.get(employee_.getAttribute("contactInfo", 
-            Contact.class)).
-            get(contact_.getAttribute("address", Address.class)).
-            get(address_.getAttribute("zipCode", String.class)), "95054"));    
-        q.select(phone.get(phone_.getAttribute("vendor", String.class)));        
+        q.where(cb.equal(emp.get(
+            employee_.getAttribute("contactInfo", Contact.class)).get(
+            contact_.getAttribute("address", Address.class)).get(
+            address_.getAttribute("zipCode", String.class)), "95054"));
+        q.select(phone.get(phone_.getAttribute("vendor", String.class)));
         
         assertEquivalence(q, jpql);
         
@@ -217,7 +218,7 @@
         jpql = "SELECT o FROM Order o WHERE o.lineItems IS EMPTY";
         q = cb.create();
         Root<Order> order = q.from(Order.class);
-        Join<Order,LineItem> lineItems = order.join(order_.getList("lineItems", 
+        Join<Order,LineItem> lineItems = order.join(order_.getList("lineItems",
             LineItem.class));
         q.where(cb.isEmpty(lineItems));
         q.select(order);
@@ -348,9 +349,10 @@
     
     @AllowFailure
     public void testSelectList() {
-        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.create();
         Root<VideoStore> v = q.from(VideoStore.class);
         MapJoin<VideoStore, Movie, Integer> inv = v.join(videoStore_.getMap(
@@ -370,8 +372,9 @@
             "Customer c JOIN c.orders o WHERE o.quantity > 100";
         q = cb.create();
         Root<Customer> c = q.from(Customer.class);
-        Join<Customer, Order> o = c.join(customer_.getSet("orders", Order.class));
-        q.where(cb.gt(o.get(order_.getAttribute("quantity", Integer.class)), 
+        Join<Customer, Order> o =
+            c.join(customer_.getSet("orders", Order.class));
+        q.where(cb.gt(o.get(order_.getAttribute("quantity", Integer.class)),
             100));
         q.select(cb.select(CustomerDetails.class, 
             c.get(customer_.getAttribute("id", Integer.class)),
@@ -413,8 +416,10 @@
         
         assertEquivalence(q, jpql);
         
-        jpql = "SELECT emp FROM Employee emp WHERE emp.salary > ALL (" + 
-            "SELECT m.salary FROM Manager m WHERE m.department = emp.department)";
+        jpql =
+            "SELECT emp FROM Employee emp WHERE emp.salary > ALL ("
+                + "SELECT m.salary FROM Manager m WHERE m.department ="
+                + " emp.department)";
         q = cb.create();
         Root<Employee> emp1 = q.from(Employee.class);
         q.select(emp1);
@@ -495,7 +500,7 @@
     @AllowFailure
     public void testOrdering() {
         String jpql = "SELECT o FROM Customer c JOIN c.orders o "  
-            + "JOIN c.address a WHERE a.state = 'CA' ORDER BY o.quantity DESC, " 
+            + "JOIN c.address a WHERE a.state = 'CA' ORDER BY o.quantity DESC, "
             + "o.totalCost";
         CriteriaQuery q = cb.create();
         Root<Customer> c = q.from(Customer.class);