Функции агрегации jOOQ в postgresql

Диалект Postgresql 9.4.5 jOOQ 3.7.2 установлен на POSTGRES_9_4

Я пытаюсь использовать jOOQ для замены этого собственного совокупного выражения postgresql:

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

jOOQ DSL выглядит так, как будто он должен работать, используя этот код:

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

Где rowToJson — это оболочка для функции postgres. SQL, который это отображает, таков:

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

В настоящее время я работаю над этим:

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);
}

Вопрос в том, должен ли работать первый код? Если нет, то как правильно создать эту агрегатную функцию в jOOQ?


person Brent Douglas    schedule 22.03.2016    source источник


Ответы (1)


Это ошибка в jOOQ (#5158), которая будет исправлена ​​в следующих выпусках.

Есть два обходных пути, о которых я могу думать:

  • Тот, который вы сами предложили: использование простого SQL для правильной повторной реализации функциональности.
  • Эмулируя FILTER с CASE:

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

    См. PostgresDSL.arrayRemove()

person Lukas Eder    schedule 23.03.2016