You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2007/08/04 19:46:33 UTC

svn commit: r562743 - in /cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src: main/java/org/apache/cayenne/access/jdbc/ test/java/org/apache/cayenne/access/

Author: aadamchik
Date: Sat Aug  4 10:46:32 2007
New Revision: 562743

URL: http://svn.apache.org/viewvc?view=rev&rev=562743
Log:
CAY-838 EJBQL GROUP BY and HAVING support

Modified:
    cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLAggregateColumnTranslator.java
    cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLConditionTranslator.java
    cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLSelectColumnsTranslator.java
    cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/DataContextEJBQLGroupByHavingTest.java

Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLAggregateColumnTranslator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLAggregateColumnTranslator.java?view=diff&rev=562743&r1=562742&r2=562743
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLAggregateColumnTranslator.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLAggregateColumnTranslator.java Sat Aug  4 10:46:32 2007
@@ -34,9 +34,11 @@
 
     private EJBQLTranslationContext context;
     private String attributeType;
+    private boolean resultColumns;
 
-    EJBQLAggregateColumnTranslator(EJBQLTranslationContext context) {
+    EJBQLAggregateColumnTranslator(EJBQLTranslationContext context, boolean resultColumns) {
         this.context = context;
+        this.resultColumns = resultColumns;
     }
 
     public boolean visitCount(EJBQLAggregateColumn expression) {
@@ -68,17 +70,27 @@
             EJBQLAggregateColumn column,
             EJBQLExpressionVisitor pathVisitor) {
 
-        context.append(" #result('").append(column.getFunction()).append('(');
+        if (resultColumns) {
+            context.append(" #result('");
+        }
+        else {
+            context.append(' ');
+        }
+
+        context.append(column.getFunction()).append('(');
 
         // path visitor must set attributeType ivar
         column.visit(pathVisitor);
+        context.append(')');
 
-        context
-                .append(")' '")
-                .append(column.getJavaType(attributeType))
-                .append("' '")
-                .append(context.nextColumnAlias())
-                .append("')");
+        if (resultColumns) {
+            context
+                    .append("' '")
+                    .append(column.getJavaType(attributeType))
+                    .append("' '")
+                    .append(context.nextColumnAlias())
+                    .append("')");
+        }
     }
 
     class FieldPathTranslator extends EJBQLPathTranslator {

Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLConditionTranslator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLConditionTranslator.java?view=diff&rev=562743&r1=562742&r2=562743
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLConditionTranslator.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLConditionTranslator.java Sat Aug  4 10:46:32 2007
@@ -52,6 +52,11 @@
         multiColumnOperands.add(operand);
     }
 
+    public boolean visitAggregate(EJBQLExpression expression) {
+        expression.visit(new EJBQLAggregateColumnTranslator(context, false));
+        return false;
+    }
+
     public boolean visitAnd(EJBQLExpression expression, int finishedChildIndex) {
         afterChild(expression, " AND", finishedChildIndex);
         return true;
@@ -299,7 +304,7 @@
         processParameter(parameter);
         return true;
     }
-    
+
     public boolean visitBooleanLiteral(EJBQLExpression expression) {
         if (expression.getText() == null) {
             context.append("null");
@@ -359,7 +364,7 @@
             // "X = NULL". The 'VARCHAR' parameter is totally bogus, but seems to work on
             // all tested DB's... Also note what JPA spec, chapter 4.11 says: "Comparison
             // or arithmetic operations with a NULL value always yield an unknown value."
-            
+
             // TODO: andrus 6/28/2007 Ideally we should track the type of the current
             // expression to provide a meaningful type.
             context.append(" #bind($").append(boundName).append(" 'VARCHAR')");

Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLSelectColumnsTranslator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLSelectColumnsTranslator.java?view=diff&rev=562743&r1=562742&r2=562743
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLSelectColumnsTranslator.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLSelectColumnsTranslator.java Sat Aug  4 10:46:32 2007
@@ -49,7 +49,7 @@
     }
 
     public boolean visitAggregate(EJBQLExpression expression) {
-        expression.visit(new EJBQLAggregateColumnTranslator(context));
+        expression.visit(new EJBQLAggregateColumnTranslator(context, true));
         return false;
     }
 

Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/DataContextEJBQLGroupByHavingTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/DataContextEJBQLGroupByHavingTest.java?view=diff&rev=562743&r1=562742&r2=562743
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/DataContextEJBQLGroupByHavingTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/DataContextEJBQLGroupByHavingTest.java Sat Aug  4 10:46:32 2007
@@ -124,12 +124,29 @@
                 + " HAVING count(p) > 2";
         EJBQLQuery query = new EJBQLQuery(ejbql);
 
-//        List data = createDataContext().performQuery(query);
-//        assertEquals(1, data.size());
-//        assertTrue(data.get(0) instanceof Object[]);
-//
-//        Object[] row0 = (Object[]) data.get(0);
-//        assertEquals(new BigDecimal(1), row0[0]);
-//        assertEquals(new Long(3), row0[1]);
+        List data = createDataContext().performQuery(query);
+        assertEquals(1, data.size());
+        assertTrue(data.get(0) instanceof Object[]);
+
+        Object[] row0 = (Object[]) data.get(0);
+        assertEquals(new BigDecimal(1), row0[0]);
+        assertEquals(new Long(3), row0[1]);
+    }
+
+    public void testGroupByHavingOnAggregateMultipleConditions() throws Exception {
+        createTestData("prepare");
+
+        String ejbql = "SELECT p.estimatedPrice, count(p) FROM Painting p"
+                + " GROUP BY p.estimatedPrice"
+                + " HAVING count(p) > 2 AND p.estimatedPrice < 10";
+        EJBQLQuery query = new EJBQLQuery(ejbql);
+
+        List data = createDataContext().performQuery(query);
+        assertEquals(1, data.size());
+        assertTrue(data.get(0) instanceof Object[]);
+
+        Object[] row0 = (Object[]) data.get(0);
+        assertEquals(new BigDecimal(1), row0[0]);
+        assertEquals(new Long(3), row0[1]);
     }
 }