2016-03-22 12 views
1

Postgresql 9.4.5 jOOQ 3.7.2 Dialekt auf POSTGRES_9_4jOOQ Aggregationsfunktionen in postgresql

Ich versuche jOOQ zu verwenden, um dieses nativen postgresql Aggregatausdruck zu wickeln ersetzen:

array_agg(row_to_json(foo) order by "foo"."name" asc) filter (where "attribute".name is not null)

der jOOQ DSL sieht aus wie es Arbeit mit diesem Code sein sollte:

arrayAgg(rowToJson(FOO)).orderBy(FOO.NAME).filterWhere(FOO.NAME.isNotNull()))

Wo rowToJson ein Wrapper für die Postgres-Funktion ist. Die SQL dies macht, ist dies:

array_agg(row_to_json(foo) order by "foo"."name" asc)

Derzeit um es dies mit arbeite ich:

public static <T> Field<T[]> arrayAgg(Field<T> field, final SortField<?> sort, final Condition filter) { 
    return field("array_agg({0} order by {1}) filter (where {2})", field.getDataType().getArrayDataType(), field, sort, filter); 
} 

Die Frage ist, ist der erste Code zu arbeiten, zu verstehen? Wenn nicht, was ist der richtige Weg, um diese Aggregatfunktion in jOOQ zu generieren?

Antwort

2

Dies ist ein Bug in jOOQ (#5158) und wird in den nächsten Versionen behoben werden.

Es gibt zwei Lösungen, die ich mir vorstellen kann:

  • Die Sie selbst vorgeschlagen haben: Mit Klar SQL die Funktionalität richtig neu zu implementieren.
  • Durch die Emulation FILTER mit CASE:

    arrayRemove(
        arrayAgg(when(FOO.NAME.isNotNull(), rowToJson(FOO))).orderBy(FOO.NAME)) 
        , null 
    ) 
    

    Siehe PostgresDSL.arrayRemove()