From 502f1cbaae72993b95044adf7df09b17ff2aabb1 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Wed, 28 Apr 2021 20:58:15 +0200 Subject: [PATCH] [jOOQ/jOOQ#7100] Add Field.convert(Binding), convert(Converter), convert(Class, Function, Function) This includes: - [jOOQ/jOOQ#11810] RecordMapper should extend Function --- jOOQ/src/main/java/org/jooq/Field.java | 54 +++++++++++++++++++ jOOQ/src/main/java/org/jooq/RecordMapper.java | 9 +++- .../java/org/jooq/impl/AbstractField.java | 20 +++++++ 3 files changed, 82 insertions(+), 1 deletion(-) diff --git a/jOOQ/src/main/java/org/jooq/Field.java b/jOOQ/src/main/java/org/jooq/Field.java index 0fac147675..07dc014ea4 100644 --- a/jOOQ/src/main/java/org/jooq/Field.java +++ b/jOOQ/src/main/java/org/jooq/Field.java @@ -78,6 +78,8 @@ import java.util.Map; import java.util.function.Function; import org.jooq.conf.Settings; +import org.jooq.exception.MappingException; +import org.jooq.impl.CustomField; import org.jooq.impl.DSL; import org.jooq.types.Interval; // ... @@ -149,6 +151,58 @@ extends // API // ------------------------------------------------------------------------ + /** + * Apply an ad-hoc data type {@link Binding} to this field expression. + *

+ * Rather than attaching data type bindings at code generation time, or + * creating cumbersome expressions using + * {@link DataType#asConvertedDataType(Binding)}, this method allows for + * creating a derived field expression with an ad-hoc data type binding for + * single query usage. + * + * @param The user type. + * @param binding The binding to be applied on any operations using this + * field. + * @return A derived field expression using a new binding. + */ + Field convert(Binding binding); + + /** + * Apply an ad-hoc data type {@link Converter} to this field expression. + *

+ * Rather than attaching data type converters at code generation time, or + * creating cumbersome expressions using + * {@link DataType#asConvertedDataType(Converter)}, 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 converter to be applied on any operations using this + * field. + * @return A derived field expression using a new converter. + */ + Field convert(Converter converter); + + /** + * Apply an ad-hoc data type {@link Converter} to this field expression. + *

+ * Rather than attaching data type converters at code generation time, or + * creating cumbersome expressions using + * {@link DataType#asConvertedDataType(Class, Function, 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 converter to be applied on any operations using this + * field. + * @return A derived field expression using a new converter. + */ + Field convert( + Class toType, + Function from, + Function to + ); + /** * The name of the field. *

diff --git a/jOOQ/src/main/java/org/jooq/RecordMapper.java b/jOOQ/src/main/java/org/jooq/RecordMapper.java index 9f8c2c2be6..144d8678b0 100644 --- a/jOOQ/src/main/java/org/jooq/RecordMapper.java +++ b/jOOQ/src/main/java/org/jooq/RecordMapper.java @@ -37,6 +37,8 @@ */ package org.jooq; +import java.util.function.Function; + import org.jetbrains.annotations.Nullable; /** @@ -61,7 +63,7 @@ import org.jetbrains.annotations.Nullable; * @author Lukas Eder */ @FunctionalInterface -public interface RecordMapper { +public interface RecordMapper extends Function { /** * Map a record into a POJO. @@ -72,4 +74,9 @@ public interface RecordMapper { */ @Nullable E map(R record); + + @Override + default E apply(R record) { + return map(record); + } } diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractField.java b/jOOQ/src/main/java/org/jooq/impl/AbstractField.java index 472e9a3def..5fa616e6c3 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractField.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractField.java @@ -85,6 +85,7 @@ import org.jooq.Comment; import org.jooq.Comparator; import org.jooq.Condition; import org.jooq.Context; +import org.jooq.Converter; import org.jooq.DataType; import org.jooq.DatePart; import org.jooq.Field; @@ -185,6 +186,25 @@ abstract class AbstractField extends AbstractTypedNamed implements Field Field convert(Binding binding) { + return CustomField.of(getQualifiedName(), getDataType().asConvertedDataType(binding), c -> c.visit(this)); + } + + @Override + public final Field convert(Converter converter) { + return CustomField.of(getQualifiedName(), getDataType().asConvertedDataType(converter), c -> c.visit(this)); + } + + @Override + public final Field convert( + Class toType, + Function from, + Function to + ) { + return CustomField.of(getQualifiedName(), getDataType().asConvertedDataType(toType, from, to), c -> c.visit(this)); + } + @Override public final Field as(String alias) { return as(DSL.name(alias));