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/06/24 13:06:56 UTC

svn commit: r550207 [2/2] - in /cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src: main/java/org/apache/cayenne/access/jdbc/ main/java/org/apache/cayenne/ejbql/ main/java/org/apache/cayenne/ejbql/parser/ main/java/org/apache/cayenne/query/ ma...

Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/EJBQLUpdate.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/EJBQLUpdate.java?view=diff&rev=550207&r1=550206&r2=550207
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/EJBQLUpdate.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/EJBQLUpdate.java Sun Jun 24 04:06:54 2007
@@ -31,11 +31,6 @@
     }
 
     protected boolean visitNode(EJBQLExpressionVisitor visitor) {
-        return visitor.visitUpdate(this, -1);
-    }
-
-    protected boolean visitChild(EJBQLExpressionVisitor visitor, int childIndex) {
-        return super.visitChild(visitor, childIndex)
-                && visitor.visitUpdate(this, childIndex);
+        return visitor.visitUpdate(this);
     }
 }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/EJBQLWhere.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/EJBQLWhere.java?view=diff&rev=550207&r1=550206&r2=550207
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/EJBQLWhere.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/EJBQLWhere.java Sun Jun 24 04:06:54 2007
@@ -31,11 +31,6 @@
     }
 
     protected boolean visitNode(EJBQLExpressionVisitor visitor) {
-        return visitor.visitWhere(this, -1);
-    }
-
-    protected boolean visitChild(EJBQLExpressionVisitor visitor, int childIndex) {
-        return super.visitChild(visitor, childIndex)
-                && visitor.visitWhere(this, childIndex);
+        return visitor.visitWhere(this);
     }
 }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/SimpleNode.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/SimpleNode.java?view=diff&rev=550207&r1=550206&r2=550207
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/SimpleNode.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/SimpleNode.java Sun Jun 24 04:06:54 2007
@@ -46,7 +46,7 @@
     public String getText() {
         return text;
     }
-    
+
     public boolean isNegated() {
         return not;
     }
@@ -55,24 +55,21 @@
      * A recursive visit method that passes a visitor to this node and all its children,
      * depth first.
      */
-    public boolean visit(EJBQLExpressionVisitor visitor) {
+    public void visit(EJBQLExpressionVisitor visitor) {
 
-        if (!visitNode(visitor)) {
-            return false;
-        }
+        if (visitNode(visitor)) {
 
-        int len = getChildrenCount();
-        for (int i = 0; i < len; i++) {
-            if (!visitChild(visitor, i)) {
-                return false;
+            int len = getChildrenCount();
+            for (int i = 0; i < len; i++) {
+                if (!visitChild(visitor, i)) {
+                    break;
+                }
             }
         }
-
-        return true;
     }
 
     /**
-     * Visits this not without recursion. Default implementation simply returns true.
+     * Visits this node without recursion. Default implementation simply returns true.
      * Subclasses override this method to call an appropriate visitor method.
      */
     protected boolean visitNode(EJBQLExpressionVisitor visitor) {
@@ -84,7 +81,8 @@
      * if they desire to implement callbacks after visiting each child.
      */
     protected boolean visitChild(EJBQLExpressionVisitor visitor, int childIndex) {
-        return children[childIndex].visit(visitor);
+        children[childIndex].visit(visitor);
+        return true;
     }
 
     public EJBQLExpression getChild(int index) {

Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/query/EJBQLQueryMetadata.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/query/EJBQLQueryMetadata.java?view=diff&rev=550207&r1=550206&r2=550207
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/query/EJBQLQueryMetadata.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/query/EJBQLQueryMetadata.java Sun Jun 24 04:06:54 2007
@@ -18,6 +18,7 @@
  ****************************************************************/
 package org.apache.cayenne.query;
 
+import org.apache.cayenne.ejbql.EJBQLCompiledExpression;
 import org.apache.cayenne.map.EntityResolver;
 import org.apache.cayenne.map.ObjEntity;
 
@@ -29,8 +30,21 @@
  */
 class EJBQLQueryMetadata extends BaseQueryMetadata {
 
+    private SQLResultSetMapping resultSetMapping;
+
+    void setResultSetMapping(SQLResultSetMapping resultSetMapping) {
+        this.resultSetMapping = resultSetMapping;
+    }
+
+    public SQLResultSetMapping getResultSetMapping() {
+        return resultSetMapping;
+    }
+
     boolean resolve(EntityResolver resolver, EJBQLQuery query) {
-        ObjEntity root = query.getExpression(resolver).getRootDescriptor().getEntity();
+        EJBQLCompiledExpression expression = query.getExpression(resolver);
+        setResultSetMapping(expression.getResultSetMapping());
+        
+        ObjEntity root = expression.getRootDescriptor().getEntity();
 
         // TODO: andrus, 4/3/2007 - generate cache key based on EJBQL statement
         return super.resolve(root, resolver, null);

Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/query/SQLResultSetMapping.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/query/SQLResultSetMapping.java?view=diff&rev=550207&r1=550206&r2=550207
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/query/SQLResultSetMapping.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/query/SQLResultSetMapping.java Sun Jun 24 04:06:54 2007
@@ -19,8 +19,8 @@
 package org.apache.cayenne.query;
 
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.Collections;
+import java.util.List;
 
 /**
  * A metadata object that defines how a DataRow can be converted to result objects. This
@@ -35,7 +35,7 @@
 public class SQLResultSetMapping {
 
     protected String name;
-    protected Collection columnResults;
+    protected List columnResults;
 
     public SQLResultSetMapping() {
 
@@ -56,7 +56,7 @@
     /**
      * Returns a collection of mapped columns.
      */
-    public Collection getColumnResults() {
+    public List getColumnResults() {
         return columnResults != null ? columnResults : Collections.EMPTY_LIST;
     }
 

Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/jjtree/org/apache/cayenne/ejbql/EJBQLParser.jjt
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/jjtree/org/apache/cayenne/ejbql/EJBQLParser.jjt?view=diff&rev=550207&r1=550206&r2=550207
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/jjtree/org/apache/cayenne/ejbql/EJBQLParser.jjt (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/jjtree/org/apache/cayenne/ejbql/EJBQLParser.jjt Sun Jun 24 04:06:54 2007
@@ -532,7 +532,7 @@
 }
 
 
-void distinct_path() #DistinctPath : { }
+void distinct_path() #Distinct : { }
 {
 	<DISTINCT> (LOOKAHEAD(path()) path() | identification_variable())
 }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/DataContextEJBQLQueryTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/DataContextEJBQLQueryTest.java?view=diff&rev=550207&r1=550206&r2=550207
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/DataContextEJBQLQueryTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/DataContextEJBQLQueryTest.java Sun Jun 24 04:06:54 2007
@@ -42,6 +42,74 @@
         deleteTestData();
     }
 
+    public void testSelectAggregate() throws Exception {
+        createTestData("prepare");
+
+        String ejbql = "select count(p), count(distinct p.estimatedPrice), max(p.estimatedPrice), sum(p.estimatedPrice) from Painting p";
+        EJBQLQuery query = new EJBQLQuery(ejbql);
+
+        List data = createDataContext().performQuery(query);
+        assertEquals(1, data.size());
+        assertTrue(data.get(0) instanceof Object[]);
+        Object[] aggregates = (Object[]) data.get(0);
+        assertEquals(new Long(2), aggregates[0]);
+        assertEquals(new Long(2), aggregates[1]);
+        assertEquals(new BigDecimal(5000d), aggregates[2]);
+        assertEquals(new BigDecimal(8000d), aggregates[3]);
+    }
+
+    public void testSelectAggregateNull() throws Exception {
+
+        String ejbql = "select count(p), max(p.estimatedPrice), sum(p.estimatedPrice) "
+                + "from Painting p WHERE p.paintingTitle = 'X'";
+        EJBQLQuery query = new EJBQLQuery(ejbql);
+
+        List data = createDataContext().performQuery(query);
+        assertEquals(1, data.size());
+        assertTrue(data.get(0) instanceof Object[]);
+        Object[] aggregates = (Object[]) data.get(0);
+        assertEquals(new Long(0), aggregates[0]);
+        assertEquals(null, aggregates[1]);
+        assertEquals(null, aggregates[2]);
+    }
+
+    public void testSelectEntityPathsScalarResult() throws Exception {
+        createTestData("prepare");
+
+        String ejbql = "select p.paintingTitle"
+                + " from Painting p order by p.paintingTitle DESC";
+        EJBQLQuery query = new EJBQLQuery(ejbql);
+
+        List data = createDataContext().performQuery(query);
+        assertEquals(2, data.size());
+
+        assertEquals("P2", data.get(0));
+        assertEquals("P1", data.get(1));
+    }
+
+    public void testSelectEntityPathsArrayResult() throws Exception {
+        createTestData("prepare");
+
+        String ejbql = "select p.estimatedPrice, p.toArtist.artistName "
+                + "from Painting p order by p.estimatedPrice";
+        EJBQLQuery query = new EJBQLQuery(ejbql);
+
+        List data = createDataContext().performQuery(query);
+        assertEquals(2, data.size());
+
+        assertTrue(data.get(0) instanceof Object[]);
+        Object[] row0 = (Object[]) data.get(0);
+        assertEquals(2, row0.length);
+        assertEquals(new BigDecimal(3000d), row0[0]);
+        assertEquals("AA1", row0[1]);
+
+        assertTrue(data.get(1) instanceof Object[]);
+        Object[] row1 = (Object[]) data.get(1);
+        assertEquals(2, row1.length);
+        assertEquals(new BigDecimal(5000d), row1[0]);
+        assertEquals("AA2", row1[1]);
+    }
+
     public void testSimpleSelect() throws Exception {
         createTestData("prepare");
 

Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/jdbc/EJBQLSelectTranslatorTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/jdbc/EJBQLSelectTranslatorTest.java?view=diff&rev=550207&r1=550206&r2=550207
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/jdbc/EJBQLSelectTranslatorTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/jdbc/EJBQLSelectTranslatorTest.java Sun Jun 24 04:06:54 2007
@@ -54,6 +54,10 @@
         assertTrue(sql, sql.indexOf("t0.ARTIST_NAME") > 0);
         assertTrue(sql, sql.indexOf("t0.DATE_OF_BIRTH") > 0);
         assertTrue(sql, sql.endsWith(" FROM ARTIST AS t0${marker0}"));
+
+        StringBuffer fromMarker = (StringBuffer) query.getParameters().get("marker0");
+        assertNotNull(fromMarker);
+        assertEquals("", fromMarker.toString());
     }
 
     public void testSelectMultipleJoinsToTheSameTable() throws Exception {
@@ -63,13 +67,17 @@
         String sql = query.getDefaultTemplate();
 
         assertTrue(sql, sql.startsWith("SELECT "));
+
+        StringBuffer fromMarker = (StringBuffer) query.getParameters().get("marker0");
+        assertNotNull(fromMarker);
+        assertEquals("", fromMarker.toString());
+
         assertTrue(
                 sql,
                 sql.indexOf("INNER JOIN PAINTING AS t1 ON (t0.ARTIST_ID = t1.ARTIST_ID)") > 0);
         assertTrue(
                 sql,
                 sql.indexOf("INNER JOIN PAINTING AS t2 ON (t0.ARTIST_ID = t2.ARTIST_ID)") > 0);
-
     }
 
     public void testSelectDistinct() {
@@ -77,7 +85,6 @@
         String sql = query.getDefaultTemplate();
 
         assertTrue(sql, sql.startsWith("SELECT DISTINCT "));
-        assertTrue(sql, sql.endsWith(" FROM ARTIST AS t0${marker0}"));
     }
 
     public void testSelectFromWhereEqual() {
@@ -85,6 +92,12 @@
         String sql = query.getDefaultTemplate();
 
         assertTrue(sql, sql.startsWith("SELECT "));
+
+        StringBuffer fromMarker = (StringBuffer) query.getParameters().get("marker0");
+        assertNotNull(fromMarker);
+        String from = fromMarker.toString();
+        assertEquals("", from);
+
         assertTrue(sql, sql
                 .endsWith(" FROM ARTIST AS t0${marker0} WHERE t0.ARTIST_NAME ="
                         + " #bind('Dali' 'VARCHAR')"));
@@ -228,6 +241,36 @@
         assertTrue(sql, sql.startsWith("SELECT "));
         assertTrue(sql, sql
                 .endsWith("t0.ARTIST_NAME = #bind($id1) OR t0.ARTIST_NAME = #bind($id2)"));
+    }
+
+    public void testMax() {
+        SQLTemplate query = translateSelect("select max(p.estimatedPrice) from Painting p");
+        String sql = query.getDefaultTemplate();
+
+        assertTrue(sql, sql.startsWith("SELECT "
+                + "#result('MAX(t0.ESTIMATED_PRICE)' 'java.math.BigDecimal' 'sc0') "
+                + "FROM PAINTING AS t0"));
+    }
+
+    public void testDistinctSum() {
+        SQLTemplate query = translateSelect("select sum( distinct p.estimatedPrice) from Painting p");
+        String sql = query.getDefaultTemplate();
+
+        assertTrue(
+                sql,
+                sql
+                        .startsWith("SELECT "
+                                + "#result('SUM(DISTINCT t0.ESTIMATED_PRICE)' 'java.math.BigDecimal' 'sc0') "
+                                + "FROM PAINTING AS t0"));
+    }
+
+    public void testColumnPaths() {
+        SQLTemplate query = translateSelect("select p.estimatedPrice, p.toArtist.artistName from Painting p");
+        String sql = query.getDefaultTemplate();
+
+        assertTrue(sql, sql.startsWith("SELECT "
+                + "#result('t0.ESTIMATED_PRICE' 'java.math.BigDecimal' 'sc0'), "
+                + "#result('t1.ARTIST_NAME' 'java.lang.String' 'sc1') FROM"));
     }
 
     private int countDelimiters(String string, String delim, int fromIndex) {