Skip to content

Commit 5820853

Browse files
laurentgokou
authored andcommitted
apacheGH-38578: [Java][FlightSQL] Remove joda usage from flight-sql library (apache#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: apache#38578 Authored-by: Laurent Goujon <[email protected]> Signed-off-by: David Li <[email protected]>
1 parent 47733f3 commit 5820853

File tree

4 files changed

+49
-53
lines changed

4 files changed

+49
-53
lines changed

flight/flight-sql-jdbc-core/pom.xml

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -136,12 +136,6 @@
136136
<artifactId>bcpkix-jdk15on</artifactId>
137137
<version>1.61</version>
138138
</dependency>
139-
140-
<dependency>
141-
<groupId>joda-time</groupId>
142-
<artifactId>joda-time</artifactId>
143-
<version>2.10.14</version>
144-
</dependency>
145139
</dependencies>
146140

147141
<build>

flight/flight-sql-jdbc-core/src/main/java/org/apache/arrow/driver/jdbc/accessor/impl/calendar/ArrowFlightJdbcIntervalVectorAccessor.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import static org.apache.arrow.vector.util.DateUtility.yearsToMonths;
2323

2424
import java.sql.SQLException;
25+
import java.time.Duration;
26+
import java.time.Period;
2527
import java.util.function.IntSupplier;
2628

2729
import org.apache.arrow.driver.jdbc.accessor.ArrowFlightJdbcAccessor;
@@ -31,7 +33,6 @@
3133
import org.apache.arrow.vector.IntervalYearVector;
3234
import org.apache.arrow.vector.holders.NullableIntervalDayHolder;
3335
import org.apache.arrow.vector.holders.NullableIntervalYearHolder;
34-
import org.joda.time.Period;
3536

3637
/**
3738
* Accessor for the Arrow type {@link IntervalDayVector}.
@@ -62,7 +63,7 @@ public ArrowFlightJdbcIntervalVectorAccessor(IntervalDayVector vector,
6263
} else {
6364
final int days = holder.days;
6465
final int millis = holder.milliseconds;
65-
return formatIntervalDay(new Period().plusDays(days).plusMillis(millis));
66+
return formatIntervalDay(Duration.ofDays(days).plusMillis(millis));
6667
}
6768
};
6869
objectClass = java.time.Duration.class;
@@ -89,7 +90,7 @@ public ArrowFlightJdbcIntervalVectorAccessor(IntervalYearVector vector,
8990
final int interval = holder.value;
9091
final int years = (interval / yearsToMonths);
9192
final int months = (interval % yearsToMonths);
92-
return formatIntervalYear(new Period().plusYears(years).plusMonths(months));
93+
return formatIntervalYear(Period.ofYears(years).plusMonths(months));
9394
}
9495
};
9596
objectClass = java.time.Period.class;

flight/flight-sql-jdbc-core/src/main/java/org/apache/arrow/driver/jdbc/utils/IntervalStringUtils.java

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@
1717

1818
package org.apache.arrow.driver.jdbc.utils;
1919

20+
import java.time.Duration;
21+
import java.time.Period;
22+
2023
import org.apache.arrow.vector.util.DateUtility;
21-
import org.joda.time.Period;
2224

2325
/**
2426
* Utility class to format periods similar to Oracle's representation
@@ -36,7 +38,7 @@ private IntervalStringUtils( ) {}
3638
* For example, the string "+21-02" defines an interval of 21 years and 2 months.
3739
*/
3840
public static String formatIntervalYear(final Period p) {
39-
long months = p.getYears() * (long) DateUtility.yearsToMonths + p.getMonths();
41+
long months = p.toTotalMonths();
4042
boolean neg = false;
4143
if (months < 0) {
4244
months = -months;
@@ -53,8 +55,8 @@ public static String formatIntervalYear(final Period p) {
5355
* For example, the string "-001 18:25:16.766" defines an interval of
5456
* - 1 day 18 hours 25 minutes 16 seconds and 766 milliseconds.
5557
*/
56-
public static String formatIntervalDay(final Period p) {
57-
long millis = p.getDays() * (long) DateUtility.daysToStandardMillis + millisFromPeriod(p);
58+
public static String formatIntervalDay(final Duration d) {
59+
long millis = d.toMillis();
5860

5961
boolean neg = false;
6062
if (millis < 0) {
@@ -76,9 +78,4 @@ public static String formatIntervalDay(final Period p) {
7678

7779
return String.format("%c%03d %02d:%02d:%02d.%03d", neg ? '-' : '+', days, hours, minutes, seconds, millis);
7880
}
79-
80-
public static int millisFromPeriod(Period period) {
81-
return period.getHours() * DateUtility.hoursToMillis + period.getMinutes() * DateUtility.minutesToMillis +
82-
period.getSeconds() * DateUtility.secondsToMillis + period.getMillis();
83-
}
8481
}

flight/flight-sql-jdbc-core/src/test/java/org/apache/arrow/driver/jdbc/accessor/impl/calendar/ArrowFlightJdbcIntervalVectorAccessorTest.java

Lines changed: 39 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import static org.apache.arrow.driver.jdbc.utils.IntervalStringUtils.formatIntervalYear;
2222
import static org.hamcrest.CoreMatchers.equalTo;
2323
import static org.hamcrest.CoreMatchers.is;
24-
import static org.joda.time.Period.parse;
2524

2625
import java.time.Duration;
2726
import java.time.Period;
@@ -142,57 +141,62 @@ private String getStringOnVector(ValueVector vector, int index) {
142141
if (object == null) {
143142
return null;
144143
} else if (vector instanceof IntervalDayVector) {
145-
return formatIntervalDay(parse(object));
144+
return formatIntervalDay(Duration.parse(object));
146145
} else if (vector instanceof IntervalYearVector) {
147-
return formatIntervalYear(parse(object));
146+
return formatIntervalYear(Period.parse(object));
148147
}
149148
return null;
150149
}
151150

152151
@Test
153152
public void testShouldGetIntervalYear( ) {
154-
Assert.assertEquals("-002-00", formatIntervalYear(parse("P-2Y")));
155-
Assert.assertEquals("-001-01", formatIntervalYear(parse("P-1Y-1M")));
156-
Assert.assertEquals("-001-02", formatIntervalYear(parse("P-1Y-2M")));
157-
Assert.assertEquals("-002-03", formatIntervalYear(parse("P-2Y-3M")));
158-
Assert.assertEquals("-002-04", formatIntervalYear(parse("P-2Y-4M")));
159-
Assert.assertEquals("-011-01", formatIntervalYear(parse("P-11Y-1M")));
160-
Assert.assertEquals("+002-00", formatIntervalYear(parse("P+2Y")));
161-
Assert.assertEquals("+001-01", formatIntervalYear(parse("P+1Y1M")));
162-
Assert.assertEquals("+001-02", formatIntervalYear(parse("P+1Y2M")));
163-
Assert.assertEquals("+002-03", formatIntervalYear(parse("P+2Y3M")));
164-
Assert.assertEquals("+002-04", formatIntervalYear(parse("P+2Y4M")));
165-
Assert.assertEquals("+011-01", formatIntervalYear(parse("P+11Y1M")));
153+
Assert.assertEquals("-002-00", formatIntervalYear(Period.parse("P-2Y")));
154+
Assert.assertEquals("-001-01", formatIntervalYear(Period.parse("P-1Y-1M")));
155+
Assert.assertEquals("-001-02", formatIntervalYear(Period.parse("P-1Y-2M")));
156+
Assert.assertEquals("-002-03", formatIntervalYear(Period.parse("P-2Y-3M")));
157+
Assert.assertEquals("-002-04", formatIntervalYear(Period.parse("P-2Y-4M")));
158+
Assert.assertEquals("-011-01", formatIntervalYear(Period.parse("P-11Y-1M")));
159+
Assert.assertEquals("+002-00", formatIntervalYear(Period.parse("P+2Y")));
160+
Assert.assertEquals("+001-01", formatIntervalYear(Period.parse("P+1Y1M")));
161+
Assert.assertEquals("+001-02", formatIntervalYear(Period.parse("P+1Y2M")));
162+
Assert.assertEquals("+002-03", formatIntervalYear(Period.parse("P+2Y3M")));
163+
Assert.assertEquals("+002-04", formatIntervalYear(Period.parse("P+2Y4M")));
164+
Assert.assertEquals("+011-01", formatIntervalYear(Period.parse("P+11Y1M")));
166165
}
167166

168167
@Test
169168
public void testShouldGetIntervalDay( ) {
170-
Assert.assertEquals("-001 00:00:00.000", formatIntervalDay(parse("PT-24H")));
171-
Assert.assertEquals("+001 00:00:00.000", formatIntervalDay(parse("PT+24H")));
172-
Assert.assertEquals("-000 01:00:00.000", formatIntervalDay(parse("PT-1H")));
173-
Assert.assertEquals("-000 01:00:00.001", formatIntervalDay(parse("PT-1H-0M-00.001S")));
174-
Assert.assertEquals("-000 01:01:01.000", formatIntervalDay(parse("PT-1H-1M-1S")));
175-
Assert.assertEquals("-000 02:02:02.002", formatIntervalDay(parse("PT-2H-2M-02.002S")));
176-
Assert.assertEquals("-000 23:59:59.999", formatIntervalDay(parse("PT-23H-59M-59.999S")));
177-
Assert.assertEquals("-000 11:59:00.100", formatIntervalDay(parse("PT-11H-59M-00.100S")));
178-
Assert.assertEquals("-000 05:02:03.000", formatIntervalDay(parse("PT-5H-2M-3S")));
179-
Assert.assertEquals("-000 22:22:22.222", formatIntervalDay(parse("PT-22H-22M-22.222S")));
180-
Assert.assertEquals("+000 01:00:00.000", formatIntervalDay(parse("PT+1H")));
181-
Assert.assertEquals("+000 01:00:00.001", formatIntervalDay(parse("PT+1H0M00.001S")));
182-
Assert.assertEquals("+000 01:01:01.000", formatIntervalDay(parse("PT+1H1M1S")));
183-
Assert.assertEquals("+000 02:02:02.002", formatIntervalDay(parse("PT+2H2M02.002S")));
184-
Assert.assertEquals("+000 23:59:59.999", formatIntervalDay(parse("PT+23H59M59.999S")));
185-
Assert.assertEquals("+000 11:59:00.100", formatIntervalDay(parse("PT+11H59M00.100S")));
186-
Assert.assertEquals("+000 05:02:03.000", formatIntervalDay(parse("PT+5H2M3S")));
187-
Assert.assertEquals("+000 22:22:22.222", formatIntervalDay(parse("PT+22H22M22.222S")));
169+
Assert.assertEquals("-001 00:00:00.000", formatIntervalDay(Duration.parse("PT-24H")));
170+
Assert.assertEquals("+001 00:00:00.000", formatIntervalDay(Duration.parse("PT+24H")));
171+
Assert.assertEquals("-000 01:00:00.000", formatIntervalDay(Duration.parse("PT-1H")));
172+
// "JDK-8054978: java.time.Duration.parse() fails for negative duration with 0 seconds and nanos" not fixed on JDK8
173+
//Assert.assertEquals("-000 01:00:00.001", formatIntervalDay(Duration.parse("PT-1H-0M-00.001S")));
174+
Assert.assertEquals("-000 01:00:00.001", formatIntervalDay(Duration.ofHours(-1).minusMillis(1)));
175+
Assert.assertEquals("-000 01:01:01.000", formatIntervalDay(Duration.parse("PT-1H-1M-1S")));
176+
Assert.assertEquals("-000 02:02:02.002", formatIntervalDay(Duration.parse("PT-2H-2M-02.002S")));
177+
Assert.assertEquals("-000 23:59:59.999", formatIntervalDay(Duration.parse("PT-23H-59M-59.999S")));
178+
// "JDK-8054978: java.time.Duration.parse() fails for negative duration with 0 seconds and nanos" not fixed on JDK8
179+
//Assert.assertEquals("-000 11:59:00.100", formatIntervalDay(Duration.parse("PT-11H-59M-00.100S")));
180+
Assert.assertEquals("-000 11:59:00.100",
181+
formatIntervalDay(Duration.ofHours(-11).minusMinutes(59).minusMillis(100)));
182+
Assert.assertEquals("-000 05:02:03.000", formatIntervalDay(Duration.parse("PT-5H-2M-3S")));
183+
Assert.assertEquals("-000 22:22:22.222", formatIntervalDay(Duration.parse("PT-22H-22M-22.222S")));
184+
Assert.assertEquals("+000 01:00:00.000", formatIntervalDay(Duration.parse("PT+1H")));
185+
Assert.assertEquals("+000 01:00:00.001", formatIntervalDay(Duration.parse("PT+1H0M00.001S")));
186+
Assert.assertEquals("+000 01:01:01.000", formatIntervalDay(Duration.parse("PT+1H1M1S")));
187+
Assert.assertEquals("+000 02:02:02.002", formatIntervalDay(Duration.parse("PT+2H2M02.002S")));
188+
Assert.assertEquals("+000 23:59:59.999", formatIntervalDay(Duration.parse("PT+23H59M59.999S")));
189+
Assert.assertEquals("+000 11:59:00.100", formatIntervalDay(Duration.parse("PT+11H59M00.100S")));
190+
Assert.assertEquals("+000 05:02:03.000", formatIntervalDay(Duration.parse("PT+5H2M3S")));
191+
Assert.assertEquals("+000 22:22:22.222", formatIntervalDay(Duration.parse("PT+22H22M22.222S")));
188192
}
189193

190194
@Test
191195
public void testIntervalDayWithJodaPeriodObject() {
192196
Assert.assertEquals("+1567 00:00:00.000",
193-
formatIntervalDay(new org.joda.time.Period().plusDays(1567)));
197+
formatIntervalDay(Duration.ofDays(1567)));
194198
Assert.assertEquals("-1567 00:00:00.000",
195-
formatIntervalDay(new org.joda.time.Period().minusDays(1567)));
199+
formatIntervalDay(Duration.ofDays(-1567)));
196200
}
197201

198202
@Test

0 commit comments

Comments
 (0)