You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by hx...@apache.org on 2019/09/26 17:19:03 UTC
[incubator-iotdb] 03/12: fix a bug in TimeRange's intersect function
This is an automated email from the ASF dual-hosted git repository.
hxd pushed a commit to branch rel/0.8
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git
commit 8ee937b72b8cc0d08fde0f274525b6241f043aca
Author: RUI, LEI <ne...@163.com>
AuthorDate: Sun Sep 8 10:35:08 2019 +0800
fix a bug in TimeRange's intersect function
---
.../apache/iotdb/tsfile/read/common/TimeRange.java | 12 +-
.../iotdb/tsfile/read/common/TimeRangeTest.java | 215 +++++++++++++++------
2 files changed, 166 insertions(+), 61 deletions(-)
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/TimeRange.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/TimeRange.java
index 792bd51..1b1b98a 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/TimeRange.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/TimeRange.java
@@ -134,7 +134,7 @@ public class TimeRange implements Comparable<TimeRange> {
*
* [1,3] does not intersect with (4,5].
*
- * [1,3) does not intersect with (3,5]
+ * [1,3) does not intersect with (3,5].
*
* [1,3] does not intersect with [5,6].
*
@@ -147,7 +147,7 @@ public class TimeRange implements Comparable<TimeRange> {
* @param r the given time range
* @return true if the current time range intersects with the given time range r
*/
- private boolean intersects(TimeRange r) {
+ public boolean intersects(TimeRange r) {
if ((!leftClose || !r.rightClose) && (r.max < min)) {
// e.g., [1,3] does not intersect with (4,5].
return false;
@@ -156,10 +156,10 @@ public class TimeRange implements Comparable<TimeRange> {
return false;
} else if (leftClose && r.rightClose && r.max <= min - 2) {
// e.g.,[1,3] does not intersect with [5,6].
- return true;
+ return false;
} else if ((!rightClose || !r.leftClose) && (r.min > max)) {
return false;
- } else if (!rightClose && r.leftClose && r.min >= max) {
+ } else if (!rightClose && !r.leftClose && r.min >= max) {
return false;
} else if (rightClose && r.leftClose && r.min >= max + 2) {
return false;
@@ -190,11 +190,11 @@ public class TimeRange implements Comparable<TimeRange> {
private boolean leftClose = true; // default true
private boolean rightClose = true; // default true
- private void setLeftClose(boolean leftClose) {
+ public void setLeftClose(boolean leftClose) {
this.leftClose = leftClose;
}
- private void setRightClose(boolean rightClose) {
+ public void setRightClose(boolean rightClose) {
this.rightClose = rightClose;
}
diff --git a/tsfile/src/test/java/org/apache/iotdb/tsfile/read/common/TimeRangeTest.java b/tsfile/src/test/java/org/apache/iotdb/tsfile/read/common/TimeRangeTest.java
index 514f8e2..db6e5b3 100644
--- a/tsfile/src/test/java/org/apache/iotdb/tsfile/read/common/TimeRangeTest.java
+++ b/tsfile/src/test/java/org/apache/iotdb/tsfile/read/common/TimeRangeTest.java
@@ -19,6 +19,8 @@
package org.apache.iotdb.tsfile.read.common;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import org.junit.Assert;
@@ -27,6 +29,90 @@ import org.junit.Test;
public class TimeRangeTest {
@Test
+ /*
+ * [1,3] does not intersect with (4,5].
+ */
+ public void intersect1() {
+ TimeRange r1 = new TimeRange(1, 3);
+ TimeRange r2 = new TimeRange(4, 5);
+ r2.setLeftClose(false);
+ assertEquals("[ 1 : 3 ]", r1.toString());
+ assertEquals("( 4 : 5 ]", r2.toString());
+ assertFalse(r1.intersects(r2));
+ assertFalse(r2.intersects(r1));
+ }
+
+ @Test
+ /*
+ * [1,3) does not intersect with (3,5]
+ */
+ public void intersect2() {
+ TimeRange r1 = new TimeRange(1, 3);
+ r1.setRightClose(false);
+ TimeRange r2 = new TimeRange(3, 5);
+ r2.setLeftClose(false);
+ assertEquals("[ 1 : 3 )", r1.toString());
+ assertEquals("( 3 : 5 ]", r2.toString());
+ assertFalse(r1.intersects(r2));
+ assertFalse(r2.intersects(r1));
+ }
+
+ @Test
+ /*
+ * [1,3] does not intersect with [5,6].
+ */
+ public void intersect3() {
+ TimeRange r1 = new TimeRange(1, 3);
+ TimeRange r2 = new TimeRange(5, 6);
+ assertEquals("[ 1 : 3 ]", r1.toString());
+ assertEquals("[ 5 : 6 ]", r2.toString());
+ assertFalse(r1.intersects(r2));
+ assertFalse(r2.intersects(r1));
+ }
+
+ @Test
+ /*
+ * [1,3] intersects with [2,5].
+ */
+ public void intersect4() {
+ TimeRange r1 = new TimeRange(1, 3);
+ TimeRange r2 = new TimeRange(2, 5);
+ assertEquals("[ 1 : 3 ]", r1.toString());
+ assertEquals("[ 2 : 5 ]", r2.toString());
+ assertTrue(r1.intersects(r2));
+ assertTrue(r2.intersects(r1));
+ }
+
+ @Test
+ /*
+ * [1,3] intersects with (3,5].
+ */
+ public void intersect5() {
+ TimeRange r1 = new TimeRange(1, 3);
+ TimeRange r2 = new TimeRange(3, 5);
+ r2.setLeftClose(false);
+ assertEquals("[ 1 : 3 ]", r1.toString());
+ assertEquals("( 3 : 5 ]", r2.toString());
+ assertTrue(r1.intersects(r2));
+ assertTrue(r2.intersects(r1));
+ }
+
+ @Test
+ /*
+ * [1,3) intersects with (2,5].
+ */
+ public void intersect6() {
+ TimeRange r1 = new TimeRange(1, 3);
+ r1.setRightClose(false);
+ TimeRange r2 = new TimeRange(2, 5);
+ r2.setLeftClose(false);
+ assertEquals("[ 1 : 3 )", r1.toString());
+ assertEquals("( 2 : 5 ]", r2.toString());
+ assertTrue(r1.intersects(r2));
+ assertTrue(r2.intersects(r1));
+ }
+
+ @Test
public void mergeTest() {
ArrayList<TimeRange> unionCandidates = new ArrayList<>();
unionCandidates.add(new TimeRange(0L, 10L));
@@ -55,10 +141,10 @@ public class TimeRangeTest {
ArrayList<TimeRange> remainRanges = new ArrayList<>(r.getRemains(prevRanges));
assertEquals(1, remainRanges.size());
- assertEquals(remainRanges.get(0).getMin(), 1);
- assertEquals(remainRanges.get(0).getMax(), 10);
- assertEquals(remainRanges.get(0).getLeftClose(), true);
- assertEquals(remainRanges.get(0).getRightClose(), true);
+ assertEquals(1, remainRanges.get(0).getMin());
+ assertEquals(10, remainRanges.get(0).getMax());
+ assertTrue(remainRanges.get(0).getLeftClose());
+ assertTrue(remainRanges.get(0).getRightClose());
}
@Test
@@ -88,10 +174,10 @@ public class TimeRangeTest {
ArrayList<TimeRange> remainRanges = new ArrayList<>(r.getRemains(prevRanges));
assertEquals(1, remainRanges.size());
- assertEquals(remainRanges.get(0).getMin(), 3);
- assertEquals(remainRanges.get(0).getMax(), 10);
- assertEquals(remainRanges.get(0).getLeftClose(), false);
- assertEquals(remainRanges.get(0).getRightClose(), true);
+ assertEquals(3, remainRanges.get(0).getMin());
+ assertEquals(10, remainRanges.get(0).getMax());
+ assertFalse(remainRanges.get(0).getLeftClose());
+ assertTrue(remainRanges.get(0).getRightClose());
}
@Test
@@ -107,10 +193,10 @@ public class TimeRangeTest {
ArrayList<TimeRange> remainRanges = new ArrayList<>(r.getRemains(prevRanges));
assertEquals(1, remainRanges.size());
- assertEquals(remainRanges.get(0).getMin(), 1);
- assertEquals(remainRanges.get(0).getMax(), 5);
- assertEquals(remainRanges.get(0).getLeftClose(), true);
- assertEquals(remainRanges.get(0).getRightClose(), false);
+ assertEquals(1, remainRanges.get(0).getMin());
+ assertEquals(5, remainRanges.get(0).getMax());
+ assertTrue(remainRanges.get(0).getLeftClose());
+ assertFalse(remainRanges.get(0).getRightClose());
}
@Test
@@ -126,14 +212,14 @@ public class TimeRangeTest {
ArrayList<TimeRange> remainRanges = new ArrayList<>(r.getRemains(prevRanges));
assertEquals(2, remainRanges.size());
- assertEquals(remainRanges.get(0).getMin(), 1);
- assertEquals(remainRanges.get(0).getMax(), 3);
- assertEquals(remainRanges.get(0).getLeftClose(), true);
- assertEquals(remainRanges.get(0).getRightClose(), false);
- assertEquals(remainRanges.get(1).getMin(), 8);
- assertEquals(remainRanges.get(1).getMax(), 10);
- assertEquals(remainRanges.get(1).getLeftClose(), false);
- assertEquals(remainRanges.get(1).getRightClose(), true);
+ assertEquals(1, remainRanges.get(0).getMin());
+ assertEquals(3, remainRanges.get(0).getMax());
+ assertTrue(remainRanges.get(0).getLeftClose());
+ assertFalse(remainRanges.get(0).getRightClose());
+ assertEquals(8, remainRanges.get(1).getMin());
+ assertEquals(10, remainRanges.get(1).getMax());
+ assertFalse(remainRanges.get(1).getLeftClose());
+ assertTrue(remainRanges.get(1).getRightClose());
}
@@ -150,10 +236,10 @@ public class TimeRangeTest {
ArrayList<TimeRange> remainRanges = new ArrayList<>(r.getRemains(prevRanges));
assertEquals(1, remainRanges.size());
- assertEquals(remainRanges.get(0).getMin(), 5);
- assertEquals(remainRanges.get(0).getMax(), 10);
- assertEquals(remainRanges.get(0).getLeftClose(), false);
- assertEquals(remainRanges.get(0).getRightClose(), true);
+ assertEquals(5, remainRanges.get(0).getMin());
+ assertEquals(10, remainRanges.get(0).getMax());
+ assertFalse(remainRanges.get(0).getLeftClose());
+ assertTrue(remainRanges.get(0).getRightClose());
}
@Test
@@ -169,10 +255,10 @@ public class TimeRangeTest {
ArrayList<TimeRange> remainRanges = new ArrayList<>(r.getRemains(prevRanges));
assertEquals(1, remainRanges.size());
- assertEquals(remainRanges.get(0).getMin(), 2);
- assertEquals(remainRanges.get(0).getMax(), 10);
- assertEquals(remainRanges.get(0).getLeftClose(), false);
- assertEquals(remainRanges.get(0).getRightClose(), true);
+ assertEquals(2, remainRanges.get(0).getMin());
+ assertEquals(10, remainRanges.get(0).getMax());
+ assertFalse(remainRanges.get(0).getLeftClose());
+ assertTrue(remainRanges.get(0).getRightClose());
}
@Test
@@ -188,10 +274,10 @@ public class TimeRangeTest {
ArrayList<TimeRange> remainRanges = new ArrayList<>(r.getRemains(prevRanges));
assertEquals(1, remainRanges.size());
- assertEquals(remainRanges.get(0).getMin(), 1);
- assertEquals(remainRanges.get(0).getMax(), 6);
- assertEquals(remainRanges.get(0).getLeftClose(), true);
- assertEquals(remainRanges.get(0).getRightClose(), false);
+ assertEquals(1, remainRanges.get(0).getMin());
+ assertEquals(6, remainRanges.get(0).getMax());
+ assertTrue(remainRanges.get(0).getLeftClose());
+ assertFalse(remainRanges.get(0).getRightClose());
}
@Test
@@ -207,10 +293,10 @@ public class TimeRangeTest {
ArrayList<TimeRange> remainRanges = new ArrayList<>(r.getRemains(prevRanges));
assertEquals(1, remainRanges.size());
- assertEquals(remainRanges.get(0).getMin(), 1);
- assertEquals(remainRanges.get(0).getMax(), 11);
- assertEquals(remainRanges.get(0).getLeftClose(), true);
- assertEquals(remainRanges.get(0).getRightClose(), false);
+ assertEquals(1, remainRanges.get(0).getMin());
+ assertEquals(11, remainRanges.get(0).getMax());
+ assertTrue(remainRanges.get(0).getLeftClose());
+ assertFalse(remainRanges.get(0).getRightClose());
}
@Test
@@ -226,18 +312,18 @@ public class TimeRangeTest {
ArrayList<TimeRange> remainRanges = new ArrayList<>(r.getRemains(prevRanges));
assertEquals(3, remainRanges.size());
- assertEquals(remainRanges.get(0).getMin(), 1);
- assertEquals(remainRanges.get(0).getMax(), 3);
- assertEquals(remainRanges.get(0).getLeftClose(), true);
- assertEquals(remainRanges.get(0).getRightClose(), false);
- assertEquals(remainRanges.get(1).getMin(), 4);
- assertEquals(remainRanges.get(1).getMax(), 6);
- assertEquals(remainRanges.get(1).getLeftClose(), false);
- assertEquals(remainRanges.get(1).getRightClose(), false);
- assertEquals(remainRanges.get(2).getMin(), 8);
- assertEquals(remainRanges.get(2).getMax(), 10);
- assertEquals(remainRanges.get(2).getLeftClose(), false);
- assertEquals(remainRanges.get(2).getRightClose(), true);
+ assertEquals(1, remainRanges.get(0).getMin());
+ assertEquals(3, remainRanges.get(0).getMax());
+ assertTrue(remainRanges.get(0).getLeftClose());
+ assertFalse(remainRanges.get(0).getRightClose());
+ assertEquals(4, remainRanges.get(1).getMin());
+ assertEquals(6, remainRanges.get(1).getMax());
+ assertFalse(remainRanges.get(1).getLeftClose());
+ assertFalse(remainRanges.get(1).getRightClose());
+ assertEquals(8, remainRanges.get(2).getMin());
+ assertEquals(10, remainRanges.get(2).getMax());
+ assertFalse(remainRanges.get(2).getLeftClose());
+ assertTrue(remainRanges.get(2).getRightClose());
}
@Test
@@ -253,13 +339,32 @@ public class TimeRangeTest {
ArrayList<TimeRange> remainRanges = new ArrayList<>(r.getRemains(prevRanges));
assertEquals(2, remainRanges.size());
- assertEquals(remainRanges.get(0).getMin(), 1);
- assertEquals(remainRanges.get(0).getMax(), 3);
+ assertEquals(1, remainRanges.get(0).getMin());
+ assertEquals(3, remainRanges.get(0).getMax());
+ assertTrue(remainRanges.get(0).getLeftClose());
+ assertFalse(remainRanges.get(0).getRightClose());
+ assertEquals(4, remainRanges.get(1).getMin());
+ assertEquals(11, remainRanges.get(1).getMax()); // NOTE here is the technical detail.
+ assertFalse(remainRanges.get(1).getLeftClose());
+ assertFalse(remainRanges.get(1).getRightClose());
+ }
+
+ @Test
+ /*
+ current ranges DO NOT overlap with previous ranges.
+ */
+ public void getRemainsTest11() {
+ TimeRange r = new TimeRange(4, 10);
+
+ ArrayList<TimeRange> prevRanges = new ArrayList<>();
+ prevRanges.add(new TimeRange(1, 2));
+
+ ArrayList<TimeRange> remainRanges = new ArrayList<>(r.getRemains(prevRanges));
+ assertEquals(1, remainRanges.size());
+ assertEquals(4, remainRanges.get(0).getMin());
+ assertEquals(10, remainRanges.get(0).getMax());
assertEquals(remainRanges.get(0).getLeftClose(), true);
- assertEquals(remainRanges.get(0).getRightClose(), false);
- assertEquals(remainRanges.get(1).getMin(), 4);
- assertEquals(remainRanges.get(1).getMax(), 11); // NOTE here is the technical detail.
- assertEquals(remainRanges.get(1).getLeftClose(), false);
- assertEquals(remainRanges.get(1).getRightClose(), false);
+ assertEquals(remainRanges.get(0).getRightClose(), true);
}
+
}