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/11/18 01:53:03 UTC

svn commit: r881638 - in /openjpa/trunk: openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypesafeCriteria.java openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java

Author: ppoddar
Date: Wed Nov 18 00:53:03 2009
New Revision: 881638

URL: http://svn.apache.org/viewvc?rev=881638&view=rev
Log:
OPENJPA-1392, OPENJPA-1393: countDistinct() and integer return type for size()

Modified:
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypesafeCriteria.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypesafeCriteria.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypesafeCriteria.java?rev=881638&r1=881637&r2=881638&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypesafeCriteria.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypesafeCriteria.java Wed Nov 18 00:53:03 2009
@@ -1403,6 +1403,30 @@
                 cb.nullLiteral(String.class)));
 
         Query q = em.createQuery(cquery);
-
+    }
+    
+    public void testCountDistinct() {
+        // JPQL Parser does not do well with the following 
+        String jpql = "select DISTINCT COUNT(a.name) from Account a";
+        
+        CriteriaQuery<Long> c = cb.createQuery(Long.class);
+        Root<Account> a = c.from(Account.class);
+        c.select(cb.countDistinct(a.get(Account_.name)));
+        
+        // hence we do not check equivalence against JPQL 
+        // assertEquivalence(c, jpql);
+        // but check against SQL
+        String expectedSQL = "SELECT COUNT(DISTINCT t0.name) FROM CR_ACCT t0";
+        executeAndCompareSQL(c, expectedSQL);
+    }
+    
+    public void testSizeReturnsInteger() {
+        String jpql = "select SIZE(c.accounts) from Customer c";
+        CriteriaQuery<Integer> c = cb.createQuery(Integer.class);
+        Root<Customer> customer = c.from(Customer.class);
+        c.select(cb.size(customer.get(Customer_.accounts)));
+        
+        assertEquivalence(c, jpql);
+        
     }
 }

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java?rev=881638&r1=881637&r2=881638&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java Wed Nov 18 00:53:03 2009
@@ -303,8 +303,8 @@
 
         @Override
         public Value toValue(ExpressionFactory factory, CriteriaQueryImpl<?> q) {
-            Value v = factory.count(Expressions.toValue(e, factory, q));
-            return _distinct ? factory.distinct(v) : v;
+            Value v = Expressions.toValue(e, factory, q);
+            return _distinct ? factory.count(factory.distinct(v)) : factory.count(v);
         }
         
         @Override
@@ -387,11 +387,14 @@
         @Override
         public Value toValue(ExpressionFactory factory, CriteriaQueryImpl<?> q) {
             Value val = Expressions.toValue(e, factory, q);
+            Value result;
             if (val instanceof Literal && ((Literal)val).getParseType() == Literal.TYPE_COLLECTION)
-                return factory.newLiteral(((Collection)((Literal)val).getValue()).size(), 
+                result = factory.newLiteral(((Collection)((Literal)val).getValue()).size(), 
                     Literal.TYPE_NUMBER);
-                
-            return factory.size(val);
+            else
+                result = factory.size(val);
+            result.setImplicitType(Integer.class);
+            return result;
         }
         
         public StringBuilder asValue(AliasContext q) {