From 08e2d8e695c123197b1dffac7cc571e55e2d2274 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Wed, 22 Aug 2018 15:22:43 +0200 Subject: [PATCH] [#7794] Support DatePart.EPOCH --- .../resources/org/jooq/web/grammar-3.12.txt | 2 + jOOQ/src/main/java/org/jooq/DatePart.java | 5 +-- jOOQ/src/main/java/org/jooq/impl/DSL.java | 37 +++++++++++++++++++ jOOQ/src/main/java/org/jooq/impl/Extract.java | 10 +++++ .../main/java/org/jooq/impl/ParserImpl.java | 23 ++++++++++++ 5 files changed, 73 insertions(+), 4 deletions(-) diff --git a/jOOQ-manual/src/main/resources/org/jooq/web/grammar-3.12.txt b/jOOQ-manual/src/main/resources/org/jooq/web/grammar-3.12.txt index 8afc2935b5..39baa9f226 100644 --- a/jOOQ-manual/src/main/resources/org/jooq/web/grammar-3.12.txt +++ b/jOOQ-manual/src/main/resources/org/jooq/web/grammar-3.12.txt @@ -653,6 +653,7 @@ term = | 'DECODE' '(' field ',' field ',' field { ',' field } ')' | 'DENSE_RANK' ( '(' ')' over | '(' fields ')' withinGroup ) | ( 'DEG' | 'DEGREE' | 'DEGREES' ) '(' sum ')' +| 'EPOCH' '(' field ')' | 'EXTRACT' '(' datePart 'FROM' field ')' | 'EXP' '(' sum ')' | 'EVERY' '(' field ')' [ filter ] [ over ] @@ -787,6 +788,7 @@ datePart = | ( 'MILLISECOND' | 'MS' ) | ( 'MICROSECOND' | 'MCS' ) | ( 'NANOSECOND' | 'NS' ) +| 'EPOCH' | ( 'QUARTER' | 'QQ' | 'Q' ) | ( 'WEEK ' | 'WW' | 'WK' ) | ( 'ISO_DAY_OF_WEEK' | 'ISODOW' ) diff --git a/jOOQ/src/main/java/org/jooq/DatePart.java b/jOOQ/src/main/java/org/jooq/DatePart.java index f590af6731..14546a511d 100644 --- a/jOOQ/src/main/java/org/jooq/DatePart.java +++ b/jOOQ/src/main/java/org/jooq/DatePart.java @@ -167,11 +167,8 @@ public enum DatePart { /** * The epoch in seconds since 1970-01-01. - * - * @deprecated - 3.11 - [#2132] Support for this type is still experimental */ - @Support({ POSTGRES }) - @Deprecated + @Support({ H2, MARIADB, MYSQL, POSTGRES, SQLITE }) EPOCH("epoch"), /** diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index d7f68fe00c..1b7394e04a 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -14703,6 +14703,43 @@ public class DSL { return new Extract(nullSafe(field), datePart); } + /** + * Get the epoch of a date. + *

+ * This is the same as calling {@link #extract(Field, DatePart)} + * with {@link DatePart#EPOCH} + */ + @Support({ H2, MARIADB, MYSQL, POSTGRES, SQLITE }) + public static Field epoch(java.util.Date value) { + return extract(value, DatePart.EPOCH); + } + + + + /** + * Get the epoch of a date. + *

+ * This is the same as calling {@link #extract(Field, DatePart)} + * with {@link DatePart#EPOCH} + */ + @Support({ H2, MARIADB, MYSQL, POSTGRES, SQLITE }) + public static Field epoch(Temporal value) { + return extract(value, DatePart.EPOCH); + } + + + + /** + * Get the epoch of a date. + *

+ * This is the same as calling {@link #extract(Field, DatePart)} + * with {@link DatePart#EPOCH} + */ + @Support({ H2, MARIADB, MYSQL, POSTGRES, SQLITE }) + public static Field epoch(Field field) { + return extract(field, DatePart.EPOCH); + } + /** * Get the year part of a date. *

diff --git a/jOOQ/src/main/java/org/jooq/impl/Extract.java b/jOOQ/src/main/java/org/jooq/impl/Extract.java index 7e21479000..6c2ef8c2d2 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Extract.java +++ b/jOOQ/src/main/java/org/jooq/impl/Extract.java @@ -44,6 +44,7 @@ import static org.jooq.impl.DSL.inline; import static org.jooq.impl.DSL.one; import static org.jooq.impl.SQLDataType.INTEGER; +import java.sql.Date; import java.sql.Timestamp; import org.jooq.Configuration; @@ -87,6 +88,8 @@ final class Extract extends AbstractFunction { return DSL.field("{strftime}('%S', {0})", INTEGER, field); // See: https://www.sqlite.org/lang_datefunc.html + case EPOCH: + return DSL.field("{strftime}('%s', {0})", INTEGER, field); case ISO_DAY_OF_WEEK: return dowSun0ToISO(DSL.field("{strftime}('%w', {0})", INTEGER, field)); case DAY_OF_WEEK: @@ -222,6 +225,11 @@ final class Extract extends AbstractFunction { + + + + + @@ -231,6 +239,8 @@ final class Extract extends AbstractFunction { case MARIADB: case MYSQL: switch (datePart) { + case EPOCH: + return DSL.field("{unix_timestamp}({0})", INTEGER, field); case ISO_DAY_OF_WEEK: return DSL.field("{weekday}({0})", INTEGER, field).add(one()); case DAY_OF_WEEK: diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java index 6e713a0a8a..6ad41a3e00 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java @@ -92,6 +92,7 @@ import static org.jooq.impl.DSL.dayOfYear; import static org.jooq.impl.DSL.defaultValue; import static org.jooq.impl.DSL.deg; import static org.jooq.impl.DSL.denseRank; +import static org.jooq.impl.DSL.epoch; import static org.jooq.impl.DSL.every; import static org.jooq.impl.DSL.exists; import static org.jooq.impl.DSL.exp; @@ -4568,6 +4569,10 @@ final class ParserImpl implements Parser { else if (parseFunctionNameIf(ctx, "EXP")) return exp((Field) parseFieldSumParenthesised(ctx)); + if (D.is(type)) + if ((field = parseFieldEpochIf(ctx)) != null) + return field; + break; case 'f': @@ -5539,6 +5544,13 @@ final class ParserImpl implements Parser { break; + case 'e': + case 'E': + if (parseKeywordIf(ctx, "EPOCH")) + return DatePart.EPOCH; + + break; + case 'h': case 'H': if (parseKeywordIf(ctx, "HOUR") || @@ -6130,6 +6142,17 @@ final class ParserImpl implements Parser { return null; } + private static final Field parseFieldEpochIf(ParserContext ctx) { + if (parseFunctionNameIf(ctx, "EPOCH")) { + parse(ctx, '('); + Field f1 = (Field) parseField(ctx, D); + parse(ctx, ')'); + return epoch(f1); + } + + return null; + } + private static final Field parseFieldHourIf(ParserContext ctx) { if (parseFunctionNameIf(ctx, "HOUR")) { parse(ctx, '(');