From 63338776626d0bc8b0dbdd0605d66af368fd4bed Mon Sep 17 00:00:00 2001 From: lukaseder Date: Thu, 4 Jan 2018 10:41:37 +0100 Subject: [PATCH] [#6485] [#6978] Add support for TRANSLATE() function --- .../resources/org/jooq/web/grammar-3.11.txt | 7 ++++--- jOOQ/src/main/java/org/jooq/impl/DSL.java | 19 +++++++++++++++++++ .../main/java/org/jooq/impl/ParserImpl.java | 18 ++++++++++++++++++ 3 files changed, 41 insertions(+), 3 deletions(-) diff --git a/jOOQ-manual/src/main/resources/org/jooq/web/grammar-3.11.txt b/jOOQ-manual/src/main/resources/org/jooq/web/grammar-3.11.txt index 933d817117..0c333c3ab1 100644 --- a/jOOQ-manual/src/main/resources/org/jooq/web/grammar-3.11.txt +++ b/jOOQ-manual/src/main/resources/org/jooq/web/grammar-3.11.txt @@ -598,13 +598,14 @@ term = | 'STDDEV_POP' '(' field ')' [ over ] | 'STDDEV_SAMP' '(' field ')' [ over ] | 'SUM' '(' [ 'DISTINCT' | 'ALL' ] field ')' [ keep | filter ] -| truthValue -| 'TRIM' '(' field ')' -| 'TRUNC' '(' sum ',' sum ')' | 'TAN' '(' sum ')' | 'TANH' '(' sum ')' | timeLiteral | timestampLiteral +| 'TRANSLATE' '(' field ',' field ',' field ')' +| 'TRIM' '(' field ')' +| 'TRUNC' '(' sum ',' sum ')' +| truthValue | ( 'UPPER' | 'UCASE' ) '(' field ')' | 'VAR_POP' '(' field ')' [ over ] | 'VAR_SAMP' '(' field ')' [ over ] diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index fcbf0f5486..33e8a58964 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -68,6 +68,7 @@ import static org.jooq.SQLDialect.SQLITE; // ... // ... // ... +// ... import static org.jooq.impl.Term.ROW_NUMBER; import static org.jooq.impl.Tools.EMPTY_FIELD; import static org.jooq.impl.Tools.EMPTY_QUERYPART; @@ -12541,6 +12542,24 @@ public class DSL { return new Lpad(nullSafe(field), nullSafe(length), nullSafe(character)); } + /** + * Get the translate(field, from, to) function. + * + * @see #translate(Field, Field, Field) + */ + @Support({ POSTGRES }) + public static Field translate(Field text, String from, String to) { + return translate(text, Tools.field(from), Tools.field(to)); + } + + /** + * Get the translate(field, from, to) function. + */ + @Support({ POSTGRES }) + public static Field translate(Field text, Field from, Field to) { + return function("translate", text.getDataType(), text, from, to); + } + /** * Get the repeat(field, count) function. * diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java index 8d0d2badc1..bca1ed974a 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java @@ -194,6 +194,7 @@ import static org.jooq.impl.DSL.tan; import static org.jooq.impl.DSL.tanh; import static org.jooq.impl.DSL.time; import static org.jooq.impl.DSL.timestamp; +import static org.jooq.impl.DSL.translate; import static org.jooq.impl.DSL.trim; import static org.jooq.impl.DSL.unique; import static org.jooq.impl.DSL.user; @@ -3448,6 +3449,8 @@ final class ParserImpl implements Parser { if (S.is(type)) if ((field = parseFieldTrimIf(ctx)) != null) return field; + else if ((field = parseFieldTranslateIf(ctx)) != null) + return field; if (N.is(type)) if ((field = parseFieldTruncIf(ctx)) != null) @@ -4058,6 +4061,21 @@ final class ParserImpl implements Parser { return null; } + private static final Field parseFieldTranslateIf(ParserContext ctx) { + if (parseFunctionNameIf(ctx, "TRANSLATE")) { + parse(ctx, '('); + Field f1 = (Field) parseField(ctx, S); + parse(ctx, ','); + Field f2 = (Field) parseField(ctx, S); + parse(ctx, ','); + Field f3 = (Field) parseField(ctx, S); + parse(ctx, ')'); + return translate(f1, f2, f3); + } + + return null; + } + private static final Field parseFieldRtrimIf(ParserContext ctx) { if (parseFunctionNameIf(ctx, "RTRIM")) { parse(ctx, '(');