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 2022/05/02 09:36:53 UTC

[iotdb] 03/03: roundWithGivenPrecision

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

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

commit e66a4d5c731b5e66c877023feb3b3ed57cf52d43
Author: HTHou <hh...@outlook.com>
AuthorDate: Mon May 2 17:36:21 2022 +0800

    roundWithGivenPrecision
---
 .../apache/iotdb/db/utils/datastructure/DoubleTVList.java    | 12 ++++++++++++
 .../org/apache/iotdb/db/utils/datastructure/FloatTVList.java | 12 ++++++++++++
 2 files changed, 24 insertions(+)

diff --git a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/DoubleTVList.java b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/DoubleTVList.java
index 517bd5a574..9abb886a70 100644
--- a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/DoubleTVList.java
+++ b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/DoubleTVList.java
@@ -213,14 +213,26 @@ public class DoubleTVList extends TVList {
     ColumnBuilder valueBuilder = builder.getColumnBuilder(0);
     for (int i = 0; i < timestamps.size() - 1; i++) {
       timeBuilder.writeLongs(timestamps.get(i), ARRAY_SIZE);
+      getValuesWithGivenPrecision(values.get(i), floatPrecision, encoding);
       valueBuilder.writeDoubles(values.get(i), ARRAY_SIZE);
     }
     timeBuilder.writeLongs(timestamps.get(timestamps.size() - 1), size % ARRAY_SIZE == 0 ? ARRAY_SIZE : size % ARRAY_SIZE);
+    getValuesWithGivenPrecision(values.get(values.size() - 1), floatPrecision, encoding);
     valueBuilder.writeDoubles(values.get(values.size() - 1), size % ARRAY_SIZE == 0 ? ARRAY_SIZE : size % ARRAY_SIZE);
     builder.declarePositions(size);
     return builder.build();
   }
 
+  private void getValuesWithGivenPrecision(double[] values, int floatPrecision, TSEncoding encoding) {
+    if (encoding == TSEncoding.RLE || encoding == TSEncoding.TS_2DIFF) {
+      for (int i = 0; i < values.length; i++) {
+        if (!Double.isNaN(values[i])) {
+          values[i] = MathUtils.roundWithGivenPrecision(values[i], floatPrecision);
+        }
+      }
+    }
+  }
+
   @Override
   protected void releaseLastValueArray() {
     PrimitiveArrayManager.release(values.remove(values.size() - 1));
diff --git a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/FloatTVList.java b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/FloatTVList.java
index df5eaa4029..31eb193699 100644
--- a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/FloatTVList.java
+++ b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/FloatTVList.java
@@ -213,14 +213,26 @@ public class FloatTVList extends TVList {
     ColumnBuilder valueBuilder = builder.getColumnBuilder(0);
     for (int i = 0; i < timestamps.size() - 1; i++) {
       timeBuilder.writeLongs(timestamps.get(i), ARRAY_SIZE);
+      getValuesWithGivenPrecision(values.get(i), floatPrecision, encoding);
       valueBuilder.writeFloats(values.get(i), ARRAY_SIZE);
     }
     timeBuilder.writeLongs(timestamps.get(timestamps.size() - 1), size % ARRAY_SIZE == 0 ? ARRAY_SIZE : size % ARRAY_SIZE);
+    getValuesWithGivenPrecision(values.get(values.size() - 1), floatPrecision, encoding);
     valueBuilder.writeFloats(values.get(values.size() - 1), size % ARRAY_SIZE == 0 ? ARRAY_SIZE : size % ARRAY_SIZE);
     builder.declarePositions(size);
     return builder.build();
   }
 
+  private void getValuesWithGivenPrecision(float[] values, int floatPrecision, TSEncoding encoding) {
+    if (encoding == TSEncoding.RLE || encoding == TSEncoding.TS_2DIFF) {
+      for (int i = 0; i < values.length; i++) {
+        if (!Float.isNaN(values[i])) {
+          values[i] = MathUtils.roundWithGivenPrecision(values[i], floatPrecision);
+        }
+      }
+    }
+  }
+
   @Override
   protected void releaseLastValueArray() {
     PrimitiveArrayManager.release(values.remove(values.size() - 1));