[#5645] Integrate localDateAdd support into DSL

This commit is contained in:
Miguel Gonzalez Sanchez 2017-05-12 12:41:44 +01:00 committed by Miguel Gonzalez
parent 6831cb305d
commit 6a8eba9f04
No known key found for this signature in database
GPG Key ID: 1E99682DA68AC52B
2 changed files with 267 additions and 0 deletions

View File

@ -12690,6 +12690,59 @@ public class DSL {
return new DateOrTime<LocalDate>(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<LocalDate> 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<LocalDate> localDateAdd(Field<LocalDate> date, Field<? extends Number> 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<LocalDate> 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<LocalDate> localDateAdd(LocalDate date, Field<? extends Number> 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<LocalDate> localDateAdd(Field<LocalDate> 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<LocalDate> localDateAdd(Field<LocalDate> date, Field<? extends Number> interval,
DatePart datePart) {
return new LocalDateAdd(nullSafe(date), nullSafe(interval), datePart);
}
/**
* Convert a string value to a <code>TIME</code>.
*/

View File

@ -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<LocalDate> {
/**
* Generated UID
*/
private static final long serialVersionUID = -7700140530346259350L;
private final Field<LocalDate> date;
private final Field<? extends Number> interval;
private final DatePart datePart;
LocalDateAdd(Field<LocalDate> date, Field<? extends Number> 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);
}
}