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);
   }
+
 }