From 6d415a8d76f5dd4cb4e40dda4586c12a32f2ba42 Mon Sep 17 00:00:00 2001 From: lukaseder Date: Mon, 3 Dec 2018 14:30:33 +0100 Subject: [PATCH] [#8083] Add Interval.toDuration() --- .../main/java/org/jooq/types/DayToSecond.java | 44 ++++++++++++++++++- .../main/java/org/jooq/types/Interval.java | 21 +++++++++ .../main/java/org/jooq/types/YearToMonth.java | 14 ++++++ .../java/org/jooq/types/YearToSecond.java | 7 +++ 4 files changed, 85 insertions(+), 1 deletion(-) diff --git a/jOOQ/src/main/java/org/jooq/types/DayToSecond.java b/jOOQ/src/main/java/org/jooq/types/DayToSecond.java index d7aa31ec32..ee111f39ea 100644 --- a/jOOQ/src/main/java/org/jooq/types/DayToSecond.java +++ b/jOOQ/src/main/java/org/jooq/types/DayToSecond.java @@ -39,6 +39,7 @@ package org.jooq.types; import java.time.Duration; import java.time.format.DateTimeParseException; +import java.time.temporal.ChronoUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -219,13 +220,54 @@ public final class DayToSecond extends Number implements Interval, ComparableINTERVAL DAY TO SECOND by assuming standard 24 hour days and + * 60 second minutes. + * + * @param second The number of seconds + * @param nanos The number of nano seconds + * @return The loaded INTERVAL DAY TO SECOND object + */ + public static DayToSecond valueOf(long second, int nanos) { + long abs = Math.abs(second); + + int s = (int) (abs % 60L); abs = abs / 60L; + int m = (int) (abs % 60L); abs = abs / 60L; + int h = (int) (abs % 24L); abs = abs / 24L; + int d = (int) abs; + + DayToSecond result = new DayToSecond(d, h, m, s, nanos); + + if (second < 0) + result = result.neg(); + + return result; + } + /** * Transform a {@link Duration} into a {@link DayToSecond} interval by * taking its number of milliseconds. */ public static DayToSecond valueOf(Duration duration) { - return duration == null ? null : valueOf(duration.toMillis()); + if (duration == null) + return null; + + long s = duration.get(ChronoUnit.SECONDS); + int n = (int) duration.get(ChronoUnit.NANOS); + + if (s < 0) { + n = 1_000_000_000 - n; + s++; + } + + return valueOf(s, n); + } + + @Override + public final Duration toDuration() { + return Duration.ofSeconds((long) getTotalSeconds(), getSign() * getNano()); } diff --git a/jOOQ/src/main/java/org/jooq/types/Interval.java b/jOOQ/src/main/java/org/jooq/types/Interval.java index abeddcb5af..01a404b5d2 100644 --- a/jOOQ/src/main/java/org/jooq/types/Interval.java +++ b/jOOQ/src/main/java/org/jooq/types/Interval.java @@ -38,6 +38,8 @@ package org.jooq.types; import java.io.Serializable; +import java.time.Duration; +import java.time.YearMonth; import org.jooq.Field; import org.jooq.SQLDialect; @@ -174,4 +176,23 @@ public interface Interval extends Serializable { * @see Number#shortValue() */ short shortValue(); + + + /** + * Get a duration representation of this interval. + *

+ * There is an obvious {@link Duration} representation for + * {@link DayToSecond} intervals. If the interval contains {@link YearMonth} + * information, then the corresponding duration will use: + *

+ *

+ *

+ * This corresponds to PostgreSQL's + * EXTRACT(EPOCH FROM my_interval) behaviour. + */ + Duration toDuration(); + } diff --git a/jOOQ/src/main/java/org/jooq/types/YearToMonth.java b/jOOQ/src/main/java/org/jooq/types/YearToMonth.java index a7208ab424..9a54ba0a55 100644 --- a/jOOQ/src/main/java/org/jooq/types/YearToMonth.java +++ b/jOOQ/src/main/java/org/jooq/types/YearToMonth.java @@ -37,6 +37,7 @@ */ package org.jooq.types; +import java.time.Duration; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -146,6 +147,19 @@ public final class YearToMonth extends Number implements Interval, Comparable