From 33b383b0a3bdab9e9ef74ec444eeaa2116a860e7 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Wed, 20 Apr 2022 13:19:54 +0200 Subject: [PATCH] [jOOQ/jOOQ#1592] Added support for audit columns in embeddables - AuditProvider callbacks should receive GeneratorContext, not DataType - Added code generation tests (some still fail) - Added integration tests (still fail) - Flatten embeddables - in Tools::anyComputedOnClientStoredFields - in FieldMapsForInsert::keysFlattenedAndComputedOnClientStored This includes: - [jOOQ/jOOQ#9879] Retain aliasing of computed columns in projection --- .../java/org/jooq/impl/AuditGenerator.java | 4 ---- .../org/jooq/impl/DataChangeDeltaTable.java | 2 +- .../org/jooq/impl/DefaultAuditProvider.java | 2 ++ .../java/org/jooq/impl/FieldMapsForInsert.java | 2 ++ .../java/org/jooq/impl/SelectQueryImpl.java | 16 ++++++++++++++++ .../java/org/jooq/impl/TableFieldImpl.java | 2 ++ jOOQ/src/main/java/org/jooq/impl/Tools.java | 18 +++++++++++++----- 7 files changed, 36 insertions(+), 10 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/AuditGenerator.java b/jOOQ/src/main/java/org/jooq/impl/AuditGenerator.java index de25a32a45..6da8654455 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AuditGenerator.java +++ b/jOOQ/src/main/java/org/jooq/impl/AuditGenerator.java @@ -89,10 +89,6 @@ package org.jooq.impl; - - - - diff --git a/jOOQ/src/main/java/org/jooq/impl/DataChangeDeltaTable.java b/jOOQ/src/main/java/org/jooq/impl/DataChangeDeltaTable.java index 9d07e443e1..ec9a4003d9 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DataChangeDeltaTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/DataChangeDeltaTable.java @@ -163,7 +163,7 @@ implements // [#12925] Workaround for https://github.com/h2database/h2database/issues/3398 if (requiresWorkaroundFor12925(ctx)) - ctx.sql("/* [#12925] ").sql(UUID.randomUUID().toString()).sql(" */ "); + ctx.sql("/* [#12925] ").sql(UUID.randomUUID().toString()).sql(" */").formatSeparator(); ctx.visit(query) .sqlIndentEnd(')'); diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultAuditProvider.java b/jOOQ/src/main/java/org/jooq/impl/DefaultAuditProvider.java index 9fd03cbd74..676ad0d4e7 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultAuditProvider.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultAuditProvider.java @@ -109,6 +109,8 @@ package org.jooq.impl; + + diff --git a/jOOQ/src/main/java/org/jooq/impl/FieldMapsForInsert.java b/jOOQ/src/main/java/org/jooq/impl/FieldMapsForInsert.java index 724328509e..53893f58b8 100644 --- a/jOOQ/src/main/java/org/jooq/impl/FieldMapsForInsert.java +++ b/jOOQ/src/main/java/org/jooq/impl/FieldMapsForInsert.java @@ -38,6 +38,7 @@ package org.jooq.impl; import static java.lang.Boolean.TRUE; +import static java.util.Arrays.asList; import static java.util.Collections.emptySet; import static org.jooq.Clause.FIELD_ROW; import static org.jooq.Clause.INSERT_SELECT; @@ -56,6 +57,7 @@ import static org.jooq.impl.QueryPartCollectionView.wrap; import static org.jooq.impl.Tools.anyMatch; import static org.jooq.impl.Tools.filter; import static org.jooq.impl.Tools.flatten; +import static org.jooq.impl.Tools.flattenCollection; import static org.jooq.impl.Tools.flattenFieldOrRows; import static org.jooq.impl.Tools.lazy; import static org.jooq.impl.Tools.BooleanDataKey.DATA_EMULATE_BULK_INSERT_RETURNING; diff --git a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java index f27747815a..c63b463a6a 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java @@ -250,6 +250,7 @@ import org.jooq.Context; import org.jooq.DataType; import org.jooq.Field; import org.jooq.ForeignKey; +import org.jooq.GeneratorStatementType; import org.jooq.GroupField; import org.jooq.JSONEntry; import org.jooq.JSONObjectNullStep; @@ -3726,6 +3727,21 @@ final class SelectQueryImpl extends AbstractResultQuery imp + + + + + + + + + + + + + + + diff --git a/jOOQ/src/main/java/org/jooq/impl/TableFieldImpl.java b/jOOQ/src/main/java/org/jooq/impl/TableFieldImpl.java index 64e90fcd20..b7e8dee492 100644 --- a/jOOQ/src/main/java/org/jooq/impl/TableFieldImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/TableFieldImpl.java @@ -138,6 +138,8 @@ class TableFieldImpl extends AbstractField implements Ta + + diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java index b79caa7861..2ba93ea1d1 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Tools.java +++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java @@ -5960,7 +5960,7 @@ final class Tools { static final Row embeddedFieldsRow(Row row) { if (hasEmbeddedFields(row.fields())) - return row(map(flattenCollection(Arrays.asList(row.fields()), false, false), f -> f)); + return row(map(flattenCollection(Arrays.asList(row.fields())), f -> f)); else return row; } @@ -5973,7 +5973,7 @@ final class Tools { // [#8353] [#10522] [#10523] TODO: Factor out some of this logic and // reuse it for the emulation of UPDATE .. SET row = (SELECT ..) List> select = field.query.getSelect(); - List> result = collect(flattenCollection(select, false, false)); + List> result = collect(flattenCollection(select)); Name tableName = name("t"); Name[] fieldNames = fieldNames(result.size()); Table t = new AliasedSelect<>(field.query, true, true, fieldNames).as("t"); @@ -6100,14 +6100,22 @@ final class Tools { return () -> it2; } + /** + * Flatten out {@link EmbeddableTableField} elements contained in an + * ordinary iterable. + */ + static final Iterable> flattenCollection(Iterable> iterable) { + return flattenCollection(iterable, false, false); + } + /** * Flatten out {@link EmbeddableTableField} elements contained in an * ordinary iterable. */ static final Iterable> flattenCollection( - final Iterable> iterable, - final boolean removeDuplicates, - final boolean flattenRowFields + Iterable> iterable, + boolean removeDuplicates, + boolean flattenRowFields ) { // [#2530] [#6124] [#10481] TODO: Refactor and optimise these flattening algorithms return () -> new FlatteningIterator<>(iterable.iterator(), (e, duplicates) -> {