> Thanks for the quick reply. I tried #1 but both constructors of > ASTAggregateFunctionCall are package private.
Oh well. Indeed, we need a better abstraction there. > Option #2 I tried using the alias in the count to check in the > SQLTreeProcessor when to change it to another function, i.e. > > property.count().alias("__ARRAY_AGG__"); Ah, a nice shortcut. I was thinking more along the lines of "someProperty.function("array_agg", List.class)", and then generating your own logic for the GROUP BY clause, which is more involved, but also more reliable. Andrus > On Jan 5, 2024, at 4:18 AM, Mark Stobbe <markstobb...@gmail.com> wrote: > > Hi Andrus, > > Thanks for the quick reply. I tried #1 but both constructors of > ASTAggregateFunctionCall are package private. > Option #2 I tried using the alias in the count to check in the > SQLTreeProcessor when to change it to another function, i.e. > > property.count().alias("__ARRAY_AGG__"); > > ... > > protected Optional<Node> onFunctionNode(Node parent, FunctionNode child, int > index) > { > if ("__ARRAY_AGG__".equals(child.getAlias())) > { > return Optional.of(new FunctionNode("ARRAY_AGG", null)); > } > > return Optional.empty(); > } > > Problem here is that the return type doesn't match with the count causing: > > Caused by: org.postgresql.util.PSQLException: Bad value for type long : > {123,456} > at org.postgresql.jdbc.PgResultSet.toLong(PgResultSet.java:3233) > at org.postgresql.jdbc.PgResultSet.getLong(PgResultSet.java:2449) > at > io.agroal.pool.wrapper.ResultSetWrapper.getLong(ResultSetWrapper.java:158) > at > org.apache.cayenne.access.types.LongType.materializeObject(LongType.java:37) > at > org.apache.cayenne.access.types.LongType.materializeObject(LongType.java:28) > at > org.apache.cayenne.access.jdbc.reader.ScalarRowReader.readRow(ScalarRowReader.java:50) > at > org.apache.cayenne.access.jdbc.reader.CompoundRowReader.readRow(CompoundRowReader.java:47) > at > org.apache.cayenne.access.jdbc.reader.CompoundRowReader.readRow(CompoundRowReader.java:28) > at > org.apache.cayenne.access.jdbc.JDBCResultIterator.nextRow(JDBCResultIterator.java:104) > at > org.apache.cayenne.access.jdbc.LimitResultIterator.nextRow(LimitResultIterator.java:115) > at > org.apache.cayenne.access.jdbc.LimitResultIterator.allRows(LimitResultIterator.java:95) > at > org.apache.cayenne.access.jdbc.SelectAction.performAction(SelectAction.java:139) > at > org.apache.cayenne.access.DataNodeQueryAction.runQuery(DataNodeQueryAction.java:97) > at org.apache.cayenne.access.DataNode.performQueries(DataNode.java:273) > > Best regards, > Mark > > On Thu, Jan 4, 2024 at 5:57 PM Andrus Adamchik <aadamc...@gmail.com> wrote: > >> Hi Marc, >> >> Upgrading to 4.2 final is probably a good idea regardless of the >> aggregation function use :) >> >> Regarding your question. There are a few ways to approach it (and I wish >> we could abstract it a bit better) : >> >> 1. Instead of someProperty.function(..), try to create a subclass of >> ASTAggregateFunctionCall. E.g. you can follow an expample of ASTMin. >> 2. You can customize the generated SQL via a custom SQLTreeProcessor >> (something that was mentioned a few months ago in a different context) >> >> I am really curious if #1 works, and if it doesn't, be happy to provide >> pointers on #2. >> >> Thanks, >> Andrus >> >> >>> On Jan 4, 2024, at 10:12 AM, Mark Stobbe <markstobb...@gmail.com> wrote: >>> >>> Hi all, >>> >>> Does anyone know how to use "array_agg" as a function? I am using Cayenne >>> 4.2.M3, but it's ok if I need to upgrade to a later version. >>> >>> I was trying with someProperty.function("array_agg", List.class) >>> but it will not automatically group by all the other fields since it >>> doesn't recognise it as a ASTAggregateFunctionCall >>> >>> Mark >> >>