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 <[email protected]>
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)