aboutsummaryrefslogtreecommitdiff
path: root/unsafe
diff options
context:
space:
mode:
Diffstat (limited to 'unsafe')
-rw-r--r--unsafe/src/main/java/org/apache/spark/unsafe/types/Interval.java16
-rw-r--r--unsafe/src/test/java/org/apache/spark/unsafe/types/IntervalSuite.java38
2 files changed, 54 insertions, 0 deletions
diff --git a/unsafe/src/main/java/org/apache/spark/unsafe/types/Interval.java b/unsafe/src/main/java/org/apache/spark/unsafe/types/Interval.java
index 905ea0b7b8..71b1a85a81 100644
--- a/unsafe/src/main/java/org/apache/spark/unsafe/types/Interval.java
+++ b/unsafe/src/main/java/org/apache/spark/unsafe/types/Interval.java
@@ -87,6 +87,22 @@ public final class Interval implements Serializable {
this.microseconds = microseconds;
}
+ public Interval add(Interval that) {
+ int months = this.months + that.months;
+ long microseconds = this.microseconds + that.microseconds;
+ return new Interval(months, microseconds);
+ }
+
+ public Interval subtract(Interval that) {
+ int months = this.months - that.months;
+ long microseconds = this.microseconds - that.microseconds;
+ return new Interval(months, microseconds);
+ }
+
+ public Interval negate() {
+ return new Interval(-this.months, -this.microseconds);
+ }
+
@Override
public boolean equals(Object other) {
if (this == other) return true;
diff --git a/unsafe/src/test/java/org/apache/spark/unsafe/types/IntervalSuite.java b/unsafe/src/test/java/org/apache/spark/unsafe/types/IntervalSuite.java
index 1832d0bc65..d29517cda6 100644
--- a/unsafe/src/test/java/org/apache/spark/unsafe/types/IntervalSuite.java
+++ b/unsafe/src/test/java/org/apache/spark/unsafe/types/IntervalSuite.java
@@ -101,6 +101,44 @@ public class IntervalSuite {
assertEquals(Interval.fromString(input), null);
}
+ @Test
+ public void addTest() {
+ String input = "interval 3 month 1 hour";
+ String input2 = "interval 2 month 100 hour";
+
+ Interval interval = Interval.fromString(input);
+ Interval interval2 = Interval.fromString(input2);
+
+ assertEquals(interval.add(interval2), new Interval(5, 101 * MICROS_PER_HOUR));
+
+ input = "interval -10 month -81 hour";
+ input2 = "interval 75 month 200 hour";
+
+ interval = Interval.fromString(input);
+ interval2 = Interval.fromString(input2);
+
+ assertEquals(interval.add(interval2), new Interval(65, 119 * MICROS_PER_HOUR));
+ }
+
+ @Test
+ public void subtractTest() {
+ String input = "interval 3 month 1 hour";
+ String input2 = "interval 2 month 100 hour";
+
+ Interval interval = Interval.fromString(input);
+ Interval interval2 = Interval.fromString(input2);
+
+ assertEquals(interval.subtract(interval2), new Interval(1, -99 * MICROS_PER_HOUR));
+
+ input = "interval -10 month -81 hour";
+ input2 = "interval 75 month 200 hour";
+
+ interval = Interval.fromString(input);
+ interval2 = Interval.fromString(input2);
+
+ assertEquals(interval.subtract(interval2), new Interval(-85, -281 * MICROS_PER_HOUR));
+ }
+
private void testSingleUnit(String unit, int number, int months, long microseconds) {
String input1 = "interval " + number + " " + unit;
String input2 = "interval " + number + " " + unit + "s";