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)