This is an automated email from the ASF dual-hosted git repository.

rong pushed a commit to branch load--1-time-partition
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit ce6c12200aebbb8900882ac45842fda8ece761cc
Author: Steve Yurong Su <[email protected]>
AuthorDate: Tue Apr 9 15:01:09 2024 +0800

    Load: support load tsfile with data in partition whose id = -1
---
 .../db/exception/PartitionViolationException.java  |  6 +-
 .../tsfile/timeindex/DeviceTimeIndex.java          | 64 +++++++++++++---------
 .../dataregion/tsfile/timeindex/FileTimeIndex.java | 22 +++-----
 .../dataregion/tsfile/timeindex/ITimeIndex.java    |  2 -
 4 files changed, 51 insertions(+), 43 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/exception/PartitionViolationException.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/exception/PartitionViolationException.java
index 75d1f954e02..8b4c8dfb8ab 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/exception/PartitionViolationException.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/exception/PartitionViolationException.java
@@ -22,6 +22,10 @@ package org.apache.iotdb.db.exception;
 public class PartitionViolationException extends LoadFileException {
 
   public PartitionViolationException(String file) {
-    super(String.format("The data of file %s cross partitions", file));
+    super(String.format("The data of file %s crosses partitions", file));
+  }
+
+  public PartitionViolationException() {
+    super("The data of file crosses partitions");
   }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/timeindex/DeviceTimeIndex.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/timeindex/DeviceTimeIndex.java
index 024d4154f1e..777d092fee3 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/timeindex/DeviceTimeIndex.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/timeindex/DeviceTimeIndex.java
@@ -261,40 +261,52 @@ public class DeviceTimeIndex implements ITimeIndex {
     }
   }
 
-  /** @return the time partition id, if spans multi time partitions, return 
-1. */
-  private long getTimePartitionWithCheck() {
-    long partitionId = SPANS_MULTI_TIME_PARTITIONS_FLAG_ID;
-    for (int index : deviceToIndex.values()) {
-      long p = TimePartitionUtils.getTimePartitionId(startTimes[index]);
-      if (partitionId == SPANS_MULTI_TIME_PARTITIONS_FLAG_ID) {
-        partitionId = p;
-      } else {
-        if (partitionId != p) {
-          return SPANS_MULTI_TIME_PARTITIONS_FLAG_ID;
-        }
-      }
-
-      p = TimePartitionUtils.getTimePartitionId(endTimes[index]);
-      if (partitionId != p) {
-        return SPANS_MULTI_TIME_PARTITIONS_FLAG_ID;
-      }
-    }
-    return partitionId;
-  }
-
   @Override
   public long getTimePartitionWithCheck(String tsFilePath) throws 
PartitionViolationException {
-    long partitionId = getTimePartitionWithCheck();
-    if (partitionId == SPANS_MULTI_TIME_PARTITIONS_FLAG_ID) {
+    try {
+      return getTimePartitionWithCheck();
+    } catch (PartitionViolationException e) {
       throw new PartitionViolationException(tsFilePath);
     }
-    return partitionId;
   }
 
   @Override
   public boolean isSpanMultiTimePartitions() {
-    long partitionId = getTimePartitionWithCheck();
-    return partitionId == SPANS_MULTI_TIME_PARTITIONS_FLAG_ID;
+    try {
+      getTimePartitionWithCheck();
+      return false;
+    } catch (PartitionViolationException e) {
+      return true;
+    }
+  }
+
+  private long getTimePartitionWithCheck() throws PartitionViolationException {
+    Long partitionId = null;
+
+    for (final int index : deviceToIndex.values()) {
+      final long startTimePartitionId = 
TimePartitionUtils.getTimePartitionId(startTimes[index]);
+      final long endTimePartitionId = 
TimePartitionUtils.getTimePartitionId(endTimes[index]);
+
+      if (startTimePartitionId != endTimePartitionId) {
+        throw new PartitionViolationException();
+      }
+
+      if (partitionId == null) {
+        partitionId = startTimePartitionId;
+        continue;
+      }
+
+      if (partitionId != startTimePartitionId) {
+        throw new PartitionViolationException();
+      }
+    }
+
+    // Just in case
+    if (partitionId == null) {
+      throw new PartitionViolationException();
+    }
+
+    return partitionId;
   }
 
   @Override
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/timeindex/FileTimeIndex.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/timeindex/FileTimeIndex.java
index d397dd384c2..65aa8153a2a 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/timeindex/FileTimeIndex.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/timeindex/FileTimeIndex.java
@@ -142,28 +142,22 @@ public class FileTimeIndex implements ITimeIndex {
     }
   }
 
-  private long getTimePartitionWithCheck() {
-    long startPartitionId = TimePartitionUtils.getTimePartitionId(startTime);
-    long endPartitionId = TimePartitionUtils.getTimePartitionId(endTime);
+  @Override
+  public long getTimePartitionWithCheck(String tsFilePath) throws 
PartitionViolationException {
+    final long startPartitionId = 
TimePartitionUtils.getTimePartitionId(startTime);
+    final long endPartitionId = TimePartitionUtils.getTimePartitionId(endTime);
+
     if (startPartitionId == endPartitionId) {
       return startPartitionId;
     }
-    return SPANS_MULTI_TIME_PARTITIONS_FLAG_ID;
-  }
 
-  @Override
-  public long getTimePartitionWithCheck(String tsFilePath) throws 
PartitionViolationException {
-    long partitionId = getTimePartitionWithCheck();
-    if (partitionId == SPANS_MULTI_TIME_PARTITIONS_FLAG_ID) {
-      throw new PartitionViolationException(tsFilePath);
-    }
-    return partitionId;
+    throw new PartitionViolationException(tsFilePath);
   }
 
   @Override
   public boolean isSpanMultiTimePartitions() {
-    long partitionId = getTimePartitionWithCheck();
-    return partitionId == SPANS_MULTI_TIME_PARTITIONS_FLAG_ID;
+    return TimePartitionUtils.getTimePartitionId(startTime)
+        != TimePartitionUtils.getTimePartitionId(endTime);
   }
 
   @Override
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/timeindex/ITimeIndex.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/timeindex/ITimeIndex.java
index 84169b1087b..0edbe81745d 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/timeindex/ITimeIndex.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/timeindex/ITimeIndex.java
@@ -37,8 +37,6 @@ public interface ITimeIndex {
   byte DEVICE_TIME_INDEX_TYPE = 1;
   byte FILE_TIME_INDEX_TYPE = 2;
 
-  int SPANS_MULTI_TIME_PARTITIONS_FLAG_ID = -1;
-
   /**
    * serialize to outputStream
    *

Reply via email to