aboutsummaryrefslogtreecommitdiff
path: root/unsafe
diff options
context:
space:
mode:
authorLiang-Chi Hsieh <viirya@appier.com>2015-07-17 09:38:08 -0700
committerReynold Xin <rxin@databricks.com>2015-07-17 09:38:08 -0700
commiteba6a1af4c8ffb21934a59a61a419d625f37cceb (patch)
tree963d47659b358384adf73a4e8040a328d1a04c80 /unsafe
parent305e77cd83f3dbe680a920d5329c2e8c58452d5b (diff)
downloadspark-eba6a1af4c8ffb21934a59a61a419d625f37cceb.tar.gz
spark-eba6a1af4c8ffb21934a59a61a419d625f37cceb.tar.bz2
spark-eba6a1af4c8ffb21934a59a61a419d625f37cceb.zip
[SPARK-8945][SQL] Add add and subtract expressions for IntervalType
JIRA: https://issues.apache.org/jira/browse/SPARK-8945 Add add and subtract expressions for IntervalType. Author: Liang-Chi Hsieh <viirya@appier.com> This patch had conflicts when merged, resolved by Committer: Reynold Xin <rxin@databricks.com> Closes #7398 from viirya/interval_add_subtract and squashes the following commits: acd1f1e [Liang-Chi Hsieh] Merge remote-tracking branch 'upstream/master' into interval_add_subtract 5abae28 [Liang-Chi Hsieh] For comments. 6f5b72e [Liang-Chi Hsieh] Merge remote-tracking branch 'upstream/master' into interval_add_subtract dbe3906 [Liang-Chi Hsieh] For comments. 13a2fc5 [Liang-Chi Hsieh] Merge remote-tracking branch 'upstream/master' into interval_add_subtract 83ec129 [Liang-Chi Hsieh] Remove intervalMethod. acfe1ab [Liang-Chi Hsieh] Fix scala style. d3e9d0e [Liang-Chi Hsieh] Add add and subtract expressions for IntervalType.
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";