This is an automated email from the ASF dual-hosted git repository.
xingtanzjr pushed a commit to branch overlap_check_tool
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/overlap_check_tool by this
push:
new 82122e106ae Time range tool (#10816)
82122e106ae is described below
commit 82122e106aec823a3443c5d727eed75fab81284c
Author: Zhijia Cao <[email protected]>
AuthorDate: Wed Aug 9 11:22:39 2023 +0800
Time range tool (#10816)
---
.../compaction/tool/ListTimeRangeImpl.java | 6 +-
.../compaction/tool/SegmentTreeImpl.java | 65 ++++++++++++++++++++++
.../compaction/tools/ListTimeRangeImplTest.java | 46 ++++++++++++++-
.../compaction/tools/SegmentTreeImplTest.java | 19 +++++++
4 files changed, 131 insertions(+), 5 deletions(-)
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/tool/ListTimeRangeImpl.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/tool/ListTimeRangeImpl.java
index 9b3991f58e1..ac882719c4a 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/tool/ListTimeRangeImpl.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/tool/ListTimeRangeImpl.java
@@ -77,10 +77,8 @@ public class ListTimeRangeImpl implements ITimeRange {
@Override
public boolean isOverlapped(Interval interval) {
for (Interval currentInterval : intervalList) {
- if (interval.getStart() <= currentInterval.getEnd()
- || interval.getEnd() <= currentInterval.getEnd()) {
- return true;
- }
+ return interval.getStart() <= currentInterval.getEnd()
+ && interval.getEnd() >= currentInterval.getStart();
}
return false;
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/tool/SegmentTreeImpl.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/tool/SegmentTreeImpl.java
new file mode 100644
index 00000000000..245d41cf9c7
--- /dev/null
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/tool/SegmentTreeImpl.java
@@ -0,0 +1,65 @@
+package org.apache.iotdb.db.storageengine.dataregion.compaction.tool;
+
+public class SegmentTreeImpl implements ITimeRange {
+
+ private IntervalNode root;
+
+ @Override
+ public void addInterval(Interval interval) {
+ root = insert(root, interval);
+ }
+
+ @Override
+ public boolean isOverlapped(Interval interval) {
+ return overlaps(root, interval);
+ }
+
+ private boolean overlaps(IntervalNode node, Interval interval) {
+ if (node == null) {
+ return false;
+ }
+
+ if (node.interval.getStart() <= interval.getEnd()
+ && interval.getStart() <= node.interval.getEnd()) {
+ return true;
+ }
+
+ if (node.left != null && node.left.maxEnd >= interval.getStart()) {
+ return overlaps(node.left, interval);
+ }
+
+ return overlaps(node.right, interval);
+ }
+
+ public void insert(Interval interval) {
+ root = insert(root, interval);
+ }
+
+ private IntervalNode insert(IntervalNode node, Interval interval) {
+ if (node == null) {
+ return new IntervalNode(interval);
+ }
+
+ long start = interval.getStart();
+ if (start < node.interval.getStart()) {
+ node.left = insert(node.left, interval);
+ } else {
+ node.right = insert(node.right, interval);
+ }
+
+ node.maxEnd = Math.max(node.maxEnd, interval.getEnd());
+ return node;
+ }
+
+ private class IntervalNode {
+ Interval interval;
+ long maxEnd;
+ IntervalNode left;
+ IntervalNode right;
+
+ public IntervalNode(Interval interval) {
+ this.interval = interval;
+ this.maxEnd = interval.getEnd();
+ }
+ }
+}
diff --git
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/tools/ListTimeRangeImplTest.java
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/tools/ListTimeRangeImplTest.java
index 62044ec39e0..c3caaa16d77 100644
---
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/tools/ListTimeRangeImplTest.java
+++
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/tools/ListTimeRangeImplTest.java
@@ -65,7 +65,7 @@ public class ListTimeRangeImplTest {
listTimeRange.addInterval(new Interval(15, 20));
listTimeRange.addInterval(new Interval(50, 60));
listTimeRange.addInterval(new Interval(5, 100));
- Assert.assertTrue(listTimeRange.isOverlapped(new Interval(1, 1)));
+ Assert.assertFalse(listTimeRange.isOverlapped(new Interval(1, 1)));
Assert.assertFalse(listTimeRange.isOverlapped(new Interval(101, 103)));
}
@@ -91,4 +91,48 @@ public class ListTimeRangeImplTest {
listTimeRange.addInterval(new Interval(51, 55));
Assert.assertEquals(51, listTimeRange.getIntervalList().get(1).getStart());
}
+
+ @Test
+ public void testNoOverlap() {
+ ListTimeRangeImpl listTimeRange = new ListTimeRangeImpl();
+ listTimeRange.addInterval(new Interval(3, 5));
+ Assert.assertFalse(listTimeRange.isOverlapped(new Interval(6, 10)));
+ Assert.assertFalse(listTimeRange.isOverlapped(new Interval(1, 2)));
+ }
+
+ @Test
+ public void testStartTimeOverlap() {
+ ListTimeRangeImpl listTimeRange = new ListTimeRangeImpl();
+ listTimeRange.addInterval(new Interval(1, 5));
+ Assert.assertTrue(listTimeRange.isOverlapped(new Interval(4, 8)));
+ }
+
+ @Test
+ public void testEndTimeOverlap() {
+ ListTimeRangeImpl listTimeRange = new ListTimeRangeImpl();
+ listTimeRange.addInterval(new Interval(1, 5));
+ Assert.assertTrue(listTimeRange.isOverlapped(new Interval(0, 4)));
+ }
+
+ @Test
+ public void testFullyOverlap() {
+ ListTimeRangeImpl listTimeRange = new ListTimeRangeImpl();
+ listTimeRange.addInterval(new Interval(2, 4));
+ Assert.assertTrue(listTimeRange.isOverlapped(new Interval(1, 5)));
+ }
+
+ @Test
+ public void testIntervalInsideCurrentInterval() {
+ ListTimeRangeImpl listTimeRange = new ListTimeRangeImpl();
+ listTimeRange.addInterval(new Interval(1, 5));
+ Assert.assertTrue(listTimeRange.isOverlapped(new Interval(2, 4)));
+ }
+
+ @Test
+ public void testBoundary() {
+ ListTimeRangeImpl listTimeRange = new ListTimeRangeImpl();
+ listTimeRange.addInterval(new Interval(3, 5));
+ Assert.assertTrue(listTimeRange.isOverlapped(new Interval(1, 3)));
+ Assert.assertTrue(listTimeRange.isOverlapped(new Interval(5, 6)));
+ }
}
diff --git
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/tools/SegmentTreeImplTest.java
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/tools/SegmentTreeImplTest.java
new file mode 100644
index 00000000000..2c40437e168
--- /dev/null
+++
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/tools/SegmentTreeImplTest.java
@@ -0,0 +1,19 @@
+package org.apache.iotdb.db.storageengine.dataregion.compaction.tools;
+
+import org.apache.iotdb.db.storageengine.dataregion.compaction.tool.Interval;
+import
org.apache.iotdb.db.storageengine.dataregion.compaction.tool.SegmentTreeImpl;
+
+import org.junit.Test;
+
+public class SegmentTreeImplTest {
+ @Test
+ public void test01() {
+ SegmentTreeImpl segmentTree = new SegmentTreeImpl();
+ segmentTree.insert(new Interval(15, 20));
+ segmentTree.insert(new Interval(10, 30));
+ segmentTree.insert(new Interval(17, 19));
+ segmentTree.insert(new Interval(5, 20));
+
+ System.out.println(segmentTree);
+ }
+}