This is an automated email from the ASF dual-hosted git repository.

ntimofeev pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git


The following commit(s) were added to refs/heads/master by this push:
     new edf9a48e0 CAY-2810 Can't use custom operator expression with aggregate 
functions
edf9a48e0 is described below

commit edf9a48e08b831c4f3039146841eb665dc240f57
Author: Nikita Timofeev <stari...@gmail.com>
AuthorDate: Thu Jul 6 15:33:58 2023 +0300

    CAY-2810 Can't use custom operator expression with aggregate functions
---
 RELEASE-NOTES.txt                                  |  3 ++-
 .../access/sqlbuilder/sqltree/AliasedNode.java     | 31 ++++++++++++++++++++--
 .../cayenne/query/ObjectSelect_AggregateIT.java    | 15 +++++++++++
 3 files changed, 46 insertions(+), 3 deletions(-)

diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index 32d2feed8..a258b520a 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -58,4 +58,5 @@ CAY-2792 Fix Insertion Order For Reflexive DataObjects
 CAY-2800 Modeler saves map.xml files with schema ordering error
 CAY-2801 Incorrect equals() implementation in IdGenerationMarker could cause 
data missing in the commit
 CAY-2806 Incorrect processing of unicode escape syntax in JSON
-CAY-2809 Cayenne Expression grammar doesn't allow custom function as an 
argument for string functions
\ No newline at end of file
+CAY-2809 Cayenne Expression grammar doesn't allow custom function as an 
argument for string functions
+CAY-2810 Can't use custom operator expression with aggregate functions
\ No newline at end of file
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/AliasedNode.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/AliasedNode.java
index e6f0e65dc..f6cf638e9 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/AliasedNode.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/AliasedNode.java
@@ -19,6 +19,7 @@
 
 package org.apache.cayenne.access.sqlbuilder.sqltree;
 
+import org.apache.cayenne.access.sqlbuilder.NodeTreeVisitor;
 import org.apache.cayenne.access.sqlbuilder.QuotingAppendable;
 
 /**
@@ -39,17 +40,43 @@ public class AliasedNode extends Node {
 
     @Override
     public QuotingAppendable append(QuotingAppendable buffer) {
+        if(skipContent()) {
+            buffer.append(' ').append(alias);
+        }
         return buffer;
     }
 
+    @Override
+    public void visit(NodeTreeVisitor visitor) {
+        if(skipContent()) {
+            visitor.onNodeStart(this);
+            visitor.onNodeEnd(this);
+            return;
+        }
+        super.visit(visitor);
+    }
+
     @Override
     public void appendChildrenEnd(QuotingAppendable buffer) {
-        super.appendChildrenEnd(buffer);
-        buffer.append(' ').append(alias);
+        if(skipContent()){
+            return;
+        }
+        buffer.append(" AS ").append(alias);
     }
 
     public String getAlias() {
         return alias;
     }
 
+    private boolean skipContent() {
+        // check if parent is of type RESULT
+        Node parent = getParent();
+        while(parent != null) {
+            if(parent.getType() == NodeType.RESULT) {
+                return false;
+            }
+            parent = parent.getParent();
+        }
+        return true;
+    }
 }
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/query/ObjectSelect_AggregateIT.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/query/ObjectSelect_AggregateIT.java
index 6c0943d52..54a544496 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/query/ObjectSelect_AggregateIT.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/query/ObjectSelect_AggregateIT.java
@@ -161,6 +161,21 @@ public class ObjectSelect_AggregateIT extends ServerCase {
         assertEquals(date, count.get(1)[1]);
     }
 
+    @Test
+    public void testGroupByOp() throws Exception {
+        List<Object[]> count = ObjectSelect.query(Artist.class)
+                .columns(
+                        Artist.ARTIST_NAME.count(),
+                        Artist.DATE_OF_BIRTH.dayOfMonth().add(1).alias("op")
+                )
+                .orderBy(Artist.DATE_OF_BIRTH.asc())
+                .select(context);
+        assertEquals(5L, count.size());
+        assertEquals(4L, count.get(1)[0]);
+
+
+    }
+
     @Test
     public void testSelectRelationshipCount() throws Exception {
         long count = ObjectSelect.query(Artist.class)

Reply via email to