From 7bdc75bb6493ac3bed56419b9fa1224b99db1f41 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Mon, 13 Jan 2014 12:04:57 +0100 Subject: [PATCH] [#2944] Add support for GROUP_CONCAT in SQLite --- .../AggregateWindowFunctionTests.java | 59 ++++++++++++++----- .../org/jooq/GroupConcatSeparatorStep.java | 3 +- jOOQ/src/main/java/org/jooq/impl/DSL.java | 34 ++++++++++- jOOQ/src/main/java/org/jooq/impl/Term.java | 1 + 4 files changed, 79 insertions(+), 18 deletions(-) diff --git a/jOOQ-test/src/org/jooq/test/_/testcases/AggregateWindowFunctionTests.java b/jOOQ-test/src/org/jooq/test/_/testcases/AggregateWindowFunctionTests.java index 5a40e20494..09200ee813 100644 --- a/jOOQ-test/src/org/jooq/test/_/testcases/AggregateWindowFunctionTests.java +++ b/jOOQ-test/src/org/jooq/test/_/testcases/AggregateWindowFunctionTests.java @@ -955,12 +955,39 @@ extends BaseTest result1 = create().select( + TAuthor_FIRST_NAME(), + TAuthor_LAST_NAME(), + groupConcat(TBook_ID(), ", ") + .as("books")) + .from(TAuthor()) + .join(TBook()).on(TAuthor_ID().equal(TBook_AUTHOR_ID())) + .groupBy( + TAuthor_ID(), + TAuthor_FIRST_NAME(), + TAuthor_LAST_NAME()) + .orderBy(TAuthor_ID()) + .fetch(); + + assertEquals(2, result1.size()); + assertEquals(AUTHOR_FIRST_NAMES, result1.getValues(TAuthor_FIRST_NAME())); + assertEquals(AUTHOR_LAST_NAMES, result1.getValues(TAuthor_LAST_NAME())); + + // [#2944] SQLite cannot guarantee any order among aggregated values... + assertTrue(asList("1, 2", "2, 1").contains(result1.getValue(0, "books"))); + assertTrue(asList("3, 4", "4, 3").contains(result1.getValue(1, "books"))); + + switch (dialect().family()) { + case SQLITE: + log.info("SKIPPING", "LISTAGG ordered tests"); + return; + } + + Result result2 = create().select( TAuthor_FIRST_NAME(), TAuthor_LAST_NAME(), listAgg(TBook_ID(), ", ") @@ -979,13 +1006,13 @@ extends BaseTest result2 = create().select( + Result result3 = create().select( TAuthor_FIRST_NAME(), TAuthor_LAST_NAME(), listAgg(TBook_TITLE()) @@ -1013,13 +1040,13 @@ extends BaseTest { /** * Specify the separator on the GROUP_CONCAT function */ - @Support({ CUBRID, H2, HSQLDB, MARIADB, MYSQL, POSTGRES }) + @Support({ CUBRID, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE }) @Transition( name = "SEPARATOR", args = "String" diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index 817328039d..3bb12355eb 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -10586,6 +10586,7 @@ public class DSL { *
  • {@link SQLDialect#H2}
  • *
  • {@link SQLDialect#HSQLDB}
  • *
  • {@link SQLDialect#MYSQL}
  • + *
  • {@link SQLDialect#SQLITE} (but without ORDER BY)
  • * *

    * It is simulated by the following dialects: @@ -10598,7 +10599,7 @@ public class DSL { * * @see #listAgg(Field) */ - @Support({ CUBRID, H2, HSQLDB, MARIADB, MYSQL, POSTGRES }) + @Support({ CUBRID, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE }) @Transition( name = "GROUP_CONCAT", args = "Field" @@ -10607,6 +10608,37 @@ public class DSL { return new GroupConcat(nullSafe(field)); } + /** + * Get the aggregated concatenation for a field. + *

    + * This is natively supported by + *

      + *
    • {@link SQLDialect#CUBRID}
    • + *
    • {@link SQLDialect#H2}
    • + *
    • {@link SQLDialect#HSQLDB}
    • + *
    • {@link SQLDialect#MYSQL}
    • + *
    • {@link SQLDialect#SQLITE}
    • + *
    + *

    + * It is simulated by the following dialects: + *

      + *
    • {@link SQLDialect#DB2}: Using XMLAGG()
    • + *
    • {@link SQLDialect#ORACLE}: Using LISTAGG()
    • + *
    • {@link SQLDialect#POSTGRES}: Using STRING_AGG()
    • + *
    • {@link SQLDialect#SYBASE}: Using LIST()
    • + *
    + * + * @see #listAgg(Field) + */ + @Support({ CUBRID, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE }) + @Transition( + name = "GROUP_CONCAT", + args = "Field+" + ) + public static AggregateFunction groupConcat(Field field, String separator) { + return new GroupConcat(nullSafe(field)).separator(separator); + } + /** * Get the aggregated concatenation for a field. *

    diff --git a/jOOQ/src/main/java/org/jooq/impl/Term.java b/jOOQ/src/main/java/org/jooq/impl/Term.java index 7f609cb0a8..f1049457e7 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Term.java +++ b/jOOQ/src/main/java/org/jooq/impl/Term.java @@ -135,6 +135,7 @@ enum Term { case HSQLDB: case MARIADB: case MYSQL: + case SQLITE: return "group_concat"; case POSTGRES: