You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by li...@apache.org on 2023/11/06 19:34:47 UTC

(arrow) branch main updated: GH-38578: [Java][FlightSQL] Remove joda usage from flight-sql library (#38579)

This is an automated email from the ASF dual-hosted git repository.

lidavidm pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow.git


The following commit(s) were added to refs/heads/main by this push:
     new 02d8bd26ef GH-38578: [Java][FlightSQL] Remove joda usage from flight-sql library (#38579)
02d8bd26ef is described below

commit 02d8bd26ef5a8a6f840d4cc98f669ea81c534487
Author: Laurent Goujon <la...@users.noreply.github.com>
AuthorDate: Mon Nov 6 11:34:40 2023 -0800

    GH-38578: [Java][FlightSQL] Remove joda usage from flight-sql library (#38579)
    
    ### Rationale for this change
    
    [joda](https://www.joda.org/joda-time/) is a very popular date/time manipulation library for java but the introduction of `java.time` package makes it obsolete and author actually recommends using `java.time` over `joda`
    
    > Note that from Java SE 8 onwards, users are asked to migrate to java.time (JSR-310) - a core part of the JDK which replaces this project.
    
    ### What changes are included in this PR?
    
    Change include the use of `java.time` classes over `joda` classes and the removal of `joda` library as a dependency
    
    ### Are these changes tested?
    
    As there is no behavior change, it is covered by the existing tests
    * Closes: #38578
    
    Authored-by: Laurent Goujon <la...@apache.org>
    Signed-off-by: David Li <li...@gmail.com>
---
 java/flight/flight-sql-jdbc-core/pom.xml           |  6 --
 .../ArrowFlightJdbcIntervalVectorAccessor.java     |  7 +-
 .../driver/jdbc/utils/IntervalStringUtils.java     | 15 ++---
 .../ArrowFlightJdbcIntervalVectorAccessorTest.java | 74 ++++++++++++----------
 4 files changed, 49 insertions(+), 53 deletions(-)

diff --git a/java/flight/flight-sql-jdbc-core/pom.xml b/java/flight/flight-sql-jdbc-core/pom.xml
index 8a0e62bde8..cbeaa88f1e 100644
--- a/java/flight/flight-sql-jdbc-core/pom.xml
+++ b/java/flight/flight-sql-jdbc-core/pom.xml
@@ -136,12 +136,6 @@
             <artifactId>bcpkix-jdk15on</artifactId>
             <version>1.61</version>
         </dependency>
-
-        <dependency>
-            <groupId>joda-time</groupId>
-            <artifactId>joda-time</artifactId>
-            <version>2.10.14</version>
-        </dependency>
     </dependencies>
 
     <build>
diff --git a/java/flight/flight-sql-jdbc-core/src/main/java/org/apache/arrow/driver/jdbc/accessor/impl/calendar/ArrowFlightJdbcIntervalVectorAccessor.java b/java/flight/flight-sql-jdbc-core/src/main/java/org/apache/arrow/driver/jdbc/accessor/impl/calendar/ArrowFlightJdbcIntervalVectorAccessor.java
index 283dc9160a..21d1c15712 100644
--- a/java/flight/flight-sql-jdbc-core/src/main/java/org/apache/arrow/driver/jdbc/accessor/impl/calendar/ArrowFlightJdbcIntervalVectorAccessor.java
+++ b/java/flight/flight-sql-jdbc-core/src/main/java/org/apache/arrow/driver/jdbc/accessor/impl/calendar/ArrowFlightJdbcIntervalVectorAccessor.java
@@ -22,6 +22,8 @@ import static org.apache.arrow.driver.jdbc.utils.IntervalStringUtils.formatInter
 import static org.apache.arrow.vector.util.DateUtility.yearsToMonths;
 
 import java.sql.SQLException;
+import java.time.Duration;
+import java.time.Period;
 import java.util.function.IntSupplier;
 
 import org.apache.arrow.driver.jdbc.accessor.ArrowFlightJdbcAccessor;
@@ -31,7 +33,6 @@ import org.apache.arrow.vector.IntervalDayVector;
 import org.apache.arrow.vector.IntervalYearVector;
 import org.apache.arrow.vector.holders.NullableIntervalDayHolder;
 import org.apache.arrow.vector.holders.NullableIntervalYearHolder;
-import org.joda.time.Period;
 
 /**
  * Accessor for the Arrow type {@link IntervalDayVector}.
@@ -62,7 +63,7 @@ public class ArrowFlightJdbcIntervalVectorAccessor extends ArrowFlightJdbcAccess
       } else {
         final int days = holder.days;
         final int millis = holder.milliseconds;
-        return formatIntervalDay(new Period().plusDays(days).plusMillis(millis));
+        return formatIntervalDay(Duration.ofDays(days).plusMillis(millis));
       }
     };
     objectClass = java.time.Duration.class;
@@ -89,7 +90,7 @@ public class ArrowFlightJdbcIntervalVectorAccessor extends ArrowFlightJdbcAccess
         final int interval = holder.value;
         final int years = (interval / yearsToMonths);
         final int months = (interval % yearsToMonths);
-        return formatIntervalYear(new Period().plusYears(years).plusMonths(months));
+        return formatIntervalYear(Period.ofYears(years).plusMonths(months));
       }
     };
     objectClass = java.time.Period.class;
diff --git a/java/flight/flight-sql-jdbc-core/src/main/java/org/apache/arrow/driver/jdbc/utils/IntervalStringUtils.java b/java/flight/flight-sql-jdbc-core/src/main/java/org/apache/arrow/driver/jdbc/utils/IntervalStringUtils.java
index 05643274ac..fdf6c508d9 100644
--- a/java/flight/flight-sql-jdbc-core/src/main/java/org/apache/arrow/driver/jdbc/utils/IntervalStringUtils.java
+++ b/java/flight/flight-sql-jdbc-core/src/main/java/org/apache/arrow/driver/jdbc/utils/IntervalStringUtils.java
@@ -17,8 +17,10 @@
 
 package org.apache.arrow.driver.jdbc.utils;
 
+import java.time.Duration;
+import java.time.Period;
+
 import org.apache.arrow.vector.util.DateUtility;
-import org.joda.time.Period;
 
 /**
  * Utility class to format periods similar to Oracle's representation
@@ -36,7 +38,7 @@ public final class IntervalStringUtils {
    * For example, the string "+21-02" defines an interval of 21 years and 2 months.
    */
   public static String formatIntervalYear(final Period p) {
-    long months = p.getYears() * (long) DateUtility.yearsToMonths + p.getMonths();
+    long months = p.toTotalMonths();
     boolean neg = false;
     if (months < 0) {
       months = -months;
@@ -53,8 +55,8 @@ public final class IntervalStringUtils {
    * For example, the string "-001 18:25:16.766" defines an interval of
    * - 1 day 18 hours 25 minutes 16 seconds and 766 milliseconds.
    */
-  public static String formatIntervalDay(final Period p) {
-    long millis = p.getDays() * (long) DateUtility.daysToStandardMillis + millisFromPeriod(p);
+  public static String formatIntervalDay(final Duration d) {
+    long millis = d.toMillis();
 
     boolean neg = false;
     if (millis < 0) {
@@ -76,9 +78,4 @@ public final class IntervalStringUtils {
 
     return String.format("%c%03d %02d:%02d:%02d.%03d", neg ? '-' : '+', days, hours, minutes, seconds, millis);
   }
-
-  public static int millisFromPeriod(Period period) {
-    return period.getHours() * DateUtility.hoursToMillis + period.getMinutes() * DateUtility.minutesToMillis +
-        period.getSeconds() * DateUtility.secondsToMillis + period.getMillis();
-  }
 }
diff --git a/java/flight/flight-sql-jdbc-core/src/test/java/org/apache/arrow/driver/jdbc/accessor/impl/calendar/ArrowFlightJdbcIntervalVectorAccessorTest.java b/java/flight/flight-sql-jdbc-core/src/test/java/org/apache/arrow/driver/jdbc/accessor/impl/calendar/ArrowFlightJdbcIntervalVectorAccessorTest.java
index ea22869220..322b7d40bd 100644
--- a/java/flight/flight-sql-jdbc-core/src/test/java/org/apache/arrow/driver/jdbc/accessor/impl/calendar/ArrowFlightJdbcIntervalVectorAccessorTest.java
+++ b/java/flight/flight-sql-jdbc-core/src/test/java/org/apache/arrow/driver/jdbc/accessor/impl/calendar/ArrowFlightJdbcIntervalVectorAccessorTest.java
@@ -21,7 +21,6 @@ import static org.apache.arrow.driver.jdbc.utils.IntervalStringUtils.formatInter
 import static org.apache.arrow.driver.jdbc.utils.IntervalStringUtils.formatIntervalYear;
 import static org.hamcrest.CoreMatchers.equalTo;
 import static org.hamcrest.CoreMatchers.is;
-import static org.joda.time.Period.parse;
 
 import java.time.Duration;
 import java.time.Period;
@@ -142,57 +141,62 @@ public class ArrowFlightJdbcIntervalVectorAccessorTest {
     if (object == null) {
       return null;
     } else if (vector instanceof IntervalDayVector) {
-      return formatIntervalDay(parse(object));
+      return formatIntervalDay(Duration.parse(object));
     } else if (vector instanceof IntervalYearVector) {
-      return formatIntervalYear(parse(object));
+      return formatIntervalYear(Period.parse(object));
     }
     return null;
   }
 
   @Test
   public void testShouldGetIntervalYear( ) {
-    Assert.assertEquals("-002-00", formatIntervalYear(parse("P-2Y")));
-    Assert.assertEquals("-001-01", formatIntervalYear(parse("P-1Y-1M")));
-    Assert.assertEquals("-001-02", formatIntervalYear(parse("P-1Y-2M")));
-    Assert.assertEquals("-002-03", formatIntervalYear(parse("P-2Y-3M")));
-    Assert.assertEquals("-002-04", formatIntervalYear(parse("P-2Y-4M")));
-    Assert.assertEquals("-011-01", formatIntervalYear(parse("P-11Y-1M")));
-    Assert.assertEquals("+002-00", formatIntervalYear(parse("P+2Y")));
-    Assert.assertEquals("+001-01", formatIntervalYear(parse("P+1Y1M")));
-    Assert.assertEquals("+001-02", formatIntervalYear(parse("P+1Y2M")));
-    Assert.assertEquals("+002-03", formatIntervalYear(parse("P+2Y3M")));
-    Assert.assertEquals("+002-04", formatIntervalYear(parse("P+2Y4M")));
-    Assert.assertEquals("+011-01", formatIntervalYear(parse("P+11Y1M")));
+    Assert.assertEquals("-002-00", formatIntervalYear(Period.parse("P-2Y")));
+    Assert.assertEquals("-001-01", formatIntervalYear(Period.parse("P-1Y-1M")));
+    Assert.assertEquals("-001-02", formatIntervalYear(Period.parse("P-1Y-2M")));
+    Assert.assertEquals("-002-03", formatIntervalYear(Period.parse("P-2Y-3M")));
+    Assert.assertEquals("-002-04", formatIntervalYear(Period.parse("P-2Y-4M")));
+    Assert.assertEquals("-011-01", formatIntervalYear(Period.parse("P-11Y-1M")));
+    Assert.assertEquals("+002-00", formatIntervalYear(Period.parse("P+2Y")));
+    Assert.assertEquals("+001-01", formatIntervalYear(Period.parse("P+1Y1M")));
+    Assert.assertEquals("+001-02", formatIntervalYear(Period.parse("P+1Y2M")));
+    Assert.assertEquals("+002-03", formatIntervalYear(Period.parse("P+2Y3M")));
+    Assert.assertEquals("+002-04", formatIntervalYear(Period.parse("P+2Y4M")));
+    Assert.assertEquals("+011-01", formatIntervalYear(Period.parse("P+11Y1M")));
   }
 
   @Test
   public void testShouldGetIntervalDay( ) {
-    Assert.assertEquals("-001 00:00:00.000", formatIntervalDay(parse("PT-24H")));
-    Assert.assertEquals("+001 00:00:00.000", formatIntervalDay(parse("PT+24H")));
-    Assert.assertEquals("-000 01:00:00.000", formatIntervalDay(parse("PT-1H")));
-    Assert.assertEquals("-000 01:00:00.001", formatIntervalDay(parse("PT-1H-0M-00.001S")));
-    Assert.assertEquals("-000 01:01:01.000", formatIntervalDay(parse("PT-1H-1M-1S")));
-    Assert.assertEquals("-000 02:02:02.002", formatIntervalDay(parse("PT-2H-2M-02.002S")));
-    Assert.assertEquals("-000 23:59:59.999", formatIntervalDay(parse("PT-23H-59M-59.999S")));
-    Assert.assertEquals("-000 11:59:00.100", formatIntervalDay(parse("PT-11H-59M-00.100S")));
-    Assert.assertEquals("-000 05:02:03.000", formatIntervalDay(parse("PT-5H-2M-3S")));
-    Assert.assertEquals("-000 22:22:22.222", formatIntervalDay(parse("PT-22H-22M-22.222S")));
-    Assert.assertEquals("+000 01:00:00.000", formatIntervalDay(parse("PT+1H")));
-    Assert.assertEquals("+000 01:00:00.001", formatIntervalDay(parse("PT+1H0M00.001S")));
-    Assert.assertEquals("+000 01:01:01.000", formatIntervalDay(parse("PT+1H1M1S")));
-    Assert.assertEquals("+000 02:02:02.002", formatIntervalDay(parse("PT+2H2M02.002S")));
-    Assert.assertEquals("+000 23:59:59.999", formatIntervalDay(parse("PT+23H59M59.999S")));
-    Assert.assertEquals("+000 11:59:00.100", formatIntervalDay(parse("PT+11H59M00.100S")));
-    Assert.assertEquals("+000 05:02:03.000", formatIntervalDay(parse("PT+5H2M3S")));
-    Assert.assertEquals("+000 22:22:22.222", formatIntervalDay(parse("PT+22H22M22.222S")));
+    Assert.assertEquals("-001 00:00:00.000", formatIntervalDay(Duration.parse("PT-24H")));
+    Assert.assertEquals("+001 00:00:00.000", formatIntervalDay(Duration.parse("PT+24H")));
+    Assert.assertEquals("-000 01:00:00.000", formatIntervalDay(Duration.parse("PT-1H")));
+    // "JDK-8054978: java.time.Duration.parse() fails for negative duration with 0 seconds and nanos" not fixed on JDK8
+    //Assert.assertEquals("-000 01:00:00.001", formatIntervalDay(Duration.parse("PT-1H-0M-00.001S")));
+    Assert.assertEquals("-000 01:00:00.001", formatIntervalDay(Duration.ofHours(-1).minusMillis(1)));
+    Assert.assertEquals("-000 01:01:01.000", formatIntervalDay(Duration.parse("PT-1H-1M-1S")));
+    Assert.assertEquals("-000 02:02:02.002", formatIntervalDay(Duration.parse("PT-2H-2M-02.002S")));
+    Assert.assertEquals("-000 23:59:59.999", formatIntervalDay(Duration.parse("PT-23H-59M-59.999S")));
+    // "JDK-8054978: java.time.Duration.parse() fails for negative duration with 0 seconds and nanos" not fixed on JDK8
+    //Assert.assertEquals("-000 11:59:00.100", formatIntervalDay(Duration.parse("PT-11H-59M-00.100S")));
+    Assert.assertEquals("-000 11:59:00.100", 
+        formatIntervalDay(Duration.ofHours(-11).minusMinutes(59).minusMillis(100)));
+    Assert.assertEquals("-000 05:02:03.000", formatIntervalDay(Duration.parse("PT-5H-2M-3S")));
+    Assert.assertEquals("-000 22:22:22.222", formatIntervalDay(Duration.parse("PT-22H-22M-22.222S")));
+    Assert.assertEquals("+000 01:00:00.000", formatIntervalDay(Duration.parse("PT+1H")));
+    Assert.assertEquals("+000 01:00:00.001", formatIntervalDay(Duration.parse("PT+1H0M00.001S")));
+    Assert.assertEquals("+000 01:01:01.000", formatIntervalDay(Duration.parse("PT+1H1M1S")));
+    Assert.assertEquals("+000 02:02:02.002", formatIntervalDay(Duration.parse("PT+2H2M02.002S")));
+    Assert.assertEquals("+000 23:59:59.999", formatIntervalDay(Duration.parse("PT+23H59M59.999S")));
+    Assert.assertEquals("+000 11:59:00.100", formatIntervalDay(Duration.parse("PT+11H59M00.100S")));
+    Assert.assertEquals("+000 05:02:03.000", formatIntervalDay(Duration.parse("PT+5H2M3S")));
+    Assert.assertEquals("+000 22:22:22.222", formatIntervalDay(Duration.parse("PT+22H22M22.222S")));
   }
 
   @Test
   public void testIntervalDayWithJodaPeriodObject() {
     Assert.assertEquals("+1567 00:00:00.000",
-        formatIntervalDay(new org.joda.time.Period().plusDays(1567)));
+        formatIntervalDay(Duration.ofDays(1567)));
     Assert.assertEquals("-1567 00:00:00.000",
-        formatIntervalDay(new org.joda.time.Period().minusDays(1567)));
+        formatIntervalDay(Duration.ofDays(-1567)));
   }
 
   @Test