From bde4100b8f65223f3ff16caa33bf951db11ba68b Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Thu, 9 Jul 2020 14:25:37 +0200 Subject: [PATCH] [jOOQ/jOOQ#10372] Refactor internal org.jooq.impl.Cast.Native for better reuse --- jOOQ/src/main/java/org/jooq/impl/Cast.java | 36 +++++++++++++------ .../org/jooq/impl/DateAsTimestampBinding.java | 8 ++--- .../java/org/jooq/impl/DefaultBinding.java | 10 ++---- .../impl/LocalDateAsLocalDateTimeBinding.java | 8 ++--- 4 files changed, 33 insertions(+), 29 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/Cast.java b/jOOQ/src/main/java/org/jooq/impl/Cast.java index 329df02117..14a2932f67 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Cast.java +++ b/jOOQ/src/main/java/org/jooq/impl/Cast.java @@ -40,6 +40,7 @@ package org.jooq.impl; import static org.jooq.impl.DSL.inline; import static org.jooq.impl.Keywords.K_AS; import static org.jooq.impl.Keywords.K_CAST; +import static org.jooq.impl.Keywords.K_TRIM; import static org.jooq.impl.Names.N_CAST; import static org.jooq.impl.Names.N_TO_CLOB; import static org.jooq.impl.Names.N_TO_DATE; @@ -58,7 +59,9 @@ import java.sql.Timestamp; import org.jooq.Context; import org.jooq.DataType; import org.jooq.Field; +import org.jooq.Keyword; // ... +import org.jooq.QueryPart; import org.jooq.RenderContext.CastMode; /** @@ -197,7 +200,7 @@ final class Cast extends AbstractField { // [#857] Interestingly, Derby does not allow for casting numeric // types directly to VARCHAR. An intermediary cast to CHAR is needed if (field.getDataType().isNumeric() && type.isString() && !CHAR.equals(type)) - ctx.visit(DSL.trim(new CastNative<>(new CastNative<>(field, CHAR(38)), (DataType) getDataType()))); + ctx.visit(K_TRIM).sql('(').visit(new CastNative<>(new CastNative<>(field, CHAR(38)), (DataType) getDataType())).sql(')'); // [#888] ... neither does casting character types to FLOAT (and similar) else if (field.getDataType().isString() && (FLOAT.equals(type) || DOUBLE.equals(type) || REAL.equals(type))) @@ -291,18 +294,26 @@ final class Cast extends AbstractField { - private static class CastNative extends AbstractField { + static class CastNative extends AbstractQueryPart { /** * Generated UID */ private static final long serialVersionUID = -8497561014419483312L; - private final Field field; + private final QueryPart expression; + private final DataType type; + private final Keyword typeAsKeyword; - CastNative(Field field, DataType type) { - super(N_CAST, type); + CastNative(QueryPart expression, DataType type) { + this.expression = expression; + this.type = type; + this.typeAsKeyword = null; + } - this.field = field; + CastNative(QueryPart expression, Keyword typeAsKeyword) { + this.expression = expression; + this.type = null; + this.typeAsKeyword = typeAsKeyword; } @Override @@ -314,11 +325,16 @@ final class Cast extends AbstractField { // Default rendering, if no special case has applied yet ctx.visit(K_CAST).sql('(') .castMode(CastMode.NEVER) - .visit(field) + .visit(expression) .castMode(castMode) - .sql(' ').visit(K_AS).sql(' ') - .sql(getDataType(ctx.configuration()).getCastTypeName(ctx.configuration())) - .sql(')'); + .sql(' ').visit(K_AS).sql(' '); + + if (typeAsKeyword != null) + ctx.visit(typeAsKeyword); + else + ctx.sql(type.getCastTypeName(ctx.configuration())); + + ctx.sql(')'); } } } diff --git a/jOOQ/src/main/java/org/jooq/impl/DateAsTimestampBinding.java b/jOOQ/src/main/java/org/jooq/impl/DateAsTimestampBinding.java index 129089a986..a1c7bca2cb 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DateAsTimestampBinding.java +++ b/jOOQ/src/main/java/org/jooq/impl/DateAsTimestampBinding.java @@ -39,9 +39,7 @@ package org.jooq.impl; // ... import static org.jooq.impl.DSL.val; -import static org.jooq.impl.Keywords.K_AS; -import static org.jooq.impl.Keywords.K_CAST; -import static org.jooq.impl.Keywords.K_DATE; +import static org.jooq.impl.SQLDataType.DATE; import java.sql.SQLException; import java.sql.Timestamp; @@ -58,6 +56,7 @@ import org.jooq.Converter; import org.jooq.Converters; import org.jooq.RenderContext; import org.jooq.SQLDialect; +import org.jooq.impl.Cast.CastNative; /** * A binding that implements the date-as-timestamp semantics of the jOOQ code @@ -101,9 +100,6 @@ public class DateAsTimestampBinding implements Binding { - - - delegate.sql(ctx); } diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java b/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java index 9c0b09544a..7747107f36 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java @@ -76,7 +76,6 @@ import static org.jooq.SQLDialect.SQLITE; import static org.jooq.conf.ParamType.INLINED; import static org.jooq.impl.DSL.cast; import static org.jooq.impl.DSL.inline; -import static org.jooq.impl.DSL.keyword; import static org.jooq.impl.DSL.name; import static org.jooq.impl.DSL.sqrt; import static org.jooq.impl.DSL.using; @@ -197,6 +196,7 @@ import org.jooq.exception.ControlFlowSignal; import org.jooq.exception.DataTypeException; import org.jooq.exception.MappingException; import org.jooq.exception.SQLDialectNotSupportedException; +import org.jooq.impl.Cast.CastNative; import org.jooq.tools.Convert; import org.jooq.tools.JooqLogger; import org.jooq.tools.Longs; @@ -2007,7 +2007,6 @@ public class DefaultBinding implements Binding { - // [#1253] Derby doesn't support the standard literal else if (ctx.family() == DERBY) ctx.render().visit(K_DATE).sql("('").sql(escape(value, ctx.render())).sql("')"); @@ -2273,7 +2272,7 @@ public class DefaultBinding implements Binding { else if (ctx.family() == HSQLDB) ctx.render().visit(sqrt(inline(-1))); else - ctx.render().visit(K_CAST).sql('(').visit(inline("NaN")).sql(' ').visit(K_AS).sql(' ').visit(keyword(DOUBLE.getCastTypeName(ctx.configuration()))).sql(')'); + ctx.render().visit(new CastNative<>(inline("NaN"), DOUBLE)); else ctx.render().sql(value); } @@ -2448,7 +2447,7 @@ public class DefaultBinding implements Binding { else if (ctx.family() == HSQLDB) ctx.render().visit(sqrt(inline(-1))); else - ctx.render().visit(K_CAST).sql('(').visit(inline("NaN")).sql(' ').visit(K_AS).sql(' ').visit(keyword(DOUBLE.getCastTypeName(ctx.configuration()))).sql(')'); + ctx.render().visit(new CastNative<>(inline("NaN"), DOUBLE)); else ctx.render().sql(value); } @@ -2804,7 +2803,6 @@ public class DefaultBinding implements Binding { - // Some dialects implement SQL standard time literals default: ctx.render().visit(K_TIMESTAMP_WITH_TIME_ZONE).sql(" '").sql(escape(format(value, family), ctx.render())).sql('\''); @@ -3901,7 +3899,6 @@ public class DefaultBinding implements Binding { - // Most dialects implement SQL standard time literals else ctx.render().visit(K_TIME).sql(" '").sql(escape(value, ctx.render())).sql('\''); @@ -3981,7 +3978,6 @@ public class DefaultBinding implements Binding { - // [#1253] Derby doesn't support the standard literal else if (ctx.family() == DERBY) ctx.render().visit(K_TIMESTAMP).sql("('").sql(escape(value, ctx.render())).sql("')"); diff --git a/jOOQ/src/main/java/org/jooq/impl/LocalDateAsLocalDateTimeBinding.java b/jOOQ/src/main/java/org/jooq/impl/LocalDateAsLocalDateTimeBinding.java index db22593cd5..947d5eb630 100644 --- a/jOOQ/src/main/java/org/jooq/impl/LocalDateAsLocalDateTimeBinding.java +++ b/jOOQ/src/main/java/org/jooq/impl/LocalDateAsLocalDateTimeBinding.java @@ -44,9 +44,7 @@ package org.jooq.impl; // ... import static org.jooq.impl.DSL.val; -import static org.jooq.impl.Keywords.K_AS; -import static org.jooq.impl.Keywords.K_CAST; -import static org.jooq.impl.Keywords.K_DATE; +import static org.jooq.impl.SQLDataType.DATE; import java.sql.SQLException; import java.time.LocalDateTime; @@ -63,6 +61,7 @@ import org.jooq.Converter; import org.jooq.Converters; import org.jooq.RenderContext; import org.jooq.SQLDialect; +import org.jooq.impl.Cast.CastNative; /** * A binding that implements the date-as-timestamp semantics of the jOOQ code @@ -106,9 +105,6 @@ public class LocalDateAsLocalDateTimeBinding implements Binding