From f2036e022ed16c8dd6fe130cafe78b9876ffbb24 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Fri, 4 Dec 2020 22:12:27 +0100 Subject: [PATCH] [jOOQ/jOOQ#11097] Add single argument DSL.function() overload --- jOOQ/src/main/java/org/jooq/impl/Ascii.java | 9 ++- jOOQ/src/main/java/org/jooq/impl/DSL.java | 28 ++++++-- jOOQ/src/main/java/org/jooq/impl/Exp.java | 2 +- .../src/main/java/org/jooq/impl/Function.java | 4 +- .../main/java/org/jooq/impl/Function1.java | 68 +++++++++++++++++++ jOOQ/src/main/java/org/jooq/impl/IsJSON.java | 4 +- jOOQ/src/main/java/org/jooq/impl/Ln.java | 8 ++- jOOQ/src/main/java/org/jooq/impl/Names.java | 8 +++ jOOQ/src/main/java/org/jooq/impl/Radians.java | 5 +- jOOQ/src/main/java/org/jooq/impl/Round.java | 8 +-- 10 files changed, 124 insertions(+), 20 deletions(-) create mode 100644 jOOQ/src/main/java/org/jooq/impl/Function1.java diff --git a/jOOQ/src/main/java/org/jooq/impl/Ascii.java b/jOOQ/src/main/java/org/jooq/impl/Ascii.java index ec4c6fbb44..34b296b2b1 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Ascii.java +++ b/jOOQ/src/main/java/org/jooq/impl/Ascii.java @@ -40,6 +40,9 @@ package org.jooq.impl; import static org.jooq.impl.Names.N_ASC; import static org.jooq.impl.Names.N_ASCII; import static org.jooq.impl.Names.N_ASCII_VAL; +import static org.jooq.impl.SQLDataType.INTEGER; +import static org.jooq.impl.SQLDataType.VARCHAR; +import static org.jooq.impl.Tools.nullSafeNotNull; import org.jooq.Context; import org.jooq.Field; @@ -57,9 +60,9 @@ final class Ascii extends AbstractField { private final Field string; Ascii(Field string) { - super(N_ASCII, SQLDataType.INTEGER); + super(N_ASCII, INTEGER.nullable(string == null || string.getDataType().nullable())); - this.string = string; + this.string = nullSafeNotNull(string, VARCHAR); } @Override @@ -81,9 +84,9 @@ final class Ascii extends AbstractField { case DERBY: case SQLITE: - default: ctx.visit(N_ASCII).sql('(').visit(string).sql(')'); + break; } } } diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index 44bf6c078e..fe03244a86 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -94,9 +94,13 @@ import static org.jooq.impl.Internal.imul; import static org.jooq.impl.Internal.isub; import static org.jooq.impl.Keywords.K_CUBE; import static org.jooq.impl.Keywords.K_GROUPING_SETS; +import static org.jooq.impl.Names.N_ABS; +import static org.jooq.impl.Names.N_COS; import static org.jooq.impl.Names.N_IF; import static org.jooq.impl.Names.N_IIF; +import static org.jooq.impl.Names.N_SIN; import static org.jooq.impl.Names.N_SYSTEM_TIME; +import static org.jooq.impl.Names.N_TAN; import static org.jooq.impl.Names.N_VALUE; import static org.jooq.impl.PositionalWindowFunction.PositionalFunctionType.FIRST_VALUE; import static org.jooq.impl.PositionalWindowFunction.PositionalFunctionType.LAG; @@ -13050,6 +13054,20 @@ public class DSL { return new org.jooq.impl.Function<>(name, type, Tools.nullSafe(arguments)); } + /** + * function() can be used to access native or user-defined + * functions that are not yet or insufficiently supported by jOOQ. + * + * @param name The function name (possibly qualified) + * @param type The function return type + * @param arguments The function arguments + */ + @NotNull + @Support + static Field function(Name name, DataType type, Field argument) { + return new org.jooq.impl.Function1<>(name, type, Tools.nullSafe(argument)); + } + /** * Create a new condition holding plain SQL. *

@@ -15672,7 +15690,7 @@ public class DSL { @NotNull @Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES }) public static Field ascii(Field field) { - return new Ascii(Tools.nullSafe(field)); + return new Ascii(field); } /** @@ -19479,7 +19497,7 @@ public class DSL { @NotNull @Support public static Field abs(Field field) { - return function("abs", Tools.nullSafeDataType(field), field); + return function(N_ABS, Tools.nullSafeDataType(field), field); } /** @@ -19981,7 +19999,7 @@ public class DSL { @NotNull @Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES }) public static Field cos(Field field) { - return function("cos", SQLDataType.NUMERIC, field); + return function(N_COS, SQLDataType.NUMERIC, field); } /** @@ -20004,7 +20022,7 @@ public class DSL { @NotNull @Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES }) public static Field sin(Field field) { - return function("sin", SQLDataType.NUMERIC, field); + return function(N_SIN, SQLDataType.NUMERIC, field); } /** @@ -20027,7 +20045,7 @@ public class DSL { @NotNull @Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES }) public static Field tan(Field field) { - return function("tan", SQLDataType.NUMERIC, field); + return function(N_TAN, SQLDataType.NUMERIC, field); } /** diff --git a/jOOQ/src/main/java/org/jooq/impl/Exp.java b/jOOQ/src/main/java/org/jooq/impl/Exp.java index e672a215a9..8d1190fa0a 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Exp.java +++ b/jOOQ/src/main/java/org/jooq/impl/Exp.java @@ -79,7 +79,7 @@ final class Exp extends AbstractField { default: - ctx.visit(function("exp", NUMERIC, argument)); + ctx.visit(function(N_EXP, NUMERIC, argument)); return; } } diff --git a/jOOQ/src/main/java/org/jooq/impl/Function.java b/jOOQ/src/main/java/org/jooq/impl/Function.java index 2251b873b6..95ae7ff6c1 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Function.java +++ b/jOOQ/src/main/java/org/jooq/impl/Function.java @@ -37,6 +37,8 @@ */ package org.jooq.impl; +import static org.jooq.impl.DSL.unquotedName; + import org.jooq.Context; import org.jooq.DataType; import org.jooq.Field; @@ -55,7 +57,7 @@ final class Function extends AbstractField { private final QueryPartList> arguments; Function(String name, DataType type, Field... arguments) { - this(DSL.unquotedName(name), type, arguments); + this(unquotedName(name), type, arguments); } Function(Name name, DataType type, Field... arguments) { diff --git a/jOOQ/src/main/java/org/jooq/impl/Function1.java b/jOOQ/src/main/java/org/jooq/impl/Function1.java new file mode 100644 index 0000000000..0b9db8cc80 --- /dev/null +++ b/jOOQ/src/main/java/org/jooq/impl/Function1.java @@ -0,0 +1,68 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Other licenses: + * ----------------------------------------------------------------------------- + * Commercial licenses for this work are available. These replace the above + * ASL 2.0 and offer limited warranties, support, maintenance, and commercial + * database integrations. + * + * For more information, please visit: http://www.jooq.org/licenses + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + */ +package org.jooq.impl; + +import static org.jooq.impl.DSL.unquotedName; + +import org.jooq.Context; +import org.jooq.DataType; +import org.jooq.Field; +import org.jooq.Name; + +/** + * @author Lukas Eder + */ +final class Function1 extends AbstractField { + + /** + * Generated UID + */ + private static final long serialVersionUID = -2034096213592995420L; + private final Field argument; + + Function1(Name name, DataType type, Field argument) { + super(name, type); + + this.argument = argument; + } + + @Override + public final void accept(Context ctx) { + ctx.visit(getQualifiedName()).sql('(').visit(argument).sql(')'); + } +} diff --git a/jOOQ/src/main/java/org/jooq/impl/IsJSON.java b/jOOQ/src/main/java/org/jooq/impl/IsJSON.java index cb607070ee..df56b270da 100644 --- a/jOOQ/src/main/java/org/jooq/impl/IsJSON.java +++ b/jOOQ/src/main/java/org/jooq/impl/IsJSON.java @@ -42,6 +42,8 @@ import static org.jooq.impl.DSL.function; import static org.jooq.impl.DSL.inline; import static org.jooq.impl.Keywords.K_IS_JSON; import static org.jooq.impl.Keywords.K_IS_NOT_JSON; +import static org.jooq.impl.Names.N_ISJSON; +import static org.jooq.impl.Names.N_JSON_VALID; import static org.jooq.impl.SQLDataType.BOOLEAN; import static org.jooq.impl.SQLDataType.INTEGER; @@ -69,7 +71,7 @@ final class IsJSON extends AbstractCondition { public final void accept(Context ctx) { switch (ctx.family()) { case MYSQL: - ctx.visit(function("json_valid", BOOLEAN, field)); + ctx.visit(function(N_JSON_VALID, BOOLEAN, field)); break; diff --git a/jOOQ/src/main/java/org/jooq/impl/Ln.java b/jOOQ/src/main/java/org/jooq/impl/Ln.java index 5dab17c475..6841bef00c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Ln.java +++ b/jOOQ/src/main/java/org/jooq/impl/Ln.java @@ -40,6 +40,8 @@ package org.jooq.impl; import static org.jooq.impl.DSL.function; import static org.jooq.impl.Internal.idiv; import static org.jooq.impl.Names.N_LN; +import static org.jooq.impl.Names.N_LOG; +import static org.jooq.impl.Names.N_LOGN; import static org.jooq.impl.SQLDataType.NUMERIC; import java.math.BigDecimal; @@ -65,7 +67,7 @@ final class Ln extends AbstractField { } Ln(Field argument, Field base) { - super(N_LN, SQLDataType.NUMERIC); + super(N_LN, NUMERIC); this.argument = argument; this.base = base; @@ -98,7 +100,7 @@ final class Ln extends AbstractField { default: - ctx.visit(function("ln", SQLDataType.NUMERIC, argument)); + ctx.visit(function(N_LN, NUMERIC, argument)); return; } } @@ -131,7 +133,7 @@ final class Ln extends AbstractField { return; default: - ctx.visit(function("log", SQLDataType.NUMERIC, base, argument)); + ctx.visit(function(N_LOG, NUMERIC, base, argument)); return; } } diff --git a/jOOQ/src/main/java/org/jooq/impl/Names.java b/jOOQ/src/main/java/org/jooq/impl/Names.java index b458fbe2e0..1c475f31d2 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Names.java +++ b/jOOQ/src/main/java/org/jooq/impl/Names.java @@ -52,6 +52,7 @@ final class Names { static final Name N_ARRAY_TABLE = name("array_table"); static final Name N_COLUMN_VALUE = name("COLUMN_VALUE"); + static final Name N_ABS = unquotedName("abs"); static final Name N_ACOS = unquotedName("acos"); static final Name N_ADD_DAYS = unquotedName("add_days"); static final Name N_ADD_MONTHS = unquotedName("add_months"); @@ -84,6 +85,7 @@ final class Names { static final Name N_COLLECT = unquotedName("collect"); static final Name N_CONCAT = unquotedName("concat"); static final Name N_CONVERT = unquotedName("convert"); + static final Name N_COS = unquotedName("cos"); static final Name N_COSH = unquotedName("cosh"); static final Name N_COT = unquotedName("cot"); static final Name N_COUNT = unquotedName("count"); @@ -133,6 +135,7 @@ final class Names { static final Name N_IIF = unquotedName("iif"); static final Name N_INSERT = unquotedName("insert"); static final Name N_INSTR = unquotedName("instr"); + static final Name N_ISJSON = unquotedName("isjson"); static final Name N_ISOWEEK = unquotedName("isoweek"); static final Name N_JOIN = unquotedName("join"); static final Name N_JSON_AGG = unquotedName("json_agg"); @@ -147,6 +150,7 @@ final class Names { static final Name N_JSON_OBJECTAGG = unquotedName("json_objectagg"); static final Name N_JSON_QUOTE = unquotedName("json_quote"); static final Name N_JSON_TABLE = unquotedName("json_table"); + static final Name N_JSON_VALID = unquotedName("json_valid"); static final Name N_JSON_VALUE = unquotedName("json_value"); static final Name N_JSONB_AGG = unquotedName("jsonb_agg"); static final Name N_JSONB_BUILD_ARRAY = unquotedName("jsonb_build_array"); @@ -165,6 +169,8 @@ final class Names { static final Name N_LISTAGG = unquotedName("listagg"); static final Name N_LN = unquotedName("ln"); static final Name N_LOCATE = unquotedName("locate"); + static final Name N_LOG = unquotedName("log"); + static final Name N_LOGN = unquotedName("logn"); static final Name N_LOWER = unquotedName("lower"); static final Name N_LPAD = unquotedName("lpad"); static final Name N_LTRIM = unquotedName("ltrim"); @@ -219,6 +225,7 @@ final class Names { static final Name N_SELECT = unquotedName("select"); static final Name N_SGN = unquotedName("sgn"); static final Name N_SIGN = unquotedName("sign"); + static final Name N_SIN = unquotedName("sin"); static final Name N_SINH = unquotedName("sinh"); static final Name N_SPACE = unquotedName("space"); static final Name N_SPLIT_PART = unquotedName("split_part"); @@ -245,6 +252,7 @@ final class Names { static final Name N_SYSTEM_RANGE = unquotedName("system_range"); static final Name N_SYSTEM_TIME = unquotedName("system_time"); static final Name N_T = unquotedName("t"); + static final Name N_TAN = unquotedName("tan"); static final Name N_TANH = unquotedName("tanh"); static final Name N_TIMESTAMPADD = unquotedName("timestampadd"); static final Name N_TIMESTAMPDIFF = unquotedName("timestampdiff"); diff --git a/jOOQ/src/main/java/org/jooq/impl/Radians.java b/jOOQ/src/main/java/org/jooq/impl/Radians.java index 6841278e33..729b2b979b 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Radians.java +++ b/jOOQ/src/main/java/org/jooq/impl/Radians.java @@ -41,6 +41,7 @@ import static org.jooq.impl.DSL.function; import static org.jooq.impl.DSL.inline; import static org.jooq.impl.DSL.pi; import static org.jooq.impl.Names.N_RADIANS; +import static org.jooq.impl.SQLDataType.NUMERIC; import static org.jooq.impl.Tools.castIfNeeded; import java.math.BigDecimal; @@ -61,7 +62,7 @@ final class Radians extends AbstractField { private final Field argument; Radians(Field argument) { - super(N_RADIANS, SQLDataType.NUMERIC); + super(N_RADIANS, NUMERIC); this.argument = argument; } @@ -81,7 +82,7 @@ final class Radians extends AbstractField { return; default: - ctx.visit(function("radians", SQLDataType.NUMERIC, argument)); + ctx.visit(function(N_RADIANS, NUMERIC, argument)); return; } } diff --git a/jOOQ/src/main/java/org/jooq/impl/Round.java b/jOOQ/src/main/java/org/jooq/impl/Round.java index 4e52e52e1a..aab45f3f53 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Round.java +++ b/jOOQ/src/main/java/org/jooq/impl/Round.java @@ -135,17 +135,17 @@ final class Round extends AbstractField { // There's no function round(double precision, integer) in Postgres case POSTGRES: if (decimals == null) - ctx.visit(function("round", getDataType(), argument)); + ctx.visit(function(N_ROUND, getDataType(), argument)); else - ctx.visit(function("round", getDataType(), castIfNeeded(argument, BigDecimal.class), decimals)); + ctx.visit(function(N_ROUND, getDataType(), castIfNeeded(argument, BigDecimal.class), decimals)); return; default: if (decimals == null) - ctx.visit(function("round", getDataType(), argument)); + ctx.visit(function(N_ROUND, getDataType(), argument)); else - ctx.visit(function("round", getDataType(), argument, decimals)); + ctx.visit(function(N_ROUND, getDataType(), argument, decimals)); return; }