From db45db76cd9c244e2261f0990a1efa27dcaaefbe Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Mon, 23 Nov 2020 11:31:54 +0100 Subject: [PATCH] [jOOQ/jOOQ#11009] Add support for the MySQL FIELD() function --- jOOQ/src/main/java/org/jooq/impl/DSL.java | 20 ++++++++++++++++ jOOQ/src/main/java/org/jooq/impl/Names.java | 1 + .../main/java/org/jooq/impl/ParserImpl.java | 24 ++++--------------- jOOQ/src/main/java/org/jooq/impl/Tools.java | 12 ++++++++++ 4 files changed, 37 insertions(+), 20 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index 1b569a71dc..351e406ae6 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -13490,6 +13490,26 @@ public class DSL { // XXX Global Field and Function factory // ------------------------------------------------------------------------- + /** + * Get the MySQL FIELD(expr, expr1, expr2, ...) function. + */ + @NotNull + @Support + @SafeVarargs + public static Field field(Field field, T... list) { + return field(field, Tools.fieldsArray(list, field.getDataType())); + } + + /** + * Get the MySQL FIELD(expr, expr1, expr2, ...) function. + */ + @NotNull + @Support + @SafeVarargs + public static Field field(Field field, Field... list) { + return new FieldFunction<>(field, list); + } + /** * Wrap a {@link SelectField} in a general-purpose {@link Field} */ diff --git a/jOOQ/src/main/java/org/jooq/impl/Names.java b/jOOQ/src/main/java/org/jooq/impl/Names.java index 2c967b33a8..23ba503af6 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Names.java +++ b/jOOQ/src/main/java/org/jooq/impl/Names.java @@ -114,6 +114,7 @@ final class Names { static final Name N_EXP = unquotedName("exp"); static final Name N_EXTRACT = unquotedName("extract"); static final Name N_EXTRACT_DURATION = unquotedName("extract_duration"); + static final Name N_FIELD = unquotedName("field"); static final Name N_FLASHBACK = unquotedName("flashback"); static final Name N_FLOOR = unquotedName("floor"); static final Name N_FUNCTION = unquotedName("function"); diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java index 1279693dd0..8d82c60f0c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java @@ -9347,31 +9347,15 @@ final class ParserImpl implements Parser { return null; } - private static final Field parseFieldFieldIf(ParserContext ctx) { + private static final Field parseFieldFieldIf(ParserContext ctx) { if (parseFunctionNameIf(ctx, "FIELD")) { parse(ctx, '('); - - List> args = new ArrayList<>(); - - args.add(parseField(ctx)); + Field f1 = parseField(ctx); parse(ctx, ','); - - int i = 1; - do { - args.add(parseField(ctx)); - args.add(inline(i++)); - } - while (parseIf(ctx, ',')); - - args.add(inline(0)); + List> f2 = parseFields(ctx); parse(ctx, ')'); - return DSL.decode( - (Field) args.get(0), - (Field) args.get(1), - (Field) args.get(2), - args.subList(3, args.size()).toArray(EMPTY_FIELD) - ); + return DSL.field((Field) f1, (Field[]) f2.toArray(EMPTY_FIELD)); } return null; diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java index 01f4199328..80d0461256 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Tools.java +++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java @@ -1968,6 +1968,18 @@ final class Tools { return result; } + @SuppressWarnings("unchecked") + static final Field[] fieldsArray(Object[] values, DataType type) { + if (values == null) + return (Field[]) EMPTY_FIELD; + + Field[] result = new Field[values.length]; + for (int i = 0; i < result.length; i++) + result[i] = field(values[i], type); + + return result; + } + static final Field[] fieldsArray(Object[] values, DataType[] types) { if (values == null || types == null) return EMPTY_FIELD;