From 852da7839c18172af94affea278df976832355b5 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Mon, 22 Apr 2024 14:27:22 +0200 Subject: [PATCH] [jOOQ/jOOQ#16563] Support delimiter expressions in LISTAGG() and GROUP_CONCAT() --- .../org/jooq/GroupConcatSeparatorStep.java | 7 +++++ jOOQ/src/main/java/org/jooq/impl/DSL.java | 26 +++++++++++++++++-- .../main/java/org/jooq/impl/GroupConcat.java | 9 +++++-- jOOQ/src/main/java/org/jooq/impl/ListAgg.java | 8 +++++- .../main/java/org/jooq/impl/ParserImpl.java | 5 ++-- 5 files changed, 47 insertions(+), 8 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/GroupConcatSeparatorStep.java b/jOOQ/src/main/java/org/jooq/GroupConcatSeparatorStep.java index b2d3403d4f..7ac093ca38 100644 --- a/jOOQ/src/main/java/org/jooq/GroupConcatSeparatorStep.java +++ b/jOOQ/src/main/java/org/jooq/GroupConcatSeparatorStep.java @@ -78,4 +78,11 @@ public interface GroupConcatSeparatorStep extends AggregateFunction { @NotNull @Support({ CUBRID, DUCKDB, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO }) AggregateFunction separator(String separator); + + /** + * Specify the separator on the GROUP_CONCAT function. + */ + @NotNull + @Support({ CUBRID, DUCKDB, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE, TRINO }) + AggregateFunction separator(Field separator); } diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index e45304daa8..768ff3bcf3 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -31874,7 +31874,18 @@ public class DSL { @NotNull @Support({ CUBRID, DUCKDB, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, TRINO }) public static OrderedAggregateFunction listAgg(Field field, String separator) { - return new ListAgg(false, Tools.nullSafe(field), inline(separator)); + return listAgg(field, inline(separator)); + } + + /** + * Get the aggregated concatenation for a field. + * + * @see #groupConcat(Field) + */ + @NotNull + @Support({ CUBRID, DUCKDB, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, TRINO }) + public static OrderedAggregateFunction listAgg(Field field, Field separator) { + return new ListAgg(false, Tools.nullSafe(field), separator); } /** @@ -31896,7 +31907,18 @@ public class DSL { @NotNull @Support({ CUBRID, DUCKDB, H2, HSQLDB, MARIADB, MYSQL, POSTGRES }) public static OrderedAggregateFunction listAggDistinct(Field field, String separator) { - return new ListAgg(true, Tools.nullSafe(field), inline(separator)); + return listAggDistinct(field, inline(separator)); + } + + /** + * Get the aggregated concatenation for a field. + * + * @see #groupConcatDistinct(Field) + */ + @NotNull + @Support({ CUBRID, DUCKDB, H2, HSQLDB, MARIADB, MYSQL, POSTGRES }) + public static OrderedAggregateFunction listAggDistinct(Field field, Field separator) { + return new ListAgg(true, Tools.nullSafe(field), separator); } /** diff --git a/jOOQ/src/main/java/org/jooq/impl/GroupConcat.java b/jOOQ/src/main/java/org/jooq/impl/GroupConcat.java index f1c947b880..1ad224fd56 100644 --- a/jOOQ/src/main/java/org/jooq/impl/GroupConcat.java +++ b/jOOQ/src/main/java/org/jooq/impl/GroupConcat.java @@ -68,7 +68,7 @@ implements private final Field field; private final SortFieldList orderBy; - private String separator; + private Field separator; GroupConcat(Field field) { this(field, false); @@ -88,7 +88,7 @@ implements if (separator == null) result = new ListAgg(distinct, field, inline(",")); else - result = new ListAgg(distinct, field, inline(separator)); + result = new ListAgg(distinct, field, separator); if (!orderBy.isEmpty()) result.withinGroupOrderBy(orderBy); @@ -102,6 +102,11 @@ implements @Override public final AggregateFunction separator(String s) { + return separator(inline(s)); + } + + @Override + public final AggregateFunction separator(Field s) { this.separator = s; return this; } diff --git a/jOOQ/src/main/java/org/jooq/impl/ListAgg.java b/jOOQ/src/main/java/org/jooq/impl/ListAgg.java index b49fc06d65..7450d10b7d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ListAgg.java +++ b/jOOQ/src/main/java/org/jooq/impl/ListAgg.java @@ -93,7 +93,13 @@ import org.jooq.impl.QOM.UNotYetImplemented; /** * @author Lukas Eder */ -final class ListAgg extends AbstractAggregateFunction implements UNotYetImplemented { +final class ListAgg +extends + AbstractAggregateFunction +implements + UNotYetImplemented +{ + private static final Set SET_GROUP_CONCAT_MAX_LEN = SQLDialect.supportedBy(MARIADB, MYSQL); private static final Set SUPPORT_GROUP_CONCAT = SQLDialect.supportedBy(CUBRID, H2, HSQLDB, MARIADB, MYSQL, SQLITE); private static final Set SUPPORT_STRING_AGG = SQLDialect.supportedBy(DUCKDB, POSTGRES); diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java index c3a44a1b44..5787eff974 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java @@ -12235,7 +12235,7 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { s2 = s1; if (parseKeywordIf("SEPARATOR")) - s3 = s2.separator(parseStringLiteral()); + s3 = s2.separator((Field) parseField()); else s3 = s2; @@ -12517,7 +12517,6 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { } private final AggregateFilterStep parseOrderedSetFunctionIf() { - // TODO Listagg set function OrderedAggregateFunction orderedN; OrderedAggregateFunctionOfDeferredType ordered1; boolean optionalWithinGroup = false; @@ -12669,7 +12668,7 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { Field field = parseField(); if (parseIf(',')) - ordered = distinct ? listAggDistinct(field, parseStringLiteral()) : listAgg(field, parseStringLiteral()); + ordered = distinct ? listAggDistinct(field, (Field) parseField()) : listAgg(field, (Field) parseField()); else ordered = distinct ? listAggDistinct(field) : listAgg(field);