From 153762132fb582d3efe735a039a67d6055ae1505 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Tue, 19 Apr 2022 10:26:45 +0200 Subject: [PATCH] [jOOQ/jOOQ#9879] Added more generics to Generator and GeneratorContext In order to implement pure functions of type Generator, we must make the GeneratorContext::table available to Generator implementations, including the usual type safety that allows for binding to the generated table type, which gives access to columns. This prevents having to capture this from the Generator, which isn't too clean (though it's still possible for those people who don't care) --- jOOQ/src/main/java/org/jooq/DataType.java | 4 ++-- jOOQ/src/main/java/org/jooq/Generator.java | 2 +- jOOQ/src/main/java/org/jooq/GeneratorContext.java | 10 ++++++++-- .../main/java/org/jooq/impl/AbstractDataType.java | 11 ++++++----- .../main/java/org/jooq/impl/AbstractDataTypeX.java | 4 ++-- jOOQ/src/main/java/org/jooq/impl/AbstractTable.java | 2 +- jOOQ/src/main/java/org/jooq/impl/ArrayDataType.java | 4 ++-- .../src/main/java/org/jooq/impl/AuditGenerator.java | 2 ++ .../main/java/org/jooq/impl/ConvertedDataType.java | 6 +++--- jOOQ/src/main/java/org/jooq/impl/DataTypeProxy.java | 8 ++++---- .../main/java/org/jooq/impl/DefaultDataType.java | 10 +++++----- .../java/org/jooq/impl/DefaultGeneratorContext.java | 13 +++++++++++-- .../main/java/org/jooq/impl/FieldMapsForInsert.java | 6 ++++++ .../main/java/org/jooq/impl/MultisetDataType.java | 4 ++-- .../src/main/java/org/jooq/impl/RecordDataType.java | 4 ++-- 15 files changed, 57 insertions(+), 33 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/DataType.java b/jOOQ/src/main/java/org/jooq/DataType.java index 881d6694ce..5b648f0242 100644 --- a/jOOQ/src/main/java/org/jooq/DataType.java +++ b/jOOQ/src/main/java/org/jooq/DataType.java @@ -607,7 +607,7 @@ public interface DataType extends Named { * This feature is implemented in commercial distributions only. */ @NotNull - DataType generatedAlwaysAs(Generator generatedAlwaysAsValue); + DataType generatedAlwaysAs(Generator generatedAlwaysAsValue); /** * Get the computed column expression of this data type, if any. @@ -630,7 +630,7 @@ public interface DataType extends Named { * This feature is implemented in commercial distributions only. */ @Nullable - Generator generatedAlwaysAsGenerator(); + Generator generatedAlwaysAsGenerator(); /** * Set the {@link #generationOption()} of the computed column expression to diff --git a/jOOQ/src/main/java/org/jooq/Generator.java b/jOOQ/src/main/java/org/jooq/Generator.java index 793ed75357..f21bc22558 100644 --- a/jOOQ/src/main/java/org/jooq/Generator.java +++ b/jOOQ/src/main/java/org/jooq/Generator.java @@ -50,7 +50,7 @@ import java.util.function.Function; * @author Lukas Eder */ @FunctionalInterface -public interface Generator extends Function, Field>, Serializable { +public interface Generator, T> extends Function, Field>, Serializable { /** * Whether this generator supports a given statement type. diff --git a/jOOQ/src/main/java/org/jooq/GeneratorContext.java b/jOOQ/src/main/java/org/jooq/GeneratorContext.java index bbc39f49a2..0be9acecd4 100644 --- a/jOOQ/src/main/java/org/jooq/GeneratorContext.java +++ b/jOOQ/src/main/java/org/jooq/GeneratorContext.java @@ -37,7 +37,6 @@ */ package org.jooq; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** @@ -49,7 +48,14 @@ import org.jetbrains.annotations.Nullable; * * @author Lukas Eder */ -public interface GeneratorContext extends Scope { +public interface GeneratorContext, T> extends Scope { + + /** + * The target table whose contents are being generated, or null + * when the table is unknown / not applicable. + */ + @Nullable + X table(); /** * The target field whose contents are being generated, or null diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractDataType.java b/jOOQ/src/main/java/org/jooq/impl/AbstractDataType.java index 1bb563a8dd..511bece320 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractDataType.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractDataType.java @@ -103,6 +103,7 @@ import org.jooq.Result; import org.jooq.Row; import org.jooq.SQLDialect; import org.jooq.Schema; +import org.jooq.Table; import org.jooq.XML; import org.jooq.impl.QOM.GenerationLocation; import org.jooq.impl.QOM.GenerationOption; @@ -203,20 +204,20 @@ implements @Override public final DataType generatedAlwaysAs(Field generatedAlwaysAsValue) { - return generatedAlwaysAs(ctx -> generatedAlwaysAsValue); + return generatedAlwaysAs((Generator, T>) t -> generatedAlwaysAsValue); } @Override - public abstract DataType generatedAlwaysAs(Generator generatedAlwaysAsValue); + public abstract DataType generatedAlwaysAs(Generator generatedAlwaysAsValue); @Override public final Field generatedAlwaysAs() { - Generator s = generatedAlwaysAsGenerator(); - return s == null ? null : s.apply(new DefaultGeneratorContext(CONFIG, null, null)); + Generator s = generatedAlwaysAsGenerator(); + return s == null ? null : s.apply(new DefaultGeneratorContext(CONFIG, null, null, null)); } @Override - public abstract Generator generatedAlwaysAsGenerator(); + public abstract Generator generatedAlwaysAsGenerator(); @Override public final DataType stored() { diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractDataTypeX.java b/jOOQ/src/main/java/org/jooq/impl/AbstractDataTypeX.java index 6c3890b578..ddf810ebc0 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractDataTypeX.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractDataTypeX.java @@ -73,7 +73,7 @@ abstract class AbstractDataTypeX extends AbstractDataType { Integer newLength, Nullability newNullability, boolean newReadonly, - Generator newGeneratedAlwaysAs, + Generator newGeneratedAlwaysAs, GenerationOption newGenerationOption, GenerationLocation newGenerationLocation, Collation newCollation, @@ -124,7 +124,7 @@ abstract class AbstractDataTypeX extends AbstractDataType { private static final JooqLogger logGeneratedAlwaysAs = JooqLogger.getLogger(AbstractDataTypeX.class, "generateAlwaysAs", 1); @Override - public final DataType generatedAlwaysAs(Generator g) { + public final DataType generatedAlwaysAs(Generator g) { if (g != null && !CONFIG.commercial()) logGeneratedAlwaysAs.info("Computed columns", "Computed columns are a commercial only jOOQ feature. If you wish to profit from this feature, please upgrade to the jOOQ Professional Edition"); diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractTable.java b/jOOQ/src/main/java/org/jooq/impl/AbstractTable.java index 80e6bbedad..c10027a1a1 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractTable.java @@ -796,7 +796,7 @@ abstract class AbstractTable extends AbstractNamed implements * @param type The data type of the field */ @SuppressWarnings("unchecked") - protected static final TableField createField(Name name, DataType type, Table table, String comment, Converter converter, Binding binding, Generator generator) { + protected static final , T, X, U> TableField createField(Name name, DataType type, TR table, String comment, Converter converter, Binding binding, Generator generator) { Binding actualBinding = DefaultBinding.newBinding(converter, type, binding); DataType actualType = converter == null && binding == null diff --git a/jOOQ/src/main/java/org/jooq/impl/ArrayDataType.java b/jOOQ/src/main/java/org/jooq/impl/ArrayDataType.java index 569b21ffeb..305de6f30c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ArrayDataType.java +++ b/jOOQ/src/main/java/org/jooq/impl/ArrayDataType.java @@ -76,7 +76,7 @@ final class ArrayDataType extends DefaultDataType { Integer length, Nullability nullability, boolean readonly, - Generator generatedAlwaysAs, + Generator generatedAlwaysAs, GenerationOption generationOption, GenerationLocation generationLocation, Collation collation, @@ -97,7 +97,7 @@ final class ArrayDataType extends DefaultDataType { Integer newLength, Nullability newNullability, boolean newReadonly, - Generator newGeneratedAlwaysAs, + Generator newGeneratedAlwaysAs, GenerationOption newGenerationOption, GenerationLocation newGenerationLocation, Collation newCollation, diff --git a/jOOQ/src/main/java/org/jooq/impl/AuditGenerator.java b/jOOQ/src/main/java/org/jooq/impl/AuditGenerator.java index 197b988392..de25a32a45 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AuditGenerator.java +++ b/jOOQ/src/main/java/org/jooq/impl/AuditGenerator.java @@ -93,6 +93,8 @@ package org.jooq.impl; + + diff --git a/jOOQ/src/main/java/org/jooq/impl/ConvertedDataType.java b/jOOQ/src/main/java/org/jooq/impl/ConvertedDataType.java index 86275082d0..b784e183d4 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ConvertedDataType.java +++ b/jOOQ/src/main/java/org/jooq/impl/ConvertedDataType.java @@ -88,7 +88,7 @@ final class ConvertedDataType extends AbstractDataTypeX { Integer newLength, Nullability newNullability, boolean newReadonly, - Generator newGeneratedAlwaysAs, + Generator newGeneratedAlwaysAs, GenerationOption newGenerationOption, GenerationLocation newGenerationLocation, Collation newCollation, @@ -210,8 +210,8 @@ final class ConvertedDataType extends AbstractDataTypeX { } @Override - public final Generator generatedAlwaysAsGenerator() { - return (Generator) delegate.generatedAlwaysAsGenerator(); + public final Generator generatedAlwaysAsGenerator() { + return (Generator) delegate.generatedAlwaysAsGenerator(); } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/DataTypeProxy.java b/jOOQ/src/main/java/org/jooq/impl/DataTypeProxy.java index a3ee804dc0..f437153cf4 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DataTypeProxy.java +++ b/jOOQ/src/main/java/org/jooq/impl/DataTypeProxy.java @@ -66,7 +66,7 @@ final class DataTypeProxy extends AbstractDataType { private final Integer overrideLength; private final Nullability overrideNullability; private final Boolean overrideReadonly; - private final Generator overrideGeneratedAlwaysAs; + private final Generator overrideGeneratedAlwaysAs; private final GenerationOption overrideGenerationOption; private final GenerationLocation overrideGenerationLocation; private final Collation overrideCollation; @@ -86,7 +86,7 @@ final class DataTypeProxy extends AbstractDataType { Integer overrideLength, Nullability overrideNullability, Boolean overrideReadonly, - Generator overrideGeneratedAlwaysAs, + Generator overrideGeneratedAlwaysAs, GenerationOption overrideGenerationOption, GenerationLocation overrideGenerationLocation, Collation overrideCollation, @@ -198,12 +198,12 @@ final class DataTypeProxy extends AbstractDataType { } @Override - public final Generator generatedAlwaysAsGenerator() { + public final Generator generatedAlwaysAsGenerator() { return defaultIfNull(overrideGeneratedAlwaysAs, type.generatedAlwaysAsGenerator()); } @Override - public final DataType generatedAlwaysAs(Generator g) { + public final DataType generatedAlwaysAs(Generator g) { return new DataTypeProxy<>( this, overridePrecision, diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultDataType.java b/jOOQ/src/main/java/org/jooq/impl/DefaultDataType.java index a84a6c28f6..f8088c7fd6 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultDataType.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultDataType.java @@ -259,7 +259,7 @@ public class DefaultDataType extends AbstractDataTypeX { private final Nullability nullability; private final boolean readonly; - private final Generator generatedAlwaysAs; + private final Generator generatedAlwaysAs; private final GenerationOption generationOption; private final GenerationLocation generationLocation; private final Collation collation; @@ -334,7 +334,7 @@ public class DefaultDataType extends AbstractDataTypeX { this(dialect, sqlDataType, type, binding, qualifiedTypeName, typeName, castTypeName, precision, scale, length, nullability, false, null, GenerationOption.DEFAULT, GenerationLocation.SERVER, null, null, false, defaultValue); } - DefaultDataType(SQLDialect dialect, DataType sqlDataType, Class type, Binding binding, Name qualifiedTypeName, String typeName, String castTypeName, Integer precision, Integer scale, Integer length, Nullability nullability, boolean readonly, Generator generatedAlwaysAs, GenerationOption generationOption, GenerationLocation generationLocation, Collation collation, CharacterSet characterSet, boolean identity, Field defaultValue) { + DefaultDataType(SQLDialect dialect, DataType sqlDataType, Class type, Binding binding, Name qualifiedTypeName, String typeName, String castTypeName, Integer precision, Integer scale, Integer length, Nullability nullability, boolean readonly, Generator generatedAlwaysAs, GenerationOption generationOption, GenerationLocation generationLocation, Collation collation, CharacterSet characterSet, boolean identity, Field defaultValue) { super(qualifiedTypeName, NO_COMMENT); // Initialise final instance members @@ -401,7 +401,7 @@ public class DefaultDataType extends AbstractDataTypeX { Integer newLength, Nullability newNullability, boolean newReadonly, - Generator newGeneratedAlwaysAs, + Generator newGeneratedAlwaysAs, GenerationOption newGenerationOption, GenerationLocation newGenerationLocation, Collation newCollation, @@ -436,7 +436,7 @@ public class DefaultDataType extends AbstractDataTypeX { Integer length, Nullability nullability, boolean readonly, - Generator generatedAlwaysAs, + Generator generatedAlwaysAs, GenerationOption generationOption, GenerationLocation generationLocation, Collation collation, @@ -500,7 +500,7 @@ public class DefaultDataType extends AbstractDataTypeX { } @Override - public final Generator generatedAlwaysAsGenerator() { + public final Generator generatedAlwaysAsGenerator() { return generatedAlwaysAs; } diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultGeneratorContext.java b/jOOQ/src/main/java/org/jooq/impl/DefaultGeneratorContext.java index 95bbeed250..46563443a9 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultGeneratorContext.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultGeneratorContext.java @@ -41,22 +41,31 @@ import org.jooq.Configuration; import org.jooq.Field; import org.jooq.GeneratorContext; import org.jooq.GeneratorStatementType; +import org.jooq.Record; +import org.jooq.Table; /** * @author Lukas Eder */ -final class DefaultGeneratorContext extends AbstractScope implements GeneratorContext { +final class DefaultGeneratorContext, T> extends AbstractScope implements GeneratorContext { + final X table; final Field field; final GeneratorStatementType statementType; - DefaultGeneratorContext(Configuration configuration, Field field, GeneratorStatementType statementType) { + DefaultGeneratorContext(Configuration configuration, X table, Field field, GeneratorStatementType statementType) { super(configuration); + this.table = table; this.field = field; this.statementType = statementType; } + @Override + public final X table() { + return table; + } + @Override public final Field field() { return field; diff --git a/jOOQ/src/main/java/org/jooq/impl/FieldMapsForInsert.java b/jOOQ/src/main/java/org/jooq/impl/FieldMapsForInsert.java index c75b5af39a..724328509e 100644 --- a/jOOQ/src/main/java/org/jooq/impl/FieldMapsForInsert.java +++ b/jOOQ/src/main/java/org/jooq/impl/FieldMapsForInsert.java @@ -88,6 +88,7 @@ import org.jooq.RenderContext.CastMode; import org.jooq.SQLDialect; import org.jooq.Select; import org.jooq.Table; +import org.jooq.TableField; import org.jooq.conf.WriteIfReadonly; import org.jooq.exception.DataTypeException; import org.jooq.impl.AbstractStoreQuery.UnknownField; @@ -299,6 +300,11 @@ final class FieldMapsForInsert extends AbstractQueryPart implements UNotYetImple + + + + + diff --git a/jOOQ/src/main/java/org/jooq/impl/MultisetDataType.java b/jOOQ/src/main/java/org/jooq/impl/MultisetDataType.java index 8f08e1726b..54137d3fc0 100644 --- a/jOOQ/src/main/java/org/jooq/impl/MultisetDataType.java +++ b/jOOQ/src/main/java/org/jooq/impl/MultisetDataType.java @@ -88,7 +88,7 @@ final class MultisetDataType extends DefaultDataType Integer length, Nullability nullability, boolean readonly, - Generator> generatedAlwaysAs, + Generator> generatedAlwaysAs, GenerationOption generationOption, GenerationLocation generationLocation, Collation collation, @@ -110,7 +110,7 @@ final class MultisetDataType extends DefaultDataType Integer newLength, Nullability newNullability, boolean newReadonly, - Generator> newGeneratedAlwaysAs, + Generator> newGeneratedAlwaysAs, GenerationOption newGenerationOption, GenerationLocation newGenerationLocation, Collation newCollation, diff --git a/jOOQ/src/main/java/org/jooq/impl/RecordDataType.java b/jOOQ/src/main/java/org/jooq/impl/RecordDataType.java index 5e499b1584..b522ffddcd 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RecordDataType.java +++ b/jOOQ/src/main/java/org/jooq/impl/RecordDataType.java @@ -89,7 +89,7 @@ final class RecordDataType extends DefaultDataType { Integer length, Nullability nullability, boolean readonly, - Generator generatedAlwaysAs, + Generator generatedAlwaysAs, GenerationOption generationOption, GenerationLocation generationLocation, Collation collation, @@ -110,7 +110,7 @@ final class RecordDataType extends DefaultDataType { Integer newLength, Nullability newNullability, boolean newReadonly, - Generator newGeneratedAlwaysAs, + Generator newGeneratedAlwaysAs, GenerationOption newGenerationOption, GenerationLocation newGenerationLocation, Collation newCollation,