From 528e53b4f7486ecea06e2378d10c927c71756a82 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Wed, 15 Dec 2021 17:14:18 +0100 Subject: [PATCH] [jOOQ/jOOQ#12742] ListAgg not working with filter clause This includes: - [jOOQ/jOOQ#8543] Support FILTER for GROUP_CONCAT --- .../org/jooq/impl/AbstractAggregateFunction.java | 6 +++++- jOOQ/src/main/java/org/jooq/impl/F.java | 5 +++++ jOOQ/src/main/java/org/jooq/impl/GroupConcat.java | 3 +++ jOOQ/src/main/java/org/jooq/impl/ListAgg.java | 8 ++++++++ .../org/jooq/impl/QueryPartCollectionView.java | 15 ++++++++++----- .../main/java/org/jooq/impl/QueryPartList.java | 5 +++++ .../java/org/jooq/impl/QueryPartListView.java | 5 +++++ 7 files changed, 41 insertions(+), 6 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractAggregateFunction.java b/jOOQ/src/main/java/org/jooq/impl/AbstractAggregateFunction.java index 9b72abe223..5a9fce583a 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractAggregateFunction.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractAggregateFunction.java @@ -283,7 +283,11 @@ implements else - ctx.visit(wrap(args).map(arg -> DSL.when(filter, arg == ASTERISK ? one() : arg)).map(fun)); + ctx.visit(wrap(args).map((arg, i) -> applyFilter(arg, i) ? DSL.when(filter, arg == ASTERISK ? one() : arg) : arg).map(fun)); + } + + boolean applyFilter(Field arg, int i) { + return true; } diff --git a/jOOQ/src/main/java/org/jooq/impl/F.java b/jOOQ/src/main/java/org/jooq/impl/F.java index ecfc5b66bb..09ef0497d3 100644 --- a/jOOQ/src/main/java/org/jooq/impl/F.java +++ b/jOOQ/src/main/java/org/jooq/impl/F.java @@ -37,6 +37,7 @@ */ package org.jooq.impl; +import java.util.Objects; import java.util.function.BiFunction; import java.util.function.BiPredicate; import java.util.function.Consumer; @@ -142,6 +143,10 @@ interface BooleanConsumer { @FunctionalInterface interface ObjIntFunction { R apply(T t, int i); + + default ObjIntFunction andThen(ObjIntFunction after) { + return (t, i) -> after.apply(apply(t, i), i); + } } /** diff --git a/jOOQ/src/main/java/org/jooq/impl/GroupConcat.java b/jOOQ/src/main/java/org/jooq/impl/GroupConcat.java index b84adff67d..aaadb44d36 100644 --- a/jOOQ/src/main/java/org/jooq/impl/GroupConcat.java +++ b/jOOQ/src/main/java/org/jooq/impl/GroupConcat.java @@ -85,6 +85,9 @@ implements else result = new ListAgg(distinct, field, inline(separator)); + if (filter != null) + result.filterWhere(filter); + diff --git a/jOOQ/src/main/java/org/jooq/impl/ListAgg.java b/jOOQ/src/main/java/org/jooq/impl/ListAgg.java index 4a3c78fbd6..3115242c41 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ListAgg.java +++ b/jOOQ/src/main/java/org/jooq/impl/ListAgg.java @@ -155,6 +155,11 @@ final class ListAgg extends AbstractAggregateFunction implements UNotYet super.acceptFunctionName(ctx); } + @Override + boolean applyFilter(Field arg, int i) { + return i == 0; + } + /** * [#1273] LIST_AGG emulation for MySQL */ @@ -171,6 +176,9 @@ final class ListAgg extends AbstractAggregateFunction implements UNotYet .visit(arguments.get(1)); ctx.sql(')'); + + acceptFilterClause(ctx); + acceptOverClause(ctx); } /** diff --git a/jOOQ/src/main/java/org/jooq/impl/QueryPartCollectionView.java b/jOOQ/src/main/java/org/jooq/impl/QueryPartCollectionView.java index 3c8613b48d..4ac49ac018 100644 --- a/jOOQ/src/main/java/org/jooq/impl/QueryPartCollectionView.java +++ b/jOOQ/src/main/java/org/jooq/impl/QueryPartCollectionView.java @@ -70,10 +70,10 @@ import org.jooq.impl.QOM.MCollection; */ class QueryPartCollectionView extends AbstractQueryPart implements MCollection, SimpleQueryPart, SeparatedQueryPart { - final Collection wrapped; - Boolean qualify; - String separator; - Function mapper; + final Collection wrapped; + Boolean qualify; + String separator; + ObjIntFunction mapper; static final QueryPartCollectionView wrap(Collection wrapped) { return new QueryPartCollectionView<>(wrapped); @@ -97,6 +97,10 @@ class QueryPartCollectionView extends AbstractQueryPart imp } QueryPartCollectionView map(Function newMapper) { + return map((t, i) -> newMapper.apply(t)); + } + + QueryPartCollectionView map(ObjIntFunction newMapper) { this.mapper = mapper == null ? newMapper : mapper.andThen(newMapper); return this; } @@ -169,11 +173,12 @@ class QueryPartCollectionView extends AbstractQueryPart imp for (T part : this) { try { + int j0 = j; if (!rendersContent.get(j++)) continue; if (mapper != null) - part = mapper.apply(part); + part = mapper.apply(part, j0); if (k++ > 0) { diff --git a/jOOQ/src/main/java/org/jooq/impl/QueryPartList.java b/jOOQ/src/main/java/org/jooq/impl/QueryPartList.java index 6dc768dc09..efcd2b126a 100644 --- a/jOOQ/src/main/java/org/jooq/impl/QueryPartList.java +++ b/jOOQ/src/main/java/org/jooq/impl/QueryPartList.java @@ -76,6 +76,11 @@ class QueryPartList extends QueryPartListView { return (QueryPartList) super.map(newMapper); } + @Override + QueryPartList map(ObjIntFunction newMapper) { + return (QueryPartList) super.map(newMapper); + } + @Override QueryPartList separator(String newSeparator) { return (QueryPartList) super.separator(newSeparator); diff --git a/jOOQ/src/main/java/org/jooq/impl/QueryPartListView.java b/jOOQ/src/main/java/org/jooq/impl/QueryPartListView.java index bcb71e6c73..366fc0e79f 100644 --- a/jOOQ/src/main/java/org/jooq/impl/QueryPartListView.java +++ b/jOOQ/src/main/java/org/jooq/impl/QueryPartListView.java @@ -85,6 +85,11 @@ class QueryPartListView extends QueryPartCollectionView return (QueryPartListView) super.map(newMapper); } + @Override + QueryPartListView map(ObjIntFunction newMapper) { + return (QueryPartListView) super.map(newMapper); + } + @Override QueryPartListView separator(String newSeparator) { return (QueryPartListView) super.separator(newSeparator);