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 <[email protected]> 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));
