From 6a8eba9f04ff25eb9e0292ded99c35634b34a80c Mon Sep 17 00:00:00 2001 From: Miguel Gonzalez Sanchez Date: Fri, 12 May 2017 12:41:44 +0100 Subject: [PATCH 1/4] [#5645] Integrate localDateAdd support into DSL --- jOOQ/src/main/java/org/jooq/impl/DSL.java | 53 +++++ .../main/java/org/jooq/impl/LocalDateAdd.java | 214 ++++++++++++++++++ 2 files changed, 267 insertions(+) create mode 100644 jOOQ/src/main/java/org/jooq/impl/LocalDateAdd.java diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index 17b891a9af..f1fab05537 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -12690,6 +12690,59 @@ public class DSL { return new DateOrTime(field, SQLDataType.LOCALDATE); } + /** + * Add an interval to a {@link LocalDate}. + * + * @see Field#add(Number) + */ + @Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE }) + public static Field localDateAdd(LocalDate date, Number interval) { + return localDateAdd(Tools.field(date), Tools.field(interval)); + } + + /** + * Add an interval to a {@link LocalDate}. + * + * @see Field#add(Field) + */ + @Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE }) + public static Field localDateAdd(Field date, Field interval) { + return nullSafe(date).add(interval); + } + + /** + * Add an interval to {@link LocalDate}, given a date part. + */ + @Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE }) + public static Field localDateAdd(LocalDate date, Number interval, DatePart datePart) { + return localDateAdd(Tools.field(date), Tools.field(interval), datePart); + } + + /** + * Add an interval to a {@link LocalDate}, given a date part. + */ + @Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE }) + public static Field localDateAdd(LocalDate date, Field interval, DatePart datePart) { + return localDateAdd(Tools.field(date), nullSafe(interval), datePart); + } + + /** + * Add an interval to a {@link LocalDate}, given a date part. + */ + @Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE }) + public static Field localDateAdd(Field date, Number interval, DatePart datePart) { + return localDateAdd(nullSafe(date), Tools.field(interval), datePart); + } + + /** + * Add an interval to a {@link LocalDate}, given a date part. + */ + @Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE }) + public static Field localDateAdd(Field date, Field interval, + DatePart datePart) { + return new LocalDateAdd(nullSafe(date), nullSafe(interval), datePart); + } + /** * Convert a string value to a TIME. */ diff --git a/jOOQ/src/main/java/org/jooq/impl/LocalDateAdd.java b/jOOQ/src/main/java/org/jooq/impl/LocalDateAdd.java new file mode 100644 index 0000000000..9a51186def --- /dev/null +++ b/jOOQ/src/main/java/org/jooq/impl/LocalDateAdd.java @@ -0,0 +1,214 @@ +package org.jooq.impl; + +import static org.jooq.impl.DSL.inline; +import static org.jooq.impl.DSL.keyword; + +import java.time.LocalDate; + +import org.jooq.Configuration; +import org.jooq.DatePart; +import org.jooq.Field; +import org.jooq.QueryPart; + +/** + * @author Miguel Gonzalez Sanchez + */ +final class LocalDateAdd extends AbstractFunction { + + /** + * Generated UID + */ + private static final long serialVersionUID = -7700140530346259350L; + + private final Field date; + private final Field interval; + private final DatePart datePart; + + LocalDateAdd(Field date, Field interval, DatePart datePart) { + super("localDateAdd", date.getDataType().getSQLDataType()); + + this.date = date; + this.interval = interval; + this.datePart = datePart; + } + + @SuppressWarnings("incomplete-switch") + @Override + final QueryPart getFunction0(Configuration configuration) { + String keyword = null; + + switch (configuration.family()) { + case CUBRID: + case MARIADB: + case MYSQL: { + switch (datePart) { + case YEAR: + keyword = "year"; + break; + case MONTH: + keyword = "month"; + break; + case DAY: + keyword = "day"; + break; + case HOUR: + keyword = "hour"; + break; + case MINUTE: + keyword = "minute"; + break; + case SECOND: + keyword = "second"; + break; + default: + throwUnsupported(); + } + + return DSL.field("{date_add}({0}, {interval} {1} {2})", getDataType(), date, interval, keyword(keyword)); + } + + case DERBY: + case HSQLDB: { + switch (datePart) { + case YEAR: + keyword = "sql_tsi_year"; + break; + case MONTH: + keyword = "sql_tsi_month"; + break; + case DAY: + keyword = "sql_tsi_day"; + break; + case HOUR: + keyword = "sql_tsi_hour"; + break; + case MINUTE: + keyword = "sql_tsi_minute"; + break; + case SECOND: + keyword = "sql_tsi_second"; + break; + default: + throwUnsupported(); + } + + return DSL.field("{fn {timestampadd}({0}, {1}, {2}) }", getDataType(), keyword(keyword), interval, date); + } + + case FIREBIRD: { + switch (datePart) { + case YEAR: + keyword = "year"; + break; + case MONTH: + keyword = "month"; + break; + case DAY: + keyword = "day"; + break; + case HOUR: + keyword = "hour"; + break; + case MINUTE: + keyword = "minute"; + break; + case SECOND: + keyword = "second"; + break; + default: + throwUnsupported(); + } + + return DSL.field("{dateadd}({0}, {1}, {2})", getDataType(), keyword(keyword), interval, date); + } + + case H2: { + switch (datePart) { + case YEAR: + keyword = "year"; + break; + case MONTH: + keyword = "month"; + break; + case DAY: + keyword = "day"; + break; + case HOUR: + keyword = "hour"; + break; + case MINUTE: + keyword = "minute"; + break; + case SECOND: + keyword = "second"; + break; + default: + throwUnsupported(); + } + + return DSL.field("{dateadd}({0}, {1}, {2})", getDataType(), inline(keyword), interval, date); + } + + case POSTGRES: { + switch (datePart) { + case YEAR: + keyword = " year"; + break; + case MONTH: + keyword = " month"; + break; + case DAY: + keyword = " day"; + break; + case HOUR: + keyword = " hour"; + break; + case MINUTE: + keyword = " minute"; + break; + case SECOND: + keyword = " second"; + break; + default: + throwUnsupported(); + } + + return DSL.field("({0} + ({1} || {2})::interval)::date", getDataType(), date, interval, inline(keyword)); + } + + case SQLITE: { + switch (datePart) { + case YEAR: + keyword = " year"; + break; + case MONTH: + keyword = " month"; + break; + case DAY: + keyword = " day"; + break; + case HOUR: + keyword = " hour"; + break; + case MINUTE: + keyword = " minute"; + break; + case SECOND: + keyword = " second"; + break; + default: + throwUnsupported(); + } + + return DSL.field("{datetime}({0}, '+' || {1} || {2})", getDataType(), date, interval, inline(keyword)); + } + + } + + return null; + } + + private final void throwUnsupported() { + throw new UnsupportedOperationException("Unknown date part : " + datePart); + } +} \ No newline at end of file From f28a99d3537a7edb0b2d2a4d1b0ee382be744d09 Mon Sep 17 00:00:00 2001 From: Miguel Gonzalez Date: Sat, 13 May 2017 00:03:59 +0100 Subject: [PATCH 2/4] [#5645] Integrate localDateSub support into DSL --- jOOQ/src/main/java/org/jooq/impl/DSL.java | 147 +++++++++++++++------- 1 file changed, 100 insertions(+), 47 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index f1fab05537..7602a2bed0 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -12690,58 +12690,111 @@ public class DSL { return new DateOrTime(field, SQLDataType.LOCALDATE); } - /** - * Add an interval to a {@link LocalDate}. - * - * @see Field#add(Number) - */ - @Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE }) - public static Field localDateAdd(LocalDate date, Number interval) { - return localDateAdd(Tools.field(date), Tools.field(interval)); - } + /** + * Add an interval to a {@link LocalDate}. + * + * @see Field#add(Number) + */ + @Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE }) + public static Field localDateAdd(LocalDate date, Number interval) { + return localDateAdd(Tools.field(date), Tools.field(interval)); + } - /** - * Add an interval to a {@link LocalDate}. - * - * @see Field#add(Field) - */ - @Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE }) - public static Field localDateAdd(Field date, Field interval) { - return nullSafe(date).add(interval); - } + /** + * Add an interval to a {@link LocalDate}. + * + * @see Field#add(Field) + */ + @Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE }) + public static Field localDateAdd(Field date, Field interval) { + return nullSafe(date).add(interval); + } - /** - * Add an interval to {@link LocalDate}, given a date part. - */ - @Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE }) - public static Field localDateAdd(LocalDate date, Number interval, DatePart datePart) { - return localDateAdd(Tools.field(date), Tools.field(interval), datePart); - } + /** + * Add an interval to {@link LocalDate}, given a date part. + */ + @Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE }) + public static Field localDateAdd(LocalDate date, Number interval, DatePart datePart) { + return localDateAdd(Tools.field(date), Tools.field(interval), datePart); + } - /** - * Add an interval to a {@link LocalDate}, given a date part. - */ - @Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE }) - public static Field localDateAdd(LocalDate date, Field interval, DatePart datePart) { - return localDateAdd(Tools.field(date), nullSafe(interval), datePart); - } + /** + * Add an interval to a {@link LocalDate}, given a date part. + */ + @Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE }) + public static Field localDateAdd(LocalDate date, Field interval, DatePart datePart) { + return localDateAdd(Tools.field(date), nullSafe(interval), datePart); + } - /** - * Add an interval to a {@link LocalDate}, given a date part. - */ - @Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE }) - public static Field localDateAdd(Field date, Number interval, DatePart datePart) { - return localDateAdd(nullSafe(date), Tools.field(interval), datePart); - } + /** + * Add an interval to a {@link LocalDate}, given a date part. + */ + @Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE }) + public static Field localDateAdd(Field date, Number interval, DatePart datePart) { + return localDateAdd(nullSafe(date), Tools.field(interval), datePart); + } - /** - * Add an interval to a {@link LocalDate}, given a date part. - */ - @Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE }) - public static Field localDateAdd(Field date, Field interval, - DatePart datePart) { - return new LocalDateAdd(nullSafe(date), nullSafe(interval), datePart); - } + /** + * Add an interval to a {@link LocalDate}, given a date part. + */ + @Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE }) + public static Field localDateAdd(Field date, Field interval, + DatePart datePart) { + return new LocalDateAdd(nullSafe(date), nullSafe(interval), datePart); + } + + /** + * Subtract an interval from a {@link LocalDate}. + * + * @see Field#add(Number) + */ + @Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE }) + public static Field localDateSub(LocalDate date, Number interval) { + return localDateSub(Tools.field(date), Tools.field(interval)); + } + + /** + * Subtract an interval from a {@link LocalDate}. + * + * @see Field#add(Field) + */ + @Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE }) + public static Field localDateSub(Field date, Field interval) { + return nullSafe(date).sub(interval); + } + + /** + * Subtract an interval from a {@link LocalDate}, given a date part. + */ + @Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE }) + public static Field localDateSub(LocalDate date, Number interval, DatePart datePart) { + return localDateSub(Tools.field(date), Tools.field(interval), datePart); + } + + /** + * Subtract an interval from a {@link LocalDate}, given a date part. + */ + @Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE }) + public static Field localDateSub(LocalDate date, Field interval, DatePart datePart) { + return localDateSub(Tools.field(date), nullSafe(interval), datePart); + } + + /** + * Subtract an interval from a {@link LocalDate}, given a date part. + */ + @Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE }) + public static Field localDateSub(Field date, Number interval, DatePart datePart) { + return localDateSub(nullSafe(date), Tools.field(interval), datePart); + } + + /** + * Subtract an interval from a {@link LocalDate}, given a date part. + */ + @Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE }) + public static Field localDateSub(Field date, Field interval, + DatePart datePart) { + return new LocalDateAdd(nullSafe(date), nullSafe(interval).neg(), datePart); + } /** * Convert a string value to a TIME. From 9f0d706b6124a6a92398fb7b1d6ff111356b814c Mon Sep 17 00:00:00 2001 From: Miguel Gonzalez Date: Sat, 13 May 2017 00:13:56 +0100 Subject: [PATCH 3/4] [#5645] Integrate localDateDiff support into DSL --- jOOQ/src/main/java/org/jooq/impl/DSL.java | 40 ++++++++++++++ .../java/org/jooq/impl/LocalDateDiff.java | 54 +++++++++++++++++++ 2 files changed, 94 insertions(+) create mode 100644 jOOQ/src/main/java/org/jooq/impl/LocalDateDiff.java diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index 7602a2bed0..8da7aec6b4 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -12690,6 +12690,46 @@ public class DSL { return new DateOrTime(field, SQLDataType.LOCALDATE); } + /** + * Get the date difference in number of days. + * + * @see Field#sub(Field) + */ + @Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE }) + public static Field localDateDiff(LocalDate date1, LocalDate date2) { + return localDateDiff(Tools.field(date1), Tools.field(date2)); + } + + /** + * Get the date difference in number of days. + * + * @see Field#sub(Field) + */ + @Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE }) + public static Field localDateDiff(Field date1, LocalDate date2) { + return localDateDiff(nullSafe(date1), Tools.field(date2)); + } + + /** + * Get the date difference in number of days. + * + * @see Field#sub(Field) + */ + @Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE }) + public static Field localDateDiff(LocalDate date1, Field date2) { + return localDateDiff(Tools.field(date1), nullSafe(date2)); + } + + /** + * Get the date difference in number of days. + * + * @see Field#sub(Field) + */ + @Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE }) + public static Field localDateDiff(Field date1, Field date2) { + return new LocalDateDiff(nullSafe(date1), nullSafe(date2)); + } + /** * Add an interval to a {@link LocalDate}. * diff --git a/jOOQ/src/main/java/org/jooq/impl/LocalDateDiff.java b/jOOQ/src/main/java/org/jooq/impl/LocalDateDiff.java new file mode 100644 index 0000000000..d6969bf719 --- /dev/null +++ b/jOOQ/src/main/java/org/jooq/impl/LocalDateDiff.java @@ -0,0 +1,54 @@ +package org.jooq.impl; + +import static org.jooq.impl.DSL.function; + +import java.time.LocalDate; + +import org.jooq.Configuration; +import org.jooq.Field; + +final class LocalDateDiff extends AbstractFunction { + + /** + * Generated UID + */ + private static final long serialVersionUID = 6010434059957641551L; + + private final Field date1; + private final Field date2; + + LocalDateDiff(Field date1, Field date2) { + super("localdatediff", SQLDataType.INTEGER, date1, date2); + + this.date1 = date1; + this.date2 = date2; + } + + @SuppressWarnings("incomplete-switch") + @Override + final Field getFunction0(Configuration configuration) { + switch (configuration.family()) { + case MARIADB: + case MYSQL: + return function("datediff", getDataType(), date1, date2); + + case DERBY: + return DSL.field("{fn {timestampdiff}({sql_tsi_day}, {0}, {1}) }", getDataType(), date2, date1); + + case FIREBIRD: + return DSL.field("{datediff}(day, {0}, {1})", getDataType(), date2, date1); + case H2: + case HSQLDB: + return DSL.field("{datediff}('day', {0}, {1})", getDataType(), date2, date1); + case SQLITE: + return DSL.field("({strftime}('%s', {0}) - {strftime}('%s', {1})) / 86400", getDataType(), date1, date2); + case CUBRID: + case POSTGRES: + // [#4481] Parentheses are important in case this expression is + // placed in the context of other arithmetic + return DSL.field("({0} - {1})", getDataType(), date1, date2); + } + // Default implementation for equals() and hashCode() + return date1.sub(date2).cast(Integer.class); + } +} From 75c87a485268682582337d6c01fa37d46f68aa74 Mon Sep 17 00:00:00 2001 From: Miguel Gonzalez Date: Sat, 13 May 2017 00:19:09 +0100 Subject: [PATCH 4/4] [#5645] Add contributor name to ABOUT.txt --- jOOQ/src/main/resources/META-INF/ABOUT.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/jOOQ/src/main/resources/META-INF/ABOUT.txt b/jOOQ/src/main/resources/META-INF/ABOUT.txt index 86a4f52a8b..e799cf3416 100644 --- a/jOOQ/src/main/resources/META-INF/ABOUT.txt +++ b/jOOQ/src/main/resources/META-INF/ABOUT.txt @@ -27,6 +27,7 @@ Authors and contributors of jOOQ or parts of jOOQ in alphabetical order: - Matti Tahvonen - Michael Doberenz - Michał Kołodziejski +- Miguel Gonzalez Sanchez - Nathaniel Fischer - Oliver Flege - Peter Ertl @@ -49,4 +50,4 @@ Authors and contributors of jOOQ or parts of jOOQ in alphabetical order: - Zoltan Tamasi See the following website for details about contributing to jOOQ: -https://github.com/jOOQ/jOOQ/blob/master/CONTRIBUTING.md \ No newline at end of file +https://github.com/jOOQ/jOOQ/blob/master/CONTRIBUTING.md