diff --git a/jOOQ/src/main/java/org/jooq/Converter.java b/jOOQ/src/main/java/org/jooq/Converter.java index 81f9bdaf87..0304001dcc 100644 --- a/jOOQ/src/main/java/org/jooq/Converter.java +++ b/jOOQ/src/main/java/org/jooq/Converter.java @@ -37,9 +37,12 @@ */ package org.jooq; +import static org.jooq.Converters.nullable; + import java.io.Serializable; import java.util.function.Function; +import org.jooq.exception.DataTypeException; import org.jooq.impl.AbstractConverter; import org.jooq.impl.SQLDataType; @@ -53,9 +56,11 @@ import org.jetbrains.annotations.NotNull; * directed, this means that the Converter is used * *

* Note: In order to avoid unwanted side-effects, it is highly recommended (yet @@ -83,7 +88,8 @@ import org.jetbrains.annotations.NotNull; * {@link DataType#asConvertedDataType(Binding)}, for example. Custom data types * can also be defined on generated code using the * <forcedType/> configuration, see the manual for more details + * "https://www.jooq.org/doc/latest/manual/code-generation/codegen-advanced/codegen-config-database/codegen-database-forced-types/">the + * manual for more details * * @author Lukas Eder * @param The database type - i.e. any type available from @@ -93,29 +99,29 @@ import org.jetbrains.annotations.NotNull; public interface Converter extends Serializable { /** - * Convert a database object to a user object + * Read and convert a database object to a user object. * - * @param databaseObject The database object - * @return The user object + * @param databaseObject The database object. + * @return The user object. */ U from(T databaseObject); /** - * Convert a user object to a database object + * Convert and write a user object to a database object. * - * @param userObject The user object - * @return The database object + * @param userObject The user object. + * @return The database object. */ T to(U userObject); /** - * The database type + * The database type. */ @NotNull Class fromType(); /** - * The user type + * The user type. */ @NotNull Class toType(); @@ -147,12 +153,13 @@ public interface Converter extends Serializable { /** * Construct a new converter from functions. * - * @param the database type - * @param the user type - * @param fromType The database type - * @param toType The user type - * @param from A function converting from T to U - * @param to A function converting from U to T + * @param the database type. + * @param the user type. + * @param fromType The database type. + * @param toType The user type. + * @param from A function converting from T to U when reading from the + * database. + * @param to A function converting from U to T when writing to the database. * @return The converter. * @see Converter */ @@ -182,6 +189,50 @@ public interface Converter extends Serializable { }; } + /** + * Construct a new read-only converter from a function. + * + * @param the database type + * @param the user type + * @param fromType The database type + * @param toType The user type + * @param from A function converting from T to U when reading from the + * database. + * @param to A function converting from U to T when writing to the database. + * @return The converter. + * @see Converter + */ + @NotNull + static Converter from( + Class fromType, + Class toType, + Function from + ) { + return of(fromType, toType, from, notImplemented()); + } + + /** + * Construct a new write-only converter from a function. + * + * @param the database type + * @param the user type + * @param fromType The database type + * @param toType The user type + * @param from A function converting from T to U when reading from the + * database. + * @param to A function converting from U to T when writing to the database. + * @return The converter. + * @see Converter + */ + @NotNull + static Converter to( + Class fromType, + Class toType, + Function to + ) { + return of(fromType, toType, notImplemented(), to); + } + /** * Construct a new converter from functions. *

@@ -205,12 +256,12 @@ public interface Converter extends Serializable { * @param the user type * @param fromType The database type * @param toType The user type - * @param from A function converting from T to U - * @param to A function converting from U to T + * @param from A function converting from T to U when reading from the + * database. + * @param to A function converting from U to T when writing to the database. * @return The converter. * @see Converter */ - @SuppressWarnings("unchecked") @NotNull static Converter ofNullable( Class fromType, @@ -218,19 +269,79 @@ public interface Converter extends Serializable { Function from, Function to ) { - Function fromS; - Function toS; + return of(fromType, toType, nullable(from), nullable(to)); + } - if (from instanceof Serializable) - fromS = (Function & Serializable) t -> t == null ? null : from.apply(t); - else - fromS = t -> t == null ? null : from.apply(t); + /** + * Construct a new read-only converter from a function. + *

+ * This works like {@link Converter#from(Class, Class, Function)}, except + * that the conversion {@link Function} is decorated with a function that + * always returns null for null inputs. + *

+ * Example: + *

+ *

+     * Converter<String, Integer> converter =
+     *   Converter.fromNullable(String.class, Integer.class, Integer::parseInt);
+     *
+     * // No exceptions thrown
+     * assertNull(converter.from(null));
+     * 
+ * + * @param the database type. + * @param the user type. + * @param fromType The database type. + * @param toType The user type. + * @param from A function converting from T to U when reading from the + * database. + * @return The converter. + * @see Converter + */ + @NotNull + static Converter fromNullable( + Class fromType, + Class toType, + Function from + ) { + return of(fromType, toType, nullable(from), notImplemented()); + } - if (to instanceof Serializable) - toS = (Function & Serializable) u -> u == null ? null : to.apply(u); - else - toS = u -> u == null ? null : to.apply(u); + /** + * Construct a new write-only converter from a function. + *

+ * This works like {@link Converter#to(Class, Class, Function)}, except that + * the conversion {@link Function} is decorated with a function that always + * returns null for null inputs. + *

+ * Example: + *

+ *

+     * Converter<String, Integer> converter =
+     *   Converter.toNullable(String.class, Integer.class, Object::toString);
+     *
+     * // No exceptions thrown
+     * assertNull(converter.to(null));
+     * 
+ * + * @param the database type + * @param the user type + * @param fromType The database type + * @param toType The user type + * @param to A function converting from U to T when writing to the database. + * @return The converter. + * @see Converter + */ + @NotNull + static Converter toNullable( + Class fromType, + Class toType, + Function to + ) { + return of(fromType, toType, notImplemented(), nullable(to)); + } - return of(fromType, toType, fromS, toS); + private static Function notImplemented() { + return t -> { throw new DataTypeException("Conversion function not implemented"); }; } } diff --git a/jOOQ/src/main/java/org/jooq/Converters.java b/jOOQ/src/main/java/org/jooq/Converters.java index 32addacddf..db8753c42c 100644 --- a/jOOQ/src/main/java/org/jooq/Converters.java +++ b/jOOQ/src/main/java/org/jooq/Converters.java @@ -40,6 +40,9 @@ package org.jooq; import static org.jooq.impl.Internal.arrayType; import static org.jooq.tools.Convert.convertArray; +import java.io.Serializable; +import java.util.function.Function; + import org.jooq.impl.AbstractConverter; import org.jooq.impl.IdentityConverter; import org.jooq.impl.SQLDataType; @@ -216,4 +219,10 @@ public class Converters extends AbstractConverter { sb.append(" ]"); return sb.toString(); } + + static final Function nullable(Function f) { + return f instanceof Serializable + ? (Function & Serializable) t -> t == null ? null + : f.apply(t) : t -> t == null ? null : f.apply(t); + } } diff --git a/jOOQ/src/main/java/org/jooq/DataType.java b/jOOQ/src/main/java/org/jooq/DataType.java index da0c543f19..80b5f990e4 100644 --- a/jOOQ/src/main/java/org/jooq/DataType.java +++ b/jOOQ/src/main/java/org/jooq/DataType.java @@ -74,6 +74,7 @@ import java.util.List; import java.util.function.Function; import org.jooq.exception.DataTypeException; +import org.jooq.exception.MappingException; import org.jooq.impl.SQLDataType; import org.jooq.tools.Convert; import org.jooq.types.DayToSecond; @@ -207,6 +208,30 @@ public interface DataType extends Named { return asConvertedDataType(Converter.of(getType(), toType, from, to)); } + /** + * Convenience method for converting this type to a read-only type using + * {@link Converter#from(Class, Class, Function)}. + */ + @NotNull + default DataType asConvertedDataTypeFrom( + Class toType, + Function from + ) { + return asConvertedDataType(Converter.from(getType(), toType, from)); + } + + /** + * Convenience method for converting this type to a write-only type using + * {@link Converter#to(Class, Class, Function)}. + */ + @NotNull + default DataType asConvertedDataTypeTo( + Class toType, + Function to + ) { + return asConvertedDataType(Converter.to(getType(), toType, to)); + } + /** * Retrieve the data type for a given binding. */ diff --git a/jOOQ/src/main/java/org/jooq/Field.java b/jOOQ/src/main/java/org/jooq/Field.java index 07dc014ea4..8f6d17564c 100644 --- a/jOOQ/src/main/java/org/jooq/Field.java +++ b/jOOQ/src/main/java/org/jooq/Field.java @@ -204,32 +204,38 @@ extends ); /** - * The name of the field. + * Apply an ad-hoc read-only data type {@link Converter} to this field + * expression. *

- * The name is any of these: - *

    - *
  • The formal name of the field, if it is a physical table/view - * field
  • - *
  • The alias of an aliased field
  • - *
  • A generated / unspecified value for any other expression
  • - *
  • The name of a parameter if it is a named {@link Param}
  • - *
+ * Rather than attaching data type converters at code generation time, or + * creating cumbersome expressions using + * {@link DataType#asConvertedDataTypeFrom(Class, Function)}, this method + * allows for creating a derived field expression with an ad-hoc data type + * converter for single query usage. + * + * @param The user type. + * @param converter The read-only converter to be applied on any operations + * using this field. + * @return A derived field expression using a new converter. */ - @NotNull - @Override - String getName(); + Field convertFrom(Class toType, Function from); /** - * The comment given to the field. + * Apply an ad-hoc write-only data type {@link Converter} to this field + * expression. *

- * If this Field is a generated field from your database, it - * may provide its DDL comment through this method. All other column - * expressions return the empty string "" here, never - * null. + * Rather than attaching data type converters at code generation time, or + * creating cumbersome expressions using + * {@link DataType#asConvertedDataTypeTo(Class, Function)}, this method + * allows for creating a derived field expression with an ad-hoc data type + * converter for single query usage. + * + * @param The user type. + * @param converter The write-only converter to be applied on any operations + * using this field. + * @return A derived field expression using a new converter. */ - @NotNull - @Override - String getComment(); + Field convertTo(Class toType, Function to); /** * Create an alias for this field. @@ -273,6 +279,34 @@ extends @Support Field as(Field otherField); + /** + * The name of the field. + *

+ * The name is any of these: + *

    + *
  • The formal name of the field, if it is a physical table/view + * field
  • + *
  • The alias of an aliased field
  • + *
  • A generated / unspecified value for any other expression
  • + *
  • The name of a parameter if it is a named {@link Param}
  • + *
+ */ + @NotNull + @Override + String getName(); + + /** + * The comment given to the field. + *

+ * If this Field is a generated field from your database, it + * may provide its DDL comment through this method. All other column + * expressions return the empty string "" here, never + * null. + */ + @NotNull + @Override + String getComment(); + /** * Create an alias for this field. *

diff --git a/jOOQ/src/main/java/org/jooq/Row1.java b/jOOQ/src/main/java/org/jooq/Row1.java index 8623edf6a1..a5e5f767d7 100644 --- a/jOOQ/src/main/java/org/jooq/Row1.java +++ b/jOOQ/src/main/java/org/jooq/Row1.java @@ -83,7 +83,7 @@ import org.jetbrains.annotations.NotNull; * * @author Lukas Eder */ -public interface Row1 extends Row { +public interface Row1 extends Row, SelectField> { // ------------------------------------------------------------------------ // Field accessors diff --git a/jOOQ/src/main/java/org/jooq/Row10.java b/jOOQ/src/main/java/org/jooq/Row10.java index 7926949576..5e2842770e 100644 --- a/jOOQ/src/main/java/org/jooq/Row10.java +++ b/jOOQ/src/main/java/org/jooq/Row10.java @@ -83,7 +83,7 @@ import org.jetbrains.annotations.NotNull; * * @author Lukas Eder */ -public interface Row10 extends Row { +public interface Row10 extends Row, SelectField> { // ------------------------------------------------------------------------ // Field accessors diff --git a/jOOQ/src/main/java/org/jooq/Row11.java b/jOOQ/src/main/java/org/jooq/Row11.java index 9cb0571d05..59440e7dba 100644 --- a/jOOQ/src/main/java/org/jooq/Row11.java +++ b/jOOQ/src/main/java/org/jooq/Row11.java @@ -83,7 +83,7 @@ import org.jetbrains.annotations.NotNull; * * @author Lukas Eder */ -public interface Row11 extends Row { +public interface Row11 extends Row, SelectField> { // ------------------------------------------------------------------------ // Field accessors diff --git a/jOOQ/src/main/java/org/jooq/Row12.java b/jOOQ/src/main/java/org/jooq/Row12.java index 4f92048c1a..93d1ee985d 100644 --- a/jOOQ/src/main/java/org/jooq/Row12.java +++ b/jOOQ/src/main/java/org/jooq/Row12.java @@ -83,7 +83,7 @@ import org.jetbrains.annotations.NotNull; * * @author Lukas Eder */ -public interface Row12 extends Row { +public interface Row12 extends Row, SelectField> { // ------------------------------------------------------------------------ // Field accessors diff --git a/jOOQ/src/main/java/org/jooq/Row13.java b/jOOQ/src/main/java/org/jooq/Row13.java index 9a4e7a6fb0..a17fdb7b23 100644 --- a/jOOQ/src/main/java/org/jooq/Row13.java +++ b/jOOQ/src/main/java/org/jooq/Row13.java @@ -83,7 +83,7 @@ import org.jetbrains.annotations.NotNull; * * @author Lukas Eder */ -public interface Row13 extends Row { +public interface Row13 extends Row, SelectField> { // ------------------------------------------------------------------------ // Field accessors diff --git a/jOOQ/src/main/java/org/jooq/Row14.java b/jOOQ/src/main/java/org/jooq/Row14.java index a7c4cb6c7b..d66cafbd15 100644 --- a/jOOQ/src/main/java/org/jooq/Row14.java +++ b/jOOQ/src/main/java/org/jooq/Row14.java @@ -83,7 +83,7 @@ import org.jetbrains.annotations.NotNull; * * @author Lukas Eder */ -public interface Row14 extends Row { +public interface Row14 extends Row, SelectField> { // ------------------------------------------------------------------------ // Field accessors diff --git a/jOOQ/src/main/java/org/jooq/Row15.java b/jOOQ/src/main/java/org/jooq/Row15.java index 82c1eeb5b7..0d0dae8f56 100644 --- a/jOOQ/src/main/java/org/jooq/Row15.java +++ b/jOOQ/src/main/java/org/jooq/Row15.java @@ -83,7 +83,7 @@ import org.jetbrains.annotations.NotNull; * * @author Lukas Eder */ -public interface Row15 extends Row { +public interface Row15 extends Row, SelectField> { // ------------------------------------------------------------------------ // Field accessors diff --git a/jOOQ/src/main/java/org/jooq/Row16.java b/jOOQ/src/main/java/org/jooq/Row16.java index ad79ef54fb..ccb3adaa7c 100644 --- a/jOOQ/src/main/java/org/jooq/Row16.java +++ b/jOOQ/src/main/java/org/jooq/Row16.java @@ -83,7 +83,7 @@ import org.jetbrains.annotations.NotNull; * * @author Lukas Eder */ -public interface Row16 extends Row { +public interface Row16 extends Row, SelectField> { // ------------------------------------------------------------------------ // Field accessors diff --git a/jOOQ/src/main/java/org/jooq/Row17.java b/jOOQ/src/main/java/org/jooq/Row17.java index 8b8aad9654..b84cc0f17c 100644 --- a/jOOQ/src/main/java/org/jooq/Row17.java +++ b/jOOQ/src/main/java/org/jooq/Row17.java @@ -83,7 +83,7 @@ import org.jetbrains.annotations.NotNull; * * @author Lukas Eder */ -public interface Row17 extends Row { +public interface Row17 extends Row, SelectField> { // ------------------------------------------------------------------------ // Field accessors diff --git a/jOOQ/src/main/java/org/jooq/Row18.java b/jOOQ/src/main/java/org/jooq/Row18.java index f5e860afdf..bc06a74915 100644 --- a/jOOQ/src/main/java/org/jooq/Row18.java +++ b/jOOQ/src/main/java/org/jooq/Row18.java @@ -83,7 +83,7 @@ import org.jetbrains.annotations.NotNull; * * @author Lukas Eder */ -public interface Row18 extends Row { +public interface Row18 extends Row, SelectField> { // ------------------------------------------------------------------------ // Field accessors diff --git a/jOOQ/src/main/java/org/jooq/Row19.java b/jOOQ/src/main/java/org/jooq/Row19.java index 2f6db2f29b..b67cdb1425 100644 --- a/jOOQ/src/main/java/org/jooq/Row19.java +++ b/jOOQ/src/main/java/org/jooq/Row19.java @@ -83,7 +83,7 @@ import org.jetbrains.annotations.NotNull; * * @author Lukas Eder */ -public interface Row19 extends Row { +public interface Row19 extends Row, SelectField> { // ------------------------------------------------------------------------ // Field accessors diff --git a/jOOQ/src/main/java/org/jooq/Row2.java b/jOOQ/src/main/java/org/jooq/Row2.java index 236c92089e..8e62e9daea 100644 --- a/jOOQ/src/main/java/org/jooq/Row2.java +++ b/jOOQ/src/main/java/org/jooq/Row2.java @@ -83,7 +83,7 @@ import org.jetbrains.annotations.NotNull; * * @author Lukas Eder */ -public interface Row2 extends Row { +public interface Row2 extends Row, SelectField> { // ------------------------------------------------------------------------ // Field accessors diff --git a/jOOQ/src/main/java/org/jooq/Row20.java b/jOOQ/src/main/java/org/jooq/Row20.java index bec0e4862e..e96eca9da6 100644 --- a/jOOQ/src/main/java/org/jooq/Row20.java +++ b/jOOQ/src/main/java/org/jooq/Row20.java @@ -83,7 +83,7 @@ import org.jetbrains.annotations.NotNull; * * @author Lukas Eder */ -public interface Row20 extends Row { +public interface Row20 extends Row, SelectField> { // ------------------------------------------------------------------------ // Field accessors diff --git a/jOOQ/src/main/java/org/jooq/Row21.java b/jOOQ/src/main/java/org/jooq/Row21.java index 077f4a3e2d..bad4bb8ef4 100644 --- a/jOOQ/src/main/java/org/jooq/Row21.java +++ b/jOOQ/src/main/java/org/jooq/Row21.java @@ -83,7 +83,7 @@ import org.jetbrains.annotations.NotNull; * * @author Lukas Eder */ -public interface Row21 extends Row { +public interface Row21 extends Row, SelectField> { // ------------------------------------------------------------------------ // Field accessors diff --git a/jOOQ/src/main/java/org/jooq/Row22.java b/jOOQ/src/main/java/org/jooq/Row22.java index 46238152bc..5bca38d94a 100644 --- a/jOOQ/src/main/java/org/jooq/Row22.java +++ b/jOOQ/src/main/java/org/jooq/Row22.java @@ -83,7 +83,7 @@ import org.jetbrains.annotations.NotNull; * * @author Lukas Eder */ -public interface Row22 extends Row { +public interface Row22 extends Row, SelectField> { // ------------------------------------------------------------------------ // Field accessors diff --git a/jOOQ/src/main/java/org/jooq/Row3.java b/jOOQ/src/main/java/org/jooq/Row3.java index bbd14b2ddf..d6822194be 100644 --- a/jOOQ/src/main/java/org/jooq/Row3.java +++ b/jOOQ/src/main/java/org/jooq/Row3.java @@ -83,7 +83,7 @@ import org.jetbrains.annotations.NotNull; * * @author Lukas Eder */ -public interface Row3 extends Row { +public interface Row3 extends Row, SelectField> { // ------------------------------------------------------------------------ // Field accessors diff --git a/jOOQ/src/main/java/org/jooq/Row4.java b/jOOQ/src/main/java/org/jooq/Row4.java index 40b3f9dc88..b7a5d0f2dc 100644 --- a/jOOQ/src/main/java/org/jooq/Row4.java +++ b/jOOQ/src/main/java/org/jooq/Row4.java @@ -83,7 +83,7 @@ import org.jetbrains.annotations.NotNull; * * @author Lukas Eder */ -public interface Row4 extends Row { +public interface Row4 extends Row, SelectField> { // ------------------------------------------------------------------------ // Field accessors diff --git a/jOOQ/src/main/java/org/jooq/Row5.java b/jOOQ/src/main/java/org/jooq/Row5.java index 7ad9c10a78..3ab9c2f61d 100644 --- a/jOOQ/src/main/java/org/jooq/Row5.java +++ b/jOOQ/src/main/java/org/jooq/Row5.java @@ -83,7 +83,7 @@ import org.jetbrains.annotations.NotNull; * * @author Lukas Eder */ -public interface Row5 extends Row { +public interface Row5 extends Row, SelectField> { // ------------------------------------------------------------------------ // Field accessors diff --git a/jOOQ/src/main/java/org/jooq/Row6.java b/jOOQ/src/main/java/org/jooq/Row6.java index 5d343e8427..4be2592ab2 100644 --- a/jOOQ/src/main/java/org/jooq/Row6.java +++ b/jOOQ/src/main/java/org/jooq/Row6.java @@ -83,7 +83,7 @@ import org.jetbrains.annotations.NotNull; * * @author Lukas Eder */ -public interface Row6 extends Row { +public interface Row6 extends Row, SelectField> { // ------------------------------------------------------------------------ // Field accessors diff --git a/jOOQ/src/main/java/org/jooq/Row7.java b/jOOQ/src/main/java/org/jooq/Row7.java index 0444854b05..388ecb5b6a 100644 --- a/jOOQ/src/main/java/org/jooq/Row7.java +++ b/jOOQ/src/main/java/org/jooq/Row7.java @@ -83,7 +83,7 @@ import org.jetbrains.annotations.NotNull; * * @author Lukas Eder */ -public interface Row7 extends Row { +public interface Row7 extends Row, SelectField> { // ------------------------------------------------------------------------ // Field accessors diff --git a/jOOQ/src/main/java/org/jooq/Row8.java b/jOOQ/src/main/java/org/jooq/Row8.java index 13f0cb5f43..0edc1e5773 100644 --- a/jOOQ/src/main/java/org/jooq/Row8.java +++ b/jOOQ/src/main/java/org/jooq/Row8.java @@ -83,7 +83,7 @@ import org.jetbrains.annotations.NotNull; * * @author Lukas Eder */ -public interface Row8 extends Row { +public interface Row8 extends Row, SelectField> { // ------------------------------------------------------------------------ // Field accessors diff --git a/jOOQ/src/main/java/org/jooq/Row9.java b/jOOQ/src/main/java/org/jooq/Row9.java index 317b4f16f6..e4dc79e1b8 100644 --- a/jOOQ/src/main/java/org/jooq/Row9.java +++ b/jOOQ/src/main/java/org/jooq/Row9.java @@ -83,7 +83,7 @@ import org.jetbrains.annotations.NotNull; * * @author Lukas Eder */ -public interface Row9 extends Row { +public interface Row9 extends Row, SelectField> { // ------------------------------------------------------------------------ // Field accessors diff --git a/jOOQ/src/main/java/org/jooq/RowN.java b/jOOQ/src/main/java/org/jooq/RowN.java index 9059ff5936..c230e3a4b3 100644 --- a/jOOQ/src/main/java/org/jooq/RowN.java +++ b/jOOQ/src/main/java/org/jooq/RowN.java @@ -83,7 +83,7 @@ import org.jetbrains.annotations.NotNull; * * @author Lukas Eder */ -public interface RowN extends Row { +public interface RowN extends Row, SelectField { // ------------------------------------------------------------------------ // Generic comparison predicates diff --git a/jOOQ/src/main/java/org/jooq/SelectField.java b/jOOQ/src/main/java/org/jooq/SelectField.java index a6d40f7b8b..c4a4d22cc9 100644 --- a/jOOQ/src/main/java/org/jooq/SelectField.java +++ b/jOOQ/src/main/java/org/jooq/SelectField.java @@ -38,7 +38,6 @@ package org.jooq; - /** * A QueryPart to be used exclusively in SELECT * clauses. diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractCursor.java b/jOOQ/src/main/java/org/jooq/impl/AbstractCursor.java index 7db34043aa..baee571123 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractCursor.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractCursor.java @@ -63,7 +63,7 @@ abstract class AbstractCursor extends AbstractResult implem */ private static final long serialVersionUID = 866689823212695960L; - AbstractCursor(Configuration configuration, AbstractRow row) { + AbstractCursor(Configuration configuration, AbstractRow row) { super(configuration, row); } diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java b/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java index 85bf006755..3dd289f7b7 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java @@ -1241,7 +1241,7 @@ abstract class AbstractDMLQuery extends AbstractRowCountQuery // Only the IDENTITY value was requested. No need for an // additional query if (returningResolvedAsterisks.size() == 1 && new FieldsImpl<>(returningResolvedAsterisks).field(returnIdentity) != null) { - AbstractRow fields = Tools.row0(returningResolvedAsterisks.toArray(EMPTY_FIELD)); + AbstractRow fields = (AbstractRow) Tools.row0(returningResolvedAsterisks.toArray(EMPTY_FIELD)); for (final Object id : ids) { ((Result) getResult()).add( diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractField.java b/jOOQ/src/main/java/org/jooq/impl/AbstractField.java index 5fa616e6c3..d2101d183e 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractField.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractField.java @@ -188,12 +188,12 @@ abstract class AbstractField extends AbstractTypedNamed implements Field Field convert(Binding binding) { - return CustomField.of(getQualifiedName(), getDataType().asConvertedDataType(binding), c -> c.visit(this)); + return coerce(getDataType().asConvertedDataType(binding)); } @Override public final Field convert(Converter converter) { - return CustomField.of(getQualifiedName(), getDataType().asConvertedDataType(converter), c -> c.visit(this)); + return coerce(getDataType().asConvertedDataType(converter)); } @Override @@ -202,7 +202,17 @@ abstract class AbstractField extends AbstractTypedNamed implements Field from, Function to ) { - return CustomField.of(getQualifiedName(), getDataType().asConvertedDataType(toType, from, to), c -> c.visit(this)); + return coerce(getDataType().asConvertedDataType(toType, from, to)); + } + + @Override + public final Field convertFrom(Class toType, Function from) { + return coerce(getDataType().asConvertedDataTypeFrom(toType, from)); + } + + @Override + public final Field convertTo(Class toType, Function to) { + return coerce(getDataType().asConvertedDataTypeTo(toType, to)); } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractRecord.java b/jOOQ/src/main/java/org/jooq/impl/AbstractRecord.java index 6e3790ae79..66b6d26620 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractRecord.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractRecord.java @@ -120,14 +120,14 @@ abstract class AbstractRecord extends AbstractStore implements Record { /** * Generated UID */ - private static final long serialVersionUID = -6052512608911220404L; - private static final JooqLogger log = JooqLogger.getLogger(AbstractRecord.class); + private static final long serialVersionUID = -6052512608911220404L; + private static final JooqLogger log = JooqLogger.getLogger(AbstractRecord.class); - final AbstractRow fields; - final Object[] values; - final Object[] originals; - final BitSet changed; - boolean fetched; + final AbstractRow fields; + final Object[] values; + final Object[] originals; + final BitSet changed; + boolean fetched; /** * @deprecated - 3.14.5 - [#8495] [#11058] - Re-use AbstractRow reference if possible @@ -145,10 +145,10 @@ abstract class AbstractRecord extends AbstractStore implements Record { this(Tools.row0(fields)); } - AbstractRecord(AbstractRow fields) { + AbstractRecord(AbstractRow fields) { int size = fields.size(); - this.fields = fields; + this.fields = (AbstractRow) fields; this.values = new Object[size]; this.originals = new Object[size]; this.changed = new BitSet(size); @@ -843,7 +843,7 @@ abstract class AbstractRecord extends AbstractStore implements Record { } final R intoRecord(Class type) { - return Tools.newRecord(fetched, type, fields, configuration()).operate(new TransferRecordState<>(null)); + return (R) Tools.newRecord(fetched, type, fields, configuration()).operate(new TransferRecordState<>(null)); } private class TransferRecordState implements ThrowingFunction { diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractResult.java b/jOOQ/src/main/java/org/jooq/impl/AbstractResult.java index 90f4b3ef9e..8db32e28ee 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractResult.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractResult.java @@ -120,10 +120,10 @@ abstract class AbstractResult extends AbstractFormattable impl */ private static final long serialVersionUID = -3412555195899758746L; - final AbstractRow fields; + final AbstractRow fields; Configuration configuration; - AbstractResult(Configuration configuration, AbstractRow row) { + AbstractResult(Configuration configuration, AbstractRow row) { this.configuration = configuration; this.fields = row; } @@ -132,9 +132,8 @@ abstract class AbstractResult extends AbstractFormattable impl // XXX: RecordType API of subtypes // ------------------------------------------------------------------------- - @SuppressWarnings("unchecked") public final RecordType recordType() { - return (RecordType) fields.fields; + return fields.fields; } @Override @@ -800,7 +799,13 @@ abstract class AbstractResult extends AbstractFormattable impl } } - static final void formatJSONMap0(Record record, AbstractRow fields, JSONFormat format, int recordLevel, Writer writer) throws java.io.IOException { + static final void formatJSONMap0( + Record record, + AbstractRow fields, + JSONFormat format, + int recordLevel, + Writer writer + ) throws java.io.IOException { String separator = ""; int size = fields.size(); boolean wrapRecords = format.wrapSingleColumnRecords() || size > 1; @@ -836,7 +841,13 @@ abstract class AbstractResult extends AbstractFormattable impl writer.append('}'); } - static final void formatJSONArray0(Record record, AbstractRow fields, JSONFormat format, int recordLevel, Writer writer) throws java.io.IOException { + static final void formatJSONArray0( + Record record, + AbstractRow fields, + JSONFormat format, + int recordLevel, + Writer writer + ) throws java.io.IOException { String separator = ""; int size = fields.size(); @@ -936,7 +947,7 @@ abstract class AbstractResult extends AbstractFormattable impl XMLFormat format, int recordLevel, Record record, - AbstractRow fields + AbstractRow fields ) throws java.io.IOException { String newline = format.newline(); diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractResultQuery.java b/jOOQ/src/main/java/org/jooq/impl/AbstractResultQuery.java index 82fe419c17..49a2592997 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractResultQuery.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractResultQuery.java @@ -60,27 +60,6 @@ import org.jooq.Field; import org.jooq.Name; import org.jooq.Record; import org.jooq.Record1; -import org.jooq.Record10; -import org.jooq.Record11; -import org.jooq.Record12; -import org.jooq.Record13; -import org.jooq.Record14; -import org.jooq.Record15; -import org.jooq.Record16; -import org.jooq.Record17; -import org.jooq.Record18; -import org.jooq.Record19; -import org.jooq.Record2; -import org.jooq.Record20; -import org.jooq.Record21; -import org.jooq.Record22; -import org.jooq.Record3; -import org.jooq.Record4; -import org.jooq.Record5; -import org.jooq.Record6; -import org.jooq.Record7; -import org.jooq.Record8; -import org.jooq.Record9; import org.jooq.Result; import org.jooq.ResultQuery; import org.jooq.Results; diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractRow.java b/jOOQ/src/main/java/org/jooq/impl/AbstractRow.java index 4c2de8a51d..eb4e56c697 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractRow.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractRow.java @@ -43,23 +43,30 @@ import static org.jooq.impl.Keywords.K_ROW; import static org.jooq.impl.QueryPartListView.wrap; import java.util.Collection; +import java.util.function.Function; import java.util.stream.Stream; +import org.jooq.Binding; import org.jooq.Clause; +import org.jooq.Comment; import org.jooq.Condition; +import org.jooq.Configuration; import org.jooq.Context; +import org.jooq.Converter; import org.jooq.DataType; import org.jooq.Field; import org.jooq.Name; +import org.jooq.Record; import org.jooq.Row; import org.jooq.Row1; import org.jooq.Row2; +import org.jooq.SelectField; /** * A common base class for the various degrees of {@link Row1}, {@link Row2}, * etc. */ -abstract class AbstractRow extends AbstractQueryPart implements Row { +abstract class AbstractRow extends AbstractQueryPart implements Row, SelectField { /** * Generated UID @@ -67,7 +74,7 @@ abstract class AbstractRow extends AbstractQueryPart implements Row { private static final long serialVersionUID = 2175082265665049629L; private static final Clause[] CLAUSES = { FIELD_ROW }; - final FieldsImpl fields; + final FieldsImpl fields; AbstractRow(Field... fields) { this(new FieldsImpl<>(fields)); @@ -77,12 +84,70 @@ abstract class AbstractRow extends AbstractQueryPart implements Row { this(new FieldsImpl<>(fields)); } - AbstractRow(FieldsImpl fields) { + AbstractRow(FieldsImpl fields) { super(); this.fields = fields; } + // ------------------------------------------------------------------------ + // XXX: SelectField API + // ------------------------------------------------------------------------ + + private final RowField rf() { + return new RowField(this); + } + + @Override + public Converter getConverter() { + return rf().getConverter(); + } + + @Override + public Binding getBinding() { + return rf().getBinding(); + } + + @Override + public Class getType() { + return rf().getType(); + } + + @Override + public DataType getDataType() { + return rf().getDataType(); + } + + @Override + public DataType getDataType(Configuration configuration) { + return rf().getDataType(configuration); + } + + @Override + public String getName() { + return rf().getName(); + } + + @Override + public Name getQualifiedName() { + return rf().getQualifiedName(); + } + + @Override + public Name getUnqualifiedName() { + return rf().getUnqualifiedName(); + } + + @Override + public String getComment() { + return rf().getComment(); + } + + @Override + public Comment getCommentPart() { + return rf().getCommentPart(); + } + /** * [#8517] Convert the bind values in this row to the types of columns of another row */ diff --git a/jOOQ/src/main/java/org/jooq/impl/ArrayRecordImpl.java b/jOOQ/src/main/java/org/jooq/impl/ArrayRecordImpl.java index 1cce15b7e4..427b76f640 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ArrayRecordImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ArrayRecordImpl.java @@ -40,9 +40,6 @@ package org.jooq.impl; -import static org.jooq.impl.Tools.map; - - diff --git a/jOOQ/src/main/java/org/jooq/impl/ArraySelect.java b/jOOQ/src/main/java/org/jooq/impl/ArraySelect.java index f7ea910dc1..4582bb3081 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ArraySelect.java +++ b/jOOQ/src/main/java/org/jooq/impl/ArraySelect.java @@ -37,32 +37,18 @@ */ package org.jooq.impl; -// ... -// ... -// ... -import static org.jooq.SQLDialect.POSTGRES; import static org.jooq.impl.DSL.arrayAgg; import static org.jooq.impl.Keywords.K_ARRAY; -import static org.jooq.impl.Keywords.K_INT; import static org.jooq.impl.Names.N_ARRAY; -import static org.jooq.impl.QueryPartListView.wrap; -import static org.jooq.impl.Tools.selectQueryImpl; import static org.jooq.impl.Tools.visitSubquery; -import java.util.Collection; -import java.util.Set; - import org.jooq.Context; import org.jooq.DataType; import org.jooq.Field; import org.jooq.Record1; -import org.jooq.SQLDialect; import org.jooq.Select; import org.jooq.Table; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - /** * @author Lukas Eder */ diff --git a/jOOQ/src/main/java/org/jooq/impl/CatalogImpl.java b/jOOQ/src/main/java/org/jooq/impl/CatalogImpl.java index 342588b558..11136534de 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CatalogImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/CatalogImpl.java @@ -39,9 +39,6 @@ package org.jooq.impl; import static org.jooq.Clause.CATALOG; import static org.jooq.Clause.CATALOG_REFERENCE; -import static org.jooq.impl.CatalogImpl.DEFAULT_CATALOG; -import static org.jooq.impl.Tools.findAny; -import static org.jooq.tools.StringUtils.defaultIfNull; import java.util.Collections; import java.util.List; diff --git a/jOOQ/src/main/java/org/jooq/impl/CursorImpl.java b/jOOQ/src/main/java/org/jooq/impl/CursorImpl.java index 1fe4394c19..8094be2306 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CursorImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/CursorImpl.java @@ -115,7 +115,7 @@ final class CursorImpl extends AbstractCursor { } CursorImpl(ExecuteContext ctx, ExecuteListener listener, Field[] fields, int[] internIndexes, boolean keepStatement, boolean keepResultSet, Class type, int maxRows, boolean autoclosing) { - super(ctx.configuration(), Tools.row0(fields)); + super(ctx.configuration(), (AbstractRow) Tools.row0(fields)); this.ctx = ctx; this.listener = (listener != null ? listener : ExecuteListeners.getAndStart(ctx)); @@ -1455,10 +1455,10 @@ final class CursorImpl extends AbstractCursor { private class CursorRecordInitialiser implements ThrowingFunction { - private final AbstractRow initialiserFields; - private int offset; + private final AbstractRow initialiserFields; + private int offset; - CursorRecordInitialiser(AbstractRow initialiserFields, int offset) { + CursorRecordInitialiser(AbstractRow initialiserFields, int offset) { this.initialiserFields = initialiserFields; this.offset = offset; } @@ -1514,7 +1514,7 @@ final class CursorImpl extends AbstractCursor { private final void setValue(AbstractRecord record, Field field, int index) throws SQLException { try { T value; - AbstractRow nested = null; + AbstractRow nested = null; Class recordType = null; if (field instanceof RowField) { @@ -1528,7 +1528,7 @@ final class CursorImpl extends AbstractCursor { } if (nested != null) { - value = (T) Tools.newRecord(true, (Class) recordType, nested, ((DefaultExecuteContext) ctx).originalConfiguration()) + value = (T) Tools.newRecord(true, (Class) recordType, (AbstractRow) nested, ((DefaultExecuteContext) ctx).originalConfiguration()) .operate(new CursorRecordInitialiser(nested, offset + index)); offset += nested.size() - 1; diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index f38bddb383..639a985023 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -14791,287 +14791,221 @@ public class DSL { /** - * EXPERIMENTAL: Turn a row value expression of degree 1 into a {@code Field}. - *

- * Note: Not all databases support row value expressions, but many row value - * expression operations can be emulated on all databases. See relevant row - * value expression method Javadocs for details. + * @deprecated - [#11812] - 3.15.0 - Use {@link Row1} as a {@link SelectField} directly, instead. */ @NotNull @Support + @Deprecated public static Field> rowField(Row1 row) { return new RowField<>(row); } /** - * EXPERIMENTAL: Turn a row value expression of degree 2 into a {@code Field}. - *

- * Note: Not all databases support row value expressions, but many row value - * expression operations can be emulated on all databases. See relevant row - * value expression method Javadocs for details. + * @deprecated - [#11812] - 3.15.0 - Use {@link Row2} as a {@link SelectField} directly, instead. */ @NotNull @Support + @Deprecated public static Field> rowField(Row2 row) { return new RowField<>(row); } /** - * EXPERIMENTAL: Turn a row value expression of degree 3 into a {@code Field}. - *

- * Note: Not all databases support row value expressions, but many row value - * expression operations can be emulated on all databases. See relevant row - * value expression method Javadocs for details. + * @deprecated - [#11812] - 3.15.0 - Use {@link Row3} as a {@link SelectField} directly, instead. */ @NotNull @Support + @Deprecated public static Field> rowField(Row3 row) { return new RowField<>(row); } /** - * EXPERIMENTAL: Turn a row value expression of degree 4 into a {@code Field}. - *

- * Note: Not all databases support row value expressions, but many row value - * expression operations can be emulated on all databases. See relevant row - * value expression method Javadocs for details. + * @deprecated - [#11812] - 3.15.0 - Use {@link Row4} as a {@link SelectField} directly, instead. */ @NotNull @Support + @Deprecated public static Field> rowField(Row4 row) { return new RowField<>(row); } /** - * EXPERIMENTAL: Turn a row value expression of degree 5 into a {@code Field}. - *

- * Note: Not all databases support row value expressions, but many row value - * expression operations can be emulated on all databases. See relevant row - * value expression method Javadocs for details. + * @deprecated - [#11812] - 3.15.0 - Use {@link Row5} as a {@link SelectField} directly, instead. */ @NotNull @Support + @Deprecated public static Field> rowField(Row5 row) { return new RowField<>(row); } /** - * EXPERIMENTAL: Turn a row value expression of degree 6 into a {@code Field}. - *

- * Note: Not all databases support row value expressions, but many row value - * expression operations can be emulated on all databases. See relevant row - * value expression method Javadocs for details. + * @deprecated - [#11812] - 3.15.0 - Use {@link Row6} as a {@link SelectField} directly, instead. */ @NotNull @Support + @Deprecated public static Field> rowField(Row6 row) { return new RowField<>(row); } /** - * EXPERIMENTAL: Turn a row value expression of degree 7 into a {@code Field}. - *

- * Note: Not all databases support row value expressions, but many row value - * expression operations can be emulated on all databases. See relevant row - * value expression method Javadocs for details. + * @deprecated - [#11812] - 3.15.0 - Use {@link Row7} as a {@link SelectField} directly, instead. */ @NotNull @Support + @Deprecated public static Field> rowField(Row7 row) { return new RowField<>(row); } /** - * EXPERIMENTAL: Turn a row value expression of degree 8 into a {@code Field}. - *

- * Note: Not all databases support row value expressions, but many row value - * expression operations can be emulated on all databases. See relevant row - * value expression method Javadocs for details. + * @deprecated - [#11812] - 3.15.0 - Use {@link Row8} as a {@link SelectField} directly, instead. */ @NotNull @Support + @Deprecated public static Field> rowField(Row8 row) { return new RowField<>(row); } /** - * EXPERIMENTAL: Turn a row value expression of degree 9 into a {@code Field}. - *

- * Note: Not all databases support row value expressions, but many row value - * expression operations can be emulated on all databases. See relevant row - * value expression method Javadocs for details. + * @deprecated - [#11812] - 3.15.0 - Use {@link Row9} as a {@link SelectField} directly, instead. */ @NotNull @Support + @Deprecated public static Field> rowField(Row9 row) { return new RowField<>(row); } /** - * EXPERIMENTAL: Turn a row value expression of degree 10 into a {@code Field}. - *

- * Note: Not all databases support row value expressions, but many row value - * expression operations can be emulated on all databases. See relevant row - * value expression method Javadocs for details. + * @deprecated - [#11812] - 3.15.0 - Use {@link Row10} as a {@link SelectField} directly, instead. */ @NotNull @Support + @Deprecated public static Field> rowField(Row10 row) { return new RowField<>(row); } /** - * EXPERIMENTAL: Turn a row value expression of degree 11 into a {@code Field}. - *

- * Note: Not all databases support row value expressions, but many row value - * expression operations can be emulated on all databases. See relevant row - * value expression method Javadocs for details. + * @deprecated - [#11812] - 3.15.0 - Use {@link Row11} as a {@link SelectField} directly, instead. */ @NotNull @Support + @Deprecated public static Field> rowField(Row11 row) { return new RowField<>(row); } /** - * EXPERIMENTAL: Turn a row value expression of degree 12 into a {@code Field}. - *

- * Note: Not all databases support row value expressions, but many row value - * expression operations can be emulated on all databases. See relevant row - * value expression method Javadocs for details. + * @deprecated - [#11812] - 3.15.0 - Use {@link Row12} as a {@link SelectField} directly, instead. */ @NotNull @Support + @Deprecated public static Field> rowField(Row12 row) { return new RowField<>(row); } /** - * EXPERIMENTAL: Turn a row value expression of degree 13 into a {@code Field}. - *

- * Note: Not all databases support row value expressions, but many row value - * expression operations can be emulated on all databases. See relevant row - * value expression method Javadocs for details. + * @deprecated - [#11812] - 3.15.0 - Use {@link Row13} as a {@link SelectField} directly, instead. */ @NotNull @Support + @Deprecated public static Field> rowField(Row13 row) { return new RowField<>(row); } /** - * EXPERIMENTAL: Turn a row value expression of degree 14 into a {@code Field}. - *

- * Note: Not all databases support row value expressions, but many row value - * expression operations can be emulated on all databases. See relevant row - * value expression method Javadocs for details. + * @deprecated - [#11812] - 3.15.0 - Use {@link Row14} as a {@link SelectField} directly, instead. */ @NotNull @Support + @Deprecated public static Field> rowField(Row14 row) { return new RowField<>(row); } /** - * EXPERIMENTAL: Turn a row value expression of degree 15 into a {@code Field}. - *

- * Note: Not all databases support row value expressions, but many row value - * expression operations can be emulated on all databases. See relevant row - * value expression method Javadocs for details. + * @deprecated - [#11812] - 3.15.0 - Use {@link Row15} as a {@link SelectField} directly, instead. */ @NotNull @Support + @Deprecated public static Field> rowField(Row15 row) { return new RowField<>(row); } /** - * EXPERIMENTAL: Turn a row value expression of degree 16 into a {@code Field}. - *

- * Note: Not all databases support row value expressions, but many row value - * expression operations can be emulated on all databases. See relevant row - * value expression method Javadocs for details. + * @deprecated - [#11812] - 3.15.0 - Use {@link Row16} as a {@link SelectField} directly, instead. */ @NotNull @Support + @Deprecated public static Field> rowField(Row16 row) { return new RowField<>(row); } /** - * EXPERIMENTAL: Turn a row value expression of degree 17 into a {@code Field}. - *

- * Note: Not all databases support row value expressions, but many row value - * expression operations can be emulated on all databases. See relevant row - * value expression method Javadocs for details. + * @deprecated - [#11812] - 3.15.0 - Use {@link Row17} as a {@link SelectField} directly, instead. */ @NotNull @Support + @Deprecated public static Field> rowField(Row17 row) { return new RowField<>(row); } /** - * EXPERIMENTAL: Turn a row value expression of degree 18 into a {@code Field}. - *

- * Note: Not all databases support row value expressions, but many row value - * expression operations can be emulated on all databases. See relevant row - * value expression method Javadocs for details. + * @deprecated - [#11812] - 3.15.0 - Use {@link Row18} as a {@link SelectField} directly, instead. */ @NotNull @Support + @Deprecated public static Field> rowField(Row18 row) { return new RowField<>(row); } /** - * EXPERIMENTAL: Turn a row value expression of degree 19 into a {@code Field}. - *

- * Note: Not all databases support row value expressions, but many row value - * expression operations can be emulated on all databases. See relevant row - * value expression method Javadocs for details. + * @deprecated - [#11812] - 3.15.0 - Use {@link Row19} as a {@link SelectField} directly, instead. */ @NotNull @Support + @Deprecated public static Field> rowField(Row19 row) { return new RowField<>(row); } /** - * EXPERIMENTAL: Turn a row value expression of degree 20 into a {@code Field}. - *

- * Note: Not all databases support row value expressions, but many row value - * expression operations can be emulated on all databases. See relevant row - * value expression method Javadocs for details. + * @deprecated - [#11812] - 3.15.0 - Use {@link Row20} as a {@link SelectField} directly, instead. */ @NotNull @Support + @Deprecated public static Field> rowField(Row20 row) { return new RowField<>(row); } /** - * EXPERIMENTAL: Turn a row value expression of degree 21 into a {@code Field}. - *

- * Note: Not all databases support row value expressions, but many row value - * expression operations can be emulated on all databases. See relevant row - * value expression method Javadocs for details. + * @deprecated - [#11812] - 3.15.0 - Use {@link Row21} as a {@link SelectField} directly, instead. */ @NotNull @Support + @Deprecated public static Field> rowField(Row21 row) { return new RowField<>(row); } /** - * EXPERIMENTAL: Turn a row value expression of degree 22 into a {@code Field}. - *

- * Note: Not all databases support row value expressions, but many row value - * expression operations can be emulated on all databases. See relevant row - * value expression method Javadocs for details. + * @deprecated - [#11812] - 3.15.0 - Use {@link Row22} as a {@link SelectField} directly, instead. */ @NotNull @Support + @Deprecated public static Field> rowField(Row22 row) { return new RowField<>(row); } diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java b/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java index 9dcf41b3f8..20296d623c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java @@ -3658,7 +3658,7 @@ public class DefaultBinding implements Binding { * @return The converted {@link UDTRecord} */ @SuppressWarnings("unchecked") - static final Record pgNewRecord(Class type, AbstractRow fields, final Object object) { + static final Record pgNewRecord(Class type, AbstractRow fields, final Object object) { if (object == null) return null; @@ -3674,7 +3674,7 @@ public class DefaultBinding implements Binding { // - Temporal data // - Everything else: VARCHAR if (fields == null && Record.class.isAssignableFrom(type)) - fields = Tools.row0(Tools.fields(values.size(), SQLDataType.VARCHAR)); + fields = (AbstractRow) Tools.row0(Tools.fields(values.size(), SQLDataType.VARCHAR)); return Tools.newRecord(true, (Class) type, fields) .operate(record -> { diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultConverterProvider.java b/jOOQ/src/main/java/org/jooq/impl/DefaultConverterProvider.java index 7148f84069..83f90c7ec2 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultConverterProvider.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultConverterProvider.java @@ -76,7 +76,6 @@ public final class DefaultConverterProvider implements ConverterProvider, Serial */ private static final long serialVersionUID = 2937225066265868374L; - @SuppressWarnings("unchecked") @Nullable @Override public final Converter provide(final Class tType, final Class uType) { diff --git a/jOOQ/src/main/java/org/jooq/impl/EmbeddableRecordImpl.java b/jOOQ/src/main/java/org/jooq/impl/EmbeddableRecordImpl.java index 2f6a8c7756..38fb770ebb 100644 --- a/jOOQ/src/main/java/org/jooq/impl/EmbeddableRecordImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/EmbeddableRecordImpl.java @@ -78,7 +78,7 @@ public class EmbeddableRecordImpl> extends Abstrac } public EmbeddableRecordImpl(Row fields) { - super((AbstractRow) fields); + super((AbstractRow) fields); } @SuppressWarnings("unchecked") diff --git a/jOOQ/src/main/java/org/jooq/impl/EmbeddableTableField.java b/jOOQ/src/main/java/org/jooq/impl/EmbeddableTableField.java index 61a2421584..c2fd8a9d54 100644 --- a/jOOQ/src/main/java/org/jooq/impl/EmbeddableTableField.java +++ b/jOOQ/src/main/java/org/jooq/impl/EmbeddableTableField.java @@ -62,7 +62,7 @@ implements TableField { final Class recordType; final boolean replacesFields; final Table table; - final AbstractRow fieldsRow; + final AbstractRow fieldsRow; /** * @deprecated - [#11058] - 3.14.5 - This will be removed in the future. */ diff --git a/jOOQ/src/main/java/org/jooq/impl/R2DBC.java b/jOOQ/src/main/java/org/jooq/impl/R2DBC.java index 0416cb839d..9d1fb13b25 100644 --- a/jOOQ/src/main/java/org/jooq/impl/R2DBC.java +++ b/jOOQ/src/main/java/org/jooq/impl/R2DBC.java @@ -40,11 +40,9 @@ package org.jooq.impl; // ... import static org.jooq.conf.ParamType.NAMED; import static org.jooq.impl.Internal.subscriber; -import static org.jooq.impl.Tools.EMPTY_FIELD; import static org.jooq.impl.Tools.EMPTY_PARAM; import static org.jooq.impl.Tools.abstractDMLQuery; import static org.jooq.impl.Tools.abstractResultQuery; -import static org.jooq.impl.Tools.fieldNameStrings; import static org.jooq.impl.Tools.fields; import static org.jooq.impl.Tools.recordFactory; import static org.jooq.impl.Tools.visitAll; @@ -308,7 +306,7 @@ final class R2DBC { // TODO: This call is duplicated from CursorImpl and related classes. // Refactor this call to make sure code is re-used, especially when // ExecuteListener lifecycle management is implemented - RecordDelegate delegate = Tools.newRecord(true, (Supplier) recordFactory(query.getRecordType(), Tools.row0(fields)), query.configuration()); + RecordDelegate delegate = Tools.newRecord(true, (Supplier) recordFactory(query.getRecordType(), Tools.row0(fields)), query.configuration()); return (R) delegate.operate(record -> { diff --git a/jOOQ/src/main/java/org/jooq/impl/RecordImpl1.java b/jOOQ/src/main/java/org/jooq/impl/RecordImpl1.java index 2abc882232..723d5a7811 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RecordImpl1.java +++ b/jOOQ/src/main/java/org/jooq/impl/RecordImpl1.java @@ -59,7 +59,7 @@ final class RecordImpl1 extends AbstractRecord implements InternalRecord, Re */ private static final long serialVersionUID = -2201346180421463830L; - RecordImpl1(AbstractRow row) { + RecordImpl1(AbstractRow row) { super(row); } diff --git a/jOOQ/src/main/java/org/jooq/impl/RecordImpl10.java b/jOOQ/src/main/java/org/jooq/impl/RecordImpl10.java index f6ebcade2d..87e71ae028 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RecordImpl10.java +++ b/jOOQ/src/main/java/org/jooq/impl/RecordImpl10.java @@ -59,7 +59,7 @@ final class RecordImpl10 extends Abstra */ private static final long serialVersionUID = -2201346180421463830L; - RecordImpl10(AbstractRow row) { + RecordImpl10(AbstractRow row) { super(row); } diff --git a/jOOQ/src/main/java/org/jooq/impl/RecordImpl11.java b/jOOQ/src/main/java/org/jooq/impl/RecordImpl11.java index d54b6ba1af..b68bcd1bd3 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RecordImpl11.java +++ b/jOOQ/src/main/java/org/jooq/impl/RecordImpl11.java @@ -59,7 +59,7 @@ final class RecordImpl11 extends A */ private static final long serialVersionUID = -2201346180421463830L; - RecordImpl11(AbstractRow row) { + RecordImpl11(AbstractRow row) { super(row); } diff --git a/jOOQ/src/main/java/org/jooq/impl/RecordImpl12.java b/jOOQ/src/main/java/org/jooq/impl/RecordImpl12.java index ebfc078591..3dc34e28a2 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RecordImpl12.java +++ b/jOOQ/src/main/java/org/jooq/impl/RecordImpl12.java @@ -59,7 +59,7 @@ final class RecordImpl12 exte */ private static final long serialVersionUID = -2201346180421463830L; - RecordImpl12(AbstractRow row) { + RecordImpl12(AbstractRow row) { super(row); } diff --git a/jOOQ/src/main/java/org/jooq/impl/RecordImpl13.java b/jOOQ/src/main/java/org/jooq/impl/RecordImpl13.java index 2060493530..ce80dd69b4 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RecordImpl13.java +++ b/jOOQ/src/main/java/org/jooq/impl/RecordImpl13.java @@ -59,7 +59,7 @@ final class RecordImpl13 */ private static final long serialVersionUID = -2201346180421463830L; - RecordImpl13(AbstractRow row) { + RecordImpl13(AbstractRow row) { super(row); } diff --git a/jOOQ/src/main/java/org/jooq/impl/RecordImpl14.java b/jOOQ/src/main/java/org/jooq/impl/RecordImpl14.java index f8d42efee2..10e66967bf 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RecordImpl14.java +++ b/jOOQ/src/main/java/org/jooq/impl/RecordImpl14.java @@ -59,7 +59,7 @@ final class RecordImpl14 row) { super(row); } diff --git a/jOOQ/src/main/java/org/jooq/impl/RecordImpl15.java b/jOOQ/src/main/java/org/jooq/impl/RecordImpl15.java index 11b7ada5cd..ac0fda9d01 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RecordImpl15.java +++ b/jOOQ/src/main/java/org/jooq/impl/RecordImpl15.java @@ -59,7 +59,7 @@ final class RecordImpl15 row) { super(row); } diff --git a/jOOQ/src/main/java/org/jooq/impl/RecordImpl16.java b/jOOQ/src/main/java/org/jooq/impl/RecordImpl16.java index 750d4a1d61..7816cfd488 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RecordImpl16.java +++ b/jOOQ/src/main/java/org/jooq/impl/RecordImpl16.java @@ -59,7 +59,7 @@ final class RecordImpl16 row) { super(row); } diff --git a/jOOQ/src/main/java/org/jooq/impl/RecordImpl17.java b/jOOQ/src/main/java/org/jooq/impl/RecordImpl17.java index 643243e911..37b49c75d5 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RecordImpl17.java +++ b/jOOQ/src/main/java/org/jooq/impl/RecordImpl17.java @@ -59,7 +59,7 @@ final class RecordImpl17 row) { super(row); } diff --git a/jOOQ/src/main/java/org/jooq/impl/RecordImpl18.java b/jOOQ/src/main/java/org/jooq/impl/RecordImpl18.java index ba46b7b7a3..c241499678 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RecordImpl18.java +++ b/jOOQ/src/main/java/org/jooq/impl/RecordImpl18.java @@ -59,7 +59,7 @@ final class RecordImpl18 row) { super(row); } diff --git a/jOOQ/src/main/java/org/jooq/impl/RecordImpl19.java b/jOOQ/src/main/java/org/jooq/impl/RecordImpl19.java index 7e8e582ffd..63e3d1b5c7 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RecordImpl19.java +++ b/jOOQ/src/main/java/org/jooq/impl/RecordImpl19.java @@ -59,7 +59,7 @@ final class RecordImpl19 row) { super(row); } diff --git a/jOOQ/src/main/java/org/jooq/impl/RecordImpl2.java b/jOOQ/src/main/java/org/jooq/impl/RecordImpl2.java index ca13b897d8..30d61e830b 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RecordImpl2.java +++ b/jOOQ/src/main/java/org/jooq/impl/RecordImpl2.java @@ -59,7 +59,7 @@ final class RecordImpl2 extends AbstractRecord implements InternalRecord */ private static final long serialVersionUID = -2201346180421463830L; - RecordImpl2(AbstractRow row) { + RecordImpl2(AbstractRow row) { super(row); } diff --git a/jOOQ/src/main/java/org/jooq/impl/RecordImpl20.java b/jOOQ/src/main/java/org/jooq/impl/RecordImpl20.java index def21c0a4c..04a747a816 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RecordImpl20.java +++ b/jOOQ/src/main/java/org/jooq/impl/RecordImpl20.java @@ -59,7 +59,7 @@ final class RecordImpl20 row) { super(row); } diff --git a/jOOQ/src/main/java/org/jooq/impl/RecordImpl21.java b/jOOQ/src/main/java/org/jooq/impl/RecordImpl21.java index 2c8c88ff99..5e17bea011 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RecordImpl21.java +++ b/jOOQ/src/main/java/org/jooq/impl/RecordImpl21.java @@ -59,7 +59,7 @@ final class RecordImpl21 row) { super(row); } diff --git a/jOOQ/src/main/java/org/jooq/impl/RecordImpl22.java b/jOOQ/src/main/java/org/jooq/impl/RecordImpl22.java index 5adb6348f5..ad60a4dd38 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RecordImpl22.java +++ b/jOOQ/src/main/java/org/jooq/impl/RecordImpl22.java @@ -59,7 +59,7 @@ final class RecordImpl22 row) { super(row); } diff --git a/jOOQ/src/main/java/org/jooq/impl/RecordImpl3.java b/jOOQ/src/main/java/org/jooq/impl/RecordImpl3.java index b66b89adbe..c01dbf9516 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RecordImpl3.java +++ b/jOOQ/src/main/java/org/jooq/impl/RecordImpl3.java @@ -59,7 +59,7 @@ final class RecordImpl3 extends AbstractRecord implements InternalRe */ private static final long serialVersionUID = -2201346180421463830L; - RecordImpl3(AbstractRow row) { + RecordImpl3(AbstractRow row) { super(row); } diff --git a/jOOQ/src/main/java/org/jooq/impl/RecordImpl4.java b/jOOQ/src/main/java/org/jooq/impl/RecordImpl4.java index e254c61eea..2146480065 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RecordImpl4.java +++ b/jOOQ/src/main/java/org/jooq/impl/RecordImpl4.java @@ -59,7 +59,7 @@ final class RecordImpl4 extends AbstractRecord implements Intern */ private static final long serialVersionUID = -2201346180421463830L; - RecordImpl4(AbstractRow row) { + RecordImpl4(AbstractRow row) { super(row); } diff --git a/jOOQ/src/main/java/org/jooq/impl/RecordImpl5.java b/jOOQ/src/main/java/org/jooq/impl/RecordImpl5.java index 09dfbcddef..f602894b5c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RecordImpl5.java +++ b/jOOQ/src/main/java/org/jooq/impl/RecordImpl5.java @@ -59,7 +59,7 @@ final class RecordImpl5 extends AbstractRecord implements In */ private static final long serialVersionUID = -2201346180421463830L; - RecordImpl5(AbstractRow row) { + RecordImpl5(AbstractRow row) { super(row); } diff --git a/jOOQ/src/main/java/org/jooq/impl/RecordImpl6.java b/jOOQ/src/main/java/org/jooq/impl/RecordImpl6.java index e587d16574..4aae833b64 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RecordImpl6.java +++ b/jOOQ/src/main/java/org/jooq/impl/RecordImpl6.java @@ -59,7 +59,7 @@ final class RecordImpl6 extends AbstractRecord implement */ private static final long serialVersionUID = -2201346180421463830L; - RecordImpl6(AbstractRow row) { + RecordImpl6(AbstractRow row) { super(row); } diff --git a/jOOQ/src/main/java/org/jooq/impl/RecordImpl7.java b/jOOQ/src/main/java/org/jooq/impl/RecordImpl7.java index c77ac94172..6a25328b09 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RecordImpl7.java +++ b/jOOQ/src/main/java/org/jooq/impl/RecordImpl7.java @@ -59,7 +59,7 @@ final class RecordImpl7 extends AbstractRecord imple */ private static final long serialVersionUID = -2201346180421463830L; - RecordImpl7(AbstractRow row) { + RecordImpl7(AbstractRow row) { super(row); } diff --git a/jOOQ/src/main/java/org/jooq/impl/RecordImpl8.java b/jOOQ/src/main/java/org/jooq/impl/RecordImpl8.java index 56fd9991dd..e0ae7ce1e9 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RecordImpl8.java +++ b/jOOQ/src/main/java/org/jooq/impl/RecordImpl8.java @@ -59,7 +59,7 @@ final class RecordImpl8 extends AbstractRecord i */ private static final long serialVersionUID = -2201346180421463830L; - RecordImpl8(AbstractRow row) { + RecordImpl8(AbstractRow row) { super(row); } diff --git a/jOOQ/src/main/java/org/jooq/impl/RecordImpl9.java b/jOOQ/src/main/java/org/jooq/impl/RecordImpl9.java index 7ab64d8f81..a6a4fdcf48 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RecordImpl9.java +++ b/jOOQ/src/main/java/org/jooq/impl/RecordImpl9.java @@ -59,7 +59,7 @@ final class RecordImpl9 extends AbstractReco */ private static final long serialVersionUID = -2201346180421463830L; - RecordImpl9(AbstractRow row) { + RecordImpl9(AbstractRow row) { super(row); } diff --git a/jOOQ/src/main/java/org/jooq/impl/RecordImplN.java b/jOOQ/src/main/java/org/jooq/impl/RecordImplN.java index ef4c9ec617..10e717bf95 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RecordImplN.java +++ b/jOOQ/src/main/java/org/jooq/impl/RecordImplN.java @@ -58,7 +58,7 @@ final class RecordImplN extends AbstractRecord implements InternalRecord { */ private static final long serialVersionUID = -2201346180421463830L; - RecordImplN(AbstractRow row) { + RecordImplN(AbstractRow row) { super(row); } diff --git a/jOOQ/src/main/java/org/jooq/impl/ResultAsCursor.java b/jOOQ/src/main/java/org/jooq/impl/ResultAsCursor.java index 65aa45d7bd..8276a6f6e9 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ResultAsCursor.java +++ b/jOOQ/src/main/java/org/jooq/impl/ResultAsCursor.java @@ -55,8 +55,9 @@ final class ResultAsCursor extends AbstractCursor { private final Result result; private int index; + @SuppressWarnings("unchecked") ResultAsCursor(Result result) { - super(result.configuration(), (AbstractRow) result.fieldsRow()); + super(result.configuration(), (AbstractRow) result.fieldsRow()); this.result = result; } diff --git a/jOOQ/src/main/java/org/jooq/impl/RowField.java b/jOOQ/src/main/java/org/jooq/impl/RowField.java index 8544d363af..5782a12aab 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowField.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowField.java @@ -59,10 +59,10 @@ final class RowField extends AbstractField< /** * Generated UID */ - private static final long serialVersionUID = -2065258332642911588L; + private static final long serialVersionUID = -2065258332642911588L; - private final ROW row; - private final AbstractRow emulatedFields; + private final ROW row; + private final AbstractRow emulatedFields; RowField(ROW row) { this(row, N_ROW); @@ -86,10 +86,10 @@ final class RowField extends AbstractField< })); this.row = row; - this.emulatedFields = row0(map(row.fields(), x -> x.as(as + "." + x.getName()), Field[]::new)); + this.emulatedFields = (AbstractRow) row0(map(row.fields(), x -> x.as(as + "." + x.getName()), Field[]::new)); } - AbstractRow emulatedFields() { + AbstractRow emulatedFields() { return emulatedFields; } diff --git a/jOOQ/src/main/java/org/jooq/impl/RowImpl1.java b/jOOQ/src/main/java/org/jooq/impl/RowImpl1.java index 2f61580b3e..6888aa9165 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowImpl1.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowImpl1.java @@ -60,7 +60,7 @@ import org.jooq.Statement; * @author Lukas Eder */ @SuppressWarnings({ "rawtypes", "unchecked" }) -final class RowImpl1 extends AbstractRow implements Row1 { +final class RowImpl1 extends AbstractRow> implements Row1 { /** * Generated UID @@ -72,7 +72,7 @@ final class RowImpl1 extends AbstractRow implements Row1 { } RowImpl1(FieldsImpl fields) { - super(fields); + super((FieldsImpl) fields); } // ------------------------------------------------------------------------ diff --git a/jOOQ/src/main/java/org/jooq/impl/RowImpl10.java b/jOOQ/src/main/java/org/jooq/impl/RowImpl10.java index a70b9157ca..d20a649c19 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowImpl10.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowImpl10.java @@ -60,7 +60,7 @@ import org.jooq.Statement; * @author Lukas Eder */ @SuppressWarnings({ "rawtypes", "unchecked" }) -final class RowImpl10 extends AbstractRow implements Row10 { +final class RowImpl10 extends AbstractRow> implements Row10 { /** * Generated UID @@ -72,7 +72,7 @@ final class RowImpl10 extends AbstractR } RowImpl10(FieldsImpl fields) { - super(fields); + super((FieldsImpl) fields); } // ------------------------------------------------------------------------ diff --git a/jOOQ/src/main/java/org/jooq/impl/RowImpl11.java b/jOOQ/src/main/java/org/jooq/impl/RowImpl11.java index 373ba75ddc..8333ebe0d7 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowImpl11.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowImpl11.java @@ -60,7 +60,7 @@ import org.jooq.Statement; * @author Lukas Eder */ @SuppressWarnings({ "rawtypes", "unchecked" }) -final class RowImpl11 extends AbstractRow implements Row11 { +final class RowImpl11 extends AbstractRow> implements Row11 { /** * Generated UID @@ -72,7 +72,7 @@ final class RowImpl11 extends Abst } RowImpl11(FieldsImpl fields) { - super(fields); + super((FieldsImpl) fields); } // ------------------------------------------------------------------------ diff --git a/jOOQ/src/main/java/org/jooq/impl/RowImpl12.java b/jOOQ/src/main/java/org/jooq/impl/RowImpl12.java index 69514ef54a..909660a1c6 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowImpl12.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowImpl12.java @@ -60,7 +60,7 @@ import org.jooq.Statement; * @author Lukas Eder */ @SuppressWarnings({ "rawtypes", "unchecked" }) -final class RowImpl12 extends AbstractRow implements Row12 { +final class RowImpl12 extends AbstractRow> implements Row12 { /** * Generated UID @@ -72,7 +72,7 @@ final class RowImpl12 extends } RowImpl12(FieldsImpl fields) { - super(fields); + super((FieldsImpl) fields); } // ------------------------------------------------------------------------ diff --git a/jOOQ/src/main/java/org/jooq/impl/RowImpl13.java b/jOOQ/src/main/java/org/jooq/impl/RowImpl13.java index f1b9da517e..82ea2f29e6 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowImpl13.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowImpl13.java @@ -60,7 +60,7 @@ import org.jooq.Statement; * @author Lukas Eder */ @SuppressWarnings({ "rawtypes", "unchecked" }) -final class RowImpl13 extends AbstractRow implements Row13 { +final class RowImpl13 extends AbstractRow> implements Row13 { /** * Generated UID @@ -72,7 +72,7 @@ final class RowImpl13 ex } RowImpl13(FieldsImpl fields) { - super(fields); + super((FieldsImpl) fields); } // ------------------------------------------------------------------------ diff --git a/jOOQ/src/main/java/org/jooq/impl/RowImpl14.java b/jOOQ/src/main/java/org/jooq/impl/RowImpl14.java index 783fd22d7b..db94371d5d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowImpl14.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowImpl14.java @@ -60,7 +60,7 @@ import org.jooq.Statement; * @author Lukas Eder */ @SuppressWarnings({ "rawtypes", "unchecked" }) -final class RowImpl14 extends AbstractRow implements Row14 { +final class RowImpl14 extends AbstractRow> implements Row14 { /** * Generated UID @@ -72,7 +72,7 @@ final class RowImpl14 fields) { - super(fields); + super((FieldsImpl) fields); } // ------------------------------------------------------------------------ diff --git a/jOOQ/src/main/java/org/jooq/impl/RowImpl15.java b/jOOQ/src/main/java/org/jooq/impl/RowImpl15.java index 35429475df..50fc7cf351 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowImpl15.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowImpl15.java @@ -60,7 +60,7 @@ import org.jooq.Statement; * @author Lukas Eder */ @SuppressWarnings({ "rawtypes", "unchecked" }) -final class RowImpl15 extends AbstractRow implements Row15 { +final class RowImpl15 extends AbstractRow> implements Row15 { /** * Generated UID @@ -72,7 +72,7 @@ final class RowImpl15 fields) { - super(fields); + super((FieldsImpl) fields); } // ------------------------------------------------------------------------ diff --git a/jOOQ/src/main/java/org/jooq/impl/RowImpl16.java b/jOOQ/src/main/java/org/jooq/impl/RowImpl16.java index 3a9e9316b4..88f1fc08d7 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowImpl16.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowImpl16.java @@ -60,7 +60,7 @@ import org.jooq.Statement; * @author Lukas Eder */ @SuppressWarnings({ "rawtypes", "unchecked" }) -final class RowImpl16 extends AbstractRow implements Row16 { +final class RowImpl16 extends AbstractRow> implements Row16 { /** * Generated UID @@ -72,7 +72,7 @@ final class RowImpl16 fields) { - super(fields); + super((FieldsImpl) fields); } // ------------------------------------------------------------------------ diff --git a/jOOQ/src/main/java/org/jooq/impl/RowImpl17.java b/jOOQ/src/main/java/org/jooq/impl/RowImpl17.java index d498f7b8f7..9bfb13ce32 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowImpl17.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowImpl17.java @@ -60,7 +60,7 @@ import org.jooq.Statement; * @author Lukas Eder */ @SuppressWarnings({ "rawtypes", "unchecked" }) -final class RowImpl17 extends AbstractRow implements Row17 { +final class RowImpl17 extends AbstractRow> implements Row17 { /** * Generated UID @@ -72,7 +72,7 @@ final class RowImpl17 fields) { - super(fields); + super((FieldsImpl) fields); } // ------------------------------------------------------------------------ diff --git a/jOOQ/src/main/java/org/jooq/impl/RowImpl18.java b/jOOQ/src/main/java/org/jooq/impl/RowImpl18.java index 0edad244a6..332228131c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowImpl18.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowImpl18.java @@ -60,7 +60,7 @@ import org.jooq.Statement; * @author Lukas Eder */ @SuppressWarnings({ "rawtypes", "unchecked" }) -final class RowImpl18 extends AbstractRow implements Row18 { +final class RowImpl18 extends AbstractRow> implements Row18 { /** * Generated UID @@ -72,7 +72,7 @@ final class RowImpl18 fields) { - super(fields); + super((FieldsImpl) fields); } // ------------------------------------------------------------------------ diff --git a/jOOQ/src/main/java/org/jooq/impl/RowImpl19.java b/jOOQ/src/main/java/org/jooq/impl/RowImpl19.java index 2ca194a6e8..ecca79fdaf 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowImpl19.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowImpl19.java @@ -60,7 +60,7 @@ import org.jooq.Statement; * @author Lukas Eder */ @SuppressWarnings({ "rawtypes", "unchecked" }) -final class RowImpl19 extends AbstractRow implements Row19 { +final class RowImpl19 extends AbstractRow> implements Row19 { /** * Generated UID @@ -72,7 +72,7 @@ final class RowImpl19 fields) { - super(fields); + super((FieldsImpl) fields); } // ------------------------------------------------------------------------ diff --git a/jOOQ/src/main/java/org/jooq/impl/RowImpl2.java b/jOOQ/src/main/java/org/jooq/impl/RowImpl2.java index beda91b046..c8a91ea567 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowImpl2.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowImpl2.java @@ -60,7 +60,7 @@ import org.jooq.Statement; * @author Lukas Eder */ @SuppressWarnings({ "rawtypes", "unchecked" }) -final class RowImpl2 extends AbstractRow implements Row2 { +final class RowImpl2 extends AbstractRow> implements Row2 { /** * Generated UID @@ -72,7 +72,7 @@ final class RowImpl2 extends AbstractRow implements Row2 { } RowImpl2(FieldsImpl fields) { - super(fields); + super((FieldsImpl) fields); } // ------------------------------------------------------------------------ diff --git a/jOOQ/src/main/java/org/jooq/impl/RowImpl20.java b/jOOQ/src/main/java/org/jooq/impl/RowImpl20.java index 37c6621391..31cd0770fd 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowImpl20.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowImpl20.java @@ -60,7 +60,7 @@ import org.jooq.Statement; * @author Lukas Eder */ @SuppressWarnings({ "rawtypes", "unchecked" }) -final class RowImpl20 extends AbstractRow implements Row20 { +final class RowImpl20 extends AbstractRow> implements Row20 { /** * Generated UID @@ -72,7 +72,7 @@ final class RowImpl20 fields) { - super(fields); + super((FieldsImpl) fields); } // ------------------------------------------------------------------------ diff --git a/jOOQ/src/main/java/org/jooq/impl/RowImpl21.java b/jOOQ/src/main/java/org/jooq/impl/RowImpl21.java index 8e5d453f9b..f074dfb70b 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowImpl21.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowImpl21.java @@ -60,7 +60,7 @@ import org.jooq.Statement; * @author Lukas Eder */ @SuppressWarnings({ "rawtypes", "unchecked" }) -final class RowImpl21 extends AbstractRow implements Row21 { +final class RowImpl21 extends AbstractRow> implements Row21 { /** * Generated UID @@ -72,7 +72,7 @@ final class RowImpl21 fields) { - super(fields); + super((FieldsImpl) fields); } // ------------------------------------------------------------------------ diff --git a/jOOQ/src/main/java/org/jooq/impl/RowImpl22.java b/jOOQ/src/main/java/org/jooq/impl/RowImpl22.java index 571a883e03..43403f89f0 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowImpl22.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowImpl22.java @@ -60,7 +60,7 @@ import org.jooq.Statement; * @author Lukas Eder */ @SuppressWarnings({ "rawtypes", "unchecked" }) -final class RowImpl22 extends AbstractRow implements Row22 { +final class RowImpl22 extends AbstractRow> implements Row22 { /** * Generated UID @@ -72,7 +72,7 @@ final class RowImpl22 fields) { - super(fields); + super((FieldsImpl) fields); } // ------------------------------------------------------------------------ diff --git a/jOOQ/src/main/java/org/jooq/impl/RowImpl3.java b/jOOQ/src/main/java/org/jooq/impl/RowImpl3.java index 6e523ebe9c..61491ff6a6 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowImpl3.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowImpl3.java @@ -60,7 +60,7 @@ import org.jooq.Statement; * @author Lukas Eder */ @SuppressWarnings({ "rawtypes", "unchecked" }) -final class RowImpl3 extends AbstractRow implements Row3 { +final class RowImpl3 extends AbstractRow> implements Row3 { /** * Generated UID @@ -72,7 +72,7 @@ final class RowImpl3 extends AbstractRow implements Row3 } RowImpl3(FieldsImpl fields) { - super(fields); + super((FieldsImpl) fields); } // ------------------------------------------------------------------------ diff --git a/jOOQ/src/main/java/org/jooq/impl/RowImpl4.java b/jOOQ/src/main/java/org/jooq/impl/RowImpl4.java index 8344497c44..585658d4a3 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowImpl4.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowImpl4.java @@ -60,7 +60,7 @@ import org.jooq.Statement; * @author Lukas Eder */ @SuppressWarnings({ "rawtypes", "unchecked" }) -final class RowImpl4 extends AbstractRow implements Row4 { +final class RowImpl4 extends AbstractRow> implements Row4 { /** * Generated UID @@ -72,7 +72,7 @@ final class RowImpl4 extends AbstractRow implements Row4 fields) { - super(fields); + super((FieldsImpl) fields); } // ------------------------------------------------------------------------ diff --git a/jOOQ/src/main/java/org/jooq/impl/RowImpl5.java b/jOOQ/src/main/java/org/jooq/impl/RowImpl5.java index 83c27608d2..da748c845c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowImpl5.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowImpl5.java @@ -60,7 +60,7 @@ import org.jooq.Statement; * @author Lukas Eder */ @SuppressWarnings({ "rawtypes", "unchecked" }) -final class RowImpl5 extends AbstractRow implements Row5 { +final class RowImpl5 extends AbstractRow> implements Row5 { /** * Generated UID @@ -72,7 +72,7 @@ final class RowImpl5 extends AbstractRow implements Row5 fields) { - super(fields); + super((FieldsImpl) fields); } // ------------------------------------------------------------------------ diff --git a/jOOQ/src/main/java/org/jooq/impl/RowImpl6.java b/jOOQ/src/main/java/org/jooq/impl/RowImpl6.java index b0d0931c54..f492f46d05 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowImpl6.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowImpl6.java @@ -60,7 +60,7 @@ import org.jooq.Statement; * @author Lukas Eder */ @SuppressWarnings({ "rawtypes", "unchecked" }) -final class RowImpl6 extends AbstractRow implements Row6 { +final class RowImpl6 extends AbstractRow> implements Row6 { /** * Generated UID @@ -72,7 +72,7 @@ final class RowImpl6 extends AbstractRow implements Row6 } RowImpl6(FieldsImpl fields) { - super(fields); + super((FieldsImpl) fields); } // ------------------------------------------------------------------------ diff --git a/jOOQ/src/main/java/org/jooq/impl/RowImpl7.java b/jOOQ/src/main/java/org/jooq/impl/RowImpl7.java index 8fe85d4e2b..022aac9c0c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowImpl7.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowImpl7.java @@ -60,7 +60,7 @@ import org.jooq.Statement; * @author Lukas Eder */ @SuppressWarnings({ "rawtypes", "unchecked" }) -final class RowImpl7 extends AbstractRow implements Row7 { +final class RowImpl7 extends AbstractRow> implements Row7 { /** * Generated UID @@ -72,7 +72,7 @@ final class RowImpl7 extends AbstractRow implements } RowImpl7(FieldsImpl fields) { - super(fields); + super((FieldsImpl) fields); } // ------------------------------------------------------------------------ diff --git a/jOOQ/src/main/java/org/jooq/impl/RowImpl8.java b/jOOQ/src/main/java/org/jooq/impl/RowImpl8.java index 10ce69cd66..1428a87a35 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowImpl8.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowImpl8.java @@ -60,7 +60,7 @@ import org.jooq.Statement; * @author Lukas Eder */ @SuppressWarnings({ "rawtypes", "unchecked" }) -final class RowImpl8 extends AbstractRow implements Row8 { +final class RowImpl8 extends AbstractRow> implements Row8 { /** * Generated UID @@ -72,7 +72,7 @@ final class RowImpl8 extends AbstractRow impleme } RowImpl8(FieldsImpl fields) { - super(fields); + super((FieldsImpl) fields); } // ------------------------------------------------------------------------ diff --git a/jOOQ/src/main/java/org/jooq/impl/RowImpl9.java b/jOOQ/src/main/java/org/jooq/impl/RowImpl9.java index 66554a5991..82c37c686f 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowImpl9.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowImpl9.java @@ -60,7 +60,7 @@ import org.jooq.Statement; * @author Lukas Eder */ @SuppressWarnings({ "rawtypes", "unchecked" }) -final class RowImpl9 extends AbstractRow implements Row9 { +final class RowImpl9 extends AbstractRow> implements Row9 { /** * Generated UID @@ -72,7 +72,7 @@ final class RowImpl9 extends AbstractRow imp } RowImpl9(FieldsImpl fields) { - super(fields); + super((FieldsImpl) fields); } // ------------------------------------------------------------------------ diff --git a/jOOQ/src/main/java/org/jooq/impl/RowImplN.java b/jOOQ/src/main/java/org/jooq/impl/RowImplN.java index 45804b65ea..f03d21154c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowImplN.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowImplN.java @@ -57,7 +57,7 @@ import org.jooq.Statement; /** * @author Lukas Eder */ -final class RowImplN extends AbstractRow implements RowN { +final class RowImplN extends AbstractRow implements RowN { /** * Generated UID @@ -73,7 +73,7 @@ final class RowImplN extends AbstractRow implements RowN { } RowImplN(FieldsImpl fields) { - super(fields); + super((FieldsImpl) fields); } // ------------------------------------------------------------------------ diff --git a/jOOQ/src/main/java/org/jooq/impl/RowOverlapsCondition.java b/jOOQ/src/main/java/org/jooq/impl/RowOverlapsCondition.java index 0640bf94be..60920147e7 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowOverlapsCondition.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowOverlapsCondition.java @@ -70,6 +70,7 @@ import org.jooq.Clause; import org.jooq.Context; import org.jooq.DataType; import org.jooq.Field; +import org.jooq.Record2; import org.jooq.Row2; import org.jooq.SQLDialect; @@ -82,7 +83,6 @@ final class RowOverlapsCondition extends AbstractCondition { * Generated UID */ private static final long serialVersionUID = 85887551884667824L; - private static final Clause[] CLAUSES = { CONDITION, CONDITION_OVERLAPS }; private static final Set EMULATE_NON_STANDARD_OVERLAPS = SQLDialect.supportedUntil(CUBRID, DERBY, FIREBIRD, H2, MARIADB, MYSQL, SQLITE); private static final Set EMULATE_INTERVAL_OVERLAPS = SQLDialect.supportedBy(HSQLDB); @@ -91,8 +91,8 @@ final class RowOverlapsCondition extends AbstractCondition { @SuppressWarnings("unchecked") RowOverlapsCondition(Row2 left, Row2 right) { - this.left = (Row2) ((AbstractRow) left).convertTo(right); - this.right = (Row2) ((AbstractRow) right).convertTo(left); + this.left = (Row2) ((AbstractRow) left).convertTo(right); + this.right = (Row2) ((AbstractRow) right).convertTo(left); } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java index 624c98e1b9..19a97f1d9f 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java @@ -3660,6 +3660,8 @@ final class SelectQueryImpl extends AbstractResultQuery imp for (SelectFieldOrAsterisk f : list) if (f instanceof Field) result.add(getResolveProjection(c, (Field) f)); + else if (f instanceof Row) + result.add(getResolveProjection(c, new RowField((Row) f))); else if (f instanceof QualifiedAsterisk) if (((QualifiedAsteriskImpl) f).fields.isEmpty()) if (resolveSupported) diff --git a/jOOQ/src/main/java/org/jooq/impl/SortFieldList.java b/jOOQ/src/main/java/org/jooq/impl/SortFieldList.java index edab4303ee..bc80f2adba 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SortFieldList.java +++ b/jOOQ/src/main/java/org/jooq/impl/SortFieldList.java @@ -41,11 +41,7 @@ package org.jooq.impl; import static java.util.Collections.emptyList; import static org.jooq.SortOrder.DESC; import static org.jooq.impl.Tools.anyMatch; -import static org.jooq.impl.Tools.map; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; import java.util.List; import org.jooq.Field; diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java index 548e23715c..a26a9f0126 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Tools.java +++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java @@ -903,7 +903,7 @@ final class Tools { /** * Create a new record. */ - static final RecordDelegate newRecord(boolean fetched, Class type, AbstractRow fields) { + static final RecordDelegate newRecord(boolean fetched, Class type, AbstractRow fields) { return newRecord(fetched, type, fields, null); } @@ -918,13 +918,13 @@ final class Tools { * Create a new {@link Table} or {@link UDT} record. */ static final RecordDelegate newRecord(boolean fetched, RecordQualifier type, Configuration configuration) { - return newRecord(fetched, type.getRecordType(), (AbstractRow) type.fieldsRow(), configuration); + return newRecord(fetched, type.getRecordType(), (AbstractRow) type.fieldsRow(), configuration); } /** * Create a new record. */ - static final RecordDelegate newRecord(boolean fetched, Class type, AbstractRow fields, Configuration configuration) { + static final RecordDelegate newRecord(boolean fetched, Class type, AbstractRow fields, Configuration configuration) { return newRecord(fetched, recordFactory(type, fields), configuration); } @@ -935,44 +935,45 @@ final class Tools { return new RecordDelegate<>(configuration, factory, fetched); } - static final AbstractRow row0(FieldsImpl fields) { + @SuppressWarnings({ "unchecked", "rawtypes" }) + static final AbstractRow row0(FieldsImpl fields) { switch (fields.size()) { - case 1: return new RowImpl1<>(fields); - case 2: return new RowImpl2<>(fields); - case 3: return new RowImpl3<>(fields); - case 4: return new RowImpl4<>(fields); - case 5: return new RowImpl5<>(fields); - case 6: return new RowImpl6<>(fields); - case 7: return new RowImpl7<>(fields); - case 8: return new RowImpl8<>(fields); - case 9: return new RowImpl9<>(fields); - case 10: return new RowImpl10<>(fields); - case 11: return new RowImpl11<>(fields); - case 12: return new RowImpl12<>(fields); - case 13: return new RowImpl13<>(fields); - case 14: return new RowImpl14<>(fields); - case 15: return new RowImpl15<>(fields); - case 16: return new RowImpl16<>(fields); - case 17: return new RowImpl17<>(fields); - case 18: return new RowImpl18<>(fields); - case 19: return new RowImpl19<>(fields); - case 20: return new RowImpl20<>(fields); - case 21: return new RowImpl21<>(fields); - case 22: return new RowImpl22<>(fields); + case 1: return new RowImpl1(fields); + case 2: return new RowImpl2(fields); + case 3: return new RowImpl3(fields); + case 4: return new RowImpl4(fields); + case 5: return new RowImpl5(fields); + case 6: return new RowImpl6(fields); + case 7: return new RowImpl7(fields); + case 8: return new RowImpl8(fields); + case 9: return new RowImpl9(fields); + case 10: return new RowImpl10(fields); + case 11: return new RowImpl11(fields); + case 12: return new RowImpl12(fields); + case 13: return new RowImpl13(fields); + case 14: return new RowImpl14(fields); + case 15: return new RowImpl15(fields); + case 16: return new RowImpl16(fields); + case 17: return new RowImpl17(fields); + case 18: return new RowImpl18(fields); + case 19: return new RowImpl19(fields); + case 20: return new RowImpl20(fields); + case 21: return new RowImpl21(fields); + case 22: return new RowImpl22(fields); - default: return new RowImplN(fields); + default: return (AbstractRow) new RowImplN(fields); } } - static final AbstractRow row0(Collection> fields) { + static final AbstractRow row0(Collection> fields) { return row0(fields.toArray(EMPTY_FIELD)); } - static final AbstractRow row0(Field... fields) { + static final AbstractRow row0(Field... fields) { return row0(new FieldsImpl<>(fields)); } @@ -1013,7 +1014,7 @@ final class Tools { * Create a new record factory. */ @SuppressWarnings({ "unchecked" }) - static final Supplier recordFactory(Class type, AbstractRow row) { + static final Supplier recordFactory(Class type, AbstractRow row) { // An ad-hoc type resulting from a JOIN or arbitrary SELECT if (type == AbstractRecord.class || type == Record.class || InternalRecord.class.isAssignableFrom(type)) { @@ -5161,6 +5162,7 @@ final class Tools { static final SelectFieldOrAsterisk qualify(Table table, SelectFieldOrAsterisk field) { if (field instanceof Field) return qualify(table, (Field) field); + // [#11812] TODO: handle field instanceof Row else if (field instanceof Asterisk) return table.asterisk(); else if (field instanceof QualifiedAsterisk) diff --git a/jOOQ/src/main/java/org/jooq/impl/UpdatableRecordImpl.java b/jOOQ/src/main/java/org/jooq/impl/UpdatableRecordImpl.java index bfe3658670..78526da021 100644 --- a/jOOQ/src/main/java/org/jooq/impl/UpdatableRecordImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/UpdatableRecordImpl.java @@ -101,7 +101,7 @@ public class UpdatableRecordImpl> extends TableReco @Override public Record key() { - AbstractRecord result = Tools.newRecord(fetched, AbstractRecord.class, Tools.row0(getPrimaryKey().getFieldsArray())).operate(null); + AbstractRecord result = Tools.newRecord(fetched, AbstractRecord.class, (AbstractRow) Tools.row0(getPrimaryKey().getFieldsArray())).operate(null); result.setValues(result.fields.fields.fields, this); return result; } @@ -430,7 +430,7 @@ public class UpdatableRecordImpl> extends TableReco // [#3359] The "fetched" flag must be set to false to enforce INSERT statements on // subsequent store() calls - when Settings.updatablePrimaryKeys is set. - return (R) Tools.newRecord(false, getTable(), configuration()) + return Tools.newRecord(false, getTable(), configuration()) .operate(copy -> { // Copy all fields. This marks them all as isChanged, which is important @@ -441,7 +441,7 @@ public class UpdatableRecordImpl> extends TableReco if (!key.contains(field)) copy.set((Field) field, get(field)); - return (R) copy; + return copy; }); }