You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ha...@apache.org on 2023/09/04 09:46:13 UTC

[iotdb] branch negative_timestamp created (now 542d1fb6a45)

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

haonan pushed a change to branch negative_timestamp
in repository https://gitbox.apache.org/repos/asf/iotdb.git


      at 542d1fb6a45 Support negative timestamp on CLI and fix time partition bug

This branch includes the following new commits:

     new 542d1fb6a45 Support negative timestamp on CLI and fix time partition bug

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[iotdb] 01/01: Support negative timestamp on CLI and fix time partition bug

Posted by ha...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

haonan pushed a commit to branch negative_timestamp
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 542d1fb6a450a402a0415cbbe596a67f800921f6
Author: HTHou <hh...@outlook.com>
AuthorDate: Mon Sep 4 17:45:39 2023 +0800

    Support negative timestamp on CLI and fix time partition bug
---
 .../main/java/org/apache/iotdb/rpc/RpcUtils.java   | 29 +++++++++++++++++-----
 .../planner/plan/node/write/InsertTabletNode.java  | 28 +++++++++++++++------
 .../iotdb/db/storageengine/StorageEngine.java      |  4 ++-
 .../apache/iotdb/db/utils/TimePartitionUtils.java  |  6 ++++-
 4 files changed, 51 insertions(+), 16 deletions(-)

diff --git a/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/RpcUtils.java b/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/RpcUtils.java
index fbe805bd07f..7df45b5b821 100644
--- a/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/RpcUtils.java
+++ b/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/RpcUtils.java
@@ -247,9 +247,16 @@ public class RpcUtils {
   @SuppressWarnings("squid:S3776") // Suppress high Cognitive Complexity warning
   public static String parseLongToDateWithPrecision(
       DateTimeFormatter formatter, long timestamp, ZoneId zoneid, String timestampPrecision) {
+    long integerOfDate;
+    StringBuilder digits;
     if ("ms".equals(timestampPrecision)) {
-      long integerOfDate = timestamp / 1000;
-      StringBuilder digits = new StringBuilder(Long.toString(timestamp % 1000));
+      if (timestamp > 0 || timestamp % 1000 == 0) {
+        integerOfDate = timestamp / 1000;
+        digits = new StringBuilder(Long.toString(timestamp % 1000));
+      } else {
+        integerOfDate = timestamp / 1000 - 1;
+        digits = new StringBuilder(Long.toString(1000 + timestamp % 1000));
+      }
       ZonedDateTime dateTime =
           ZonedDateTime.ofInstant(Instant.ofEpochSecond(integerOfDate), zoneid);
       String datetime = dateTime.format(formatter);
@@ -261,8 +268,13 @@ public class RpcUtils {
       }
       return formatDatetimeStr(datetime, digits);
     } else if ("us".equals(timestampPrecision)) {
-      long integerOfDate = timestamp / 1000_000;
-      StringBuilder digits = new StringBuilder(Long.toString(timestamp % 1000_000));
+      if (timestamp > 0 || timestamp % 1000_000 == 0) {
+        integerOfDate = timestamp / 1000_000;
+        digits = new StringBuilder(Long.toString(timestamp % 1000_000));
+      } else {
+        integerOfDate = timestamp / 1000_000 - 1;
+        digits = new StringBuilder(Long.toString(1000_000 + timestamp % 1000_000));
+      }
       ZonedDateTime dateTime =
           ZonedDateTime.ofInstant(Instant.ofEpochSecond(integerOfDate), zoneid);
       String datetime = dateTime.format(formatter);
@@ -274,8 +286,13 @@ public class RpcUtils {
       }
       return formatDatetimeStr(datetime, digits);
     } else {
-      long integerOfDate = timestamp / 1000_000_000L;
-      StringBuilder digits = new StringBuilder(Long.toString(timestamp % 1000_000_000L));
+      if (timestamp > 0 || timestamp % 1000_000_000L == 0) {
+        integerOfDate = timestamp / 1000_000_000L;
+        digits = new StringBuilder(Long.toString(timestamp % 1000_000_000L));
+      } else {
+        integerOfDate = timestamp / 1000_000_000L - 1;
+        digits = new StringBuilder(Long.toString(1000_000_000L + timestamp % 1000_000_000L));
+      }
       ZonedDateTime dateTime =
           ZonedDateTime.ofInstant(Instant.ofEpochSecond(integerOfDate), zoneid);
       String datetime = dateTime.format(formatter);
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertTabletNode.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertTabletNode.java
index c19b4f037d0..034267eb85e 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertTabletNode.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertTabletNode.java
@@ -190,10 +190,16 @@ public class InsertTabletNode extends InsertNode implements WALEntryValue {
     if (times.length == 0) {
       return Collections.emptyList();
     }
-    long startTime =
-        (times[0] / TimePartitionUtils.timePartitionInterval)
-            * TimePartitionUtils.timePartitionInterval; // included
-    long endTime = startTime + TimePartitionUtils.timePartitionInterval; // excluded
+    long endTime;
+    if (times[0] > 0 || times[0] % TimePartitionUtils.timePartitionInterval == 0) {
+      endTime =
+          (times[0] / TimePartitionUtils.timePartitionInterval + 1)
+              * TimePartitionUtils.timePartitionInterval; // excluded
+    } else {
+      endTime =
+          (times[0] / TimePartitionUtils.timePartitionInterval)
+              * TimePartitionUtils.timePartitionInterval; // excluded
+    }
     TTimePartitionSlot timePartitionSlot = TimePartitionUtils.getTimePartition(times[0]);
     int startLoc = 0; // included
 
@@ -208,10 +214,16 @@ public class InsertTabletNode extends InsertNode implements WALEntryValue {
         timePartitionSlots.add(timePartitionSlot);
         // next init
         startLoc = i;
-        startTime = endTime;
-        endTime =
-            (times[i] / TimePartitionUtils.timePartitionInterval + 1)
-                * TimePartitionUtils.timePartitionInterval;
+        if (times[0] > 0 || times[0] % TimePartitionUtils.timePartitionInterval == 0) {
+          endTime =
+              (times[i] / TimePartitionUtils.timePartitionInterval + 1)
+                  * TimePartitionUtils.timePartitionInterval;
+        } else {
+          endTime =
+              (times[i] / TimePartitionUtils.timePartitionInterval)
+                  * TimePartitionUtils.timePartitionInterval;
+        }
+
         timePartitionSlot = TimePartitionUtils.getTimePartition(times[i]);
       }
     }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/StorageEngine.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/StorageEngine.java
index d1b8cd8c1ff..1cbdf6e7397 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/StorageEngine.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/StorageEngine.java
@@ -163,7 +163,9 @@ public class StorageEngine implements IService {
     if (timePartitionInterval == -1) {
       initTimePartition();
     }
-    return time / timePartitionInterval;
+    return time > 0 || time % timePartitionInterval == 0
+        ? time / timePartitionInterval
+        : time / timePartitionInterval - 1;
   }
 
   /** block insertion if the insertion is rejected by memory control */
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/TimePartitionUtils.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/TimePartitionUtils.java
index 3b5e0f8177e..608bac34e7f 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/TimePartitionUtils.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/TimePartitionUtils.java
@@ -28,7 +28,11 @@ public class TimePartitionUtils {
 
   public static TTimePartitionSlot getTimePartition(long time) {
     TTimePartitionSlot timePartitionSlot = new TTimePartitionSlot();
-    timePartitionSlot.setStartTime(time - time % timePartitionInterval);
+    if (time > 0 || time % timePartitionInterval == 0) {
+      timePartitionSlot.setStartTime(time / timePartitionInterval * timePartitionInterval);
+    } else {
+      timePartitionSlot.setStartTime((time / timePartitionInterval - 1) * timePartitionInterval);
+    }
     return timePartitionSlot;
   }