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

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


The following commit(s) were added to refs/heads/master by this push:
     new d7cf590774 [IOTDB-3384] fix run length tsblock serde (#6270)
d7cf590774 is described below

commit d7cf5907744dd2ccde99299bd25c657fc973fd1b
Author: Zhong Wang <[email protected]>
AuthorDate: Tue Jun 14 15:59:00 2022 +0800

    [IOTDB-3384] fix run length tsblock serde (#6270)
---
 .../block/column/BinaryArrayColumnEncoder.java     |  5 +-
 .../block/column/ByteArrayColumnEncoder.java       |  5 +-
 .../read/common/block/column/ColumnEncoder.java    |  9 ++-
 .../common/block/column/ColumnEncoderFactory.java  |  3 +-
 .../read/common/block/column/ColumnEncoding.java   |  6 +-
 .../block/column/Int32ArrayColumnEncoder.java      |  8 ++-
 .../block/column/Int64ArrayColumnEncoder.java      | 21 +++++-
 .../block/column/RunLengthColumnEncoder.java       | 54 ++++++++++++++++
 .../block/column/RunLengthEncodedColumn.java       |  2 +-
 .../read/common/block/column/TsBlockSerde.java     | 19 +++---
 .../common/block/BinaryArrayColumnEncoderTest.java |  8 +--
 .../common/block/ByteArrayColumnEncoderTest.java   |  9 +--
 .../common/block/Int32ArrayColumnEncoderTest.java  | 15 ++---
 .../common/block/Int64ArrayColumnEncoderTest.java  | 17 ++---
 ...erTest.java => RunLengthColumnEncoderTest.java} | 75 ++++++++++++++--------
 15 files changed, 181 insertions(+), 75 deletions(-)

diff --git 
a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/BinaryArrayColumnEncoder.java
 
b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/BinaryArrayColumnEncoder.java
index 9feeaa0197..715bfe7786 100644
--- 
a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/BinaryArrayColumnEncoder.java
+++ 
b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/BinaryArrayColumnEncoder.java
@@ -29,7 +29,7 @@ import java.nio.ByteBuffer;
 public class BinaryArrayColumnEncoder implements ColumnEncoder {
 
   @Override
-  public void readColumn(ColumnBuilder columnBuilder, ByteBuffer input, int 
positionCount) {
+  public Column readColumn(ByteBuffer input, TSDataType dataType, int 
positionCount) {
     // Serialized data layout:
     //    +---------------+-----------------+-------------+
     //    | may have null | null indicators |   values    |
@@ -46,8 +46,8 @@ public class BinaryArrayColumnEncoder implements 
ColumnEncoder {
 
     boolean[] nullIndicators = ColumnEncoder.deserializeNullIndicators(input, 
positionCount);
 
-    TSDataType dataType = columnBuilder.getDataType();
     if (TSDataType.TEXT.equals(dataType)) {
+      ColumnBuilder columnBuilder = new BinaryColumnBuilder(null, 
positionCount);
       for (int i = 0; i < positionCount; i++) {
         if (nullIndicators == null || !nullIndicators[i]) {
           int length = input.getInt();
@@ -58,6 +58,7 @@ public class BinaryArrayColumnEncoder implements 
ColumnEncoder {
           columnBuilder.appendNull();
         }
       }
+      return columnBuilder.build();
     } else {
       throw new IllegalArgumentException("Invalid data type: " + dataType);
     }
diff --git 
a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/ByteArrayColumnEncoder.java
 
b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/ByteArrayColumnEncoder.java
index 75bf1df701..f4fac3a1f0 100644
--- 
a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/ByteArrayColumnEncoder.java
+++ 
b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/ByteArrayColumnEncoder.java
@@ -28,7 +28,7 @@ import java.nio.ByteBuffer;
 public class ByteArrayColumnEncoder implements ColumnEncoder {
 
   @Override
-  public void readColumn(ColumnBuilder columnBuilder, ByteBuffer input, int 
positionCount) {
+  public Column readColumn(ByteBuffer input, TSDataType dataType, int 
positionCount) {
 
     // Serialized data layout:
     //    +---------------+-----------------+-------------+
@@ -38,8 +38,8 @@ public class ByteArrayColumnEncoder implements ColumnEncoder {
     //    +---------------+-----------------+-------------+
 
     boolean[] nullIndicators = ColumnEncoder.deserializeNullIndicators(input, 
positionCount);
-    TSDataType dataType = columnBuilder.getDataType();
     if (TSDataType.BOOLEAN.equals(dataType)) {
+      BooleanColumnBuilder columnBuilder = new BooleanColumnBuilder(null, 
positionCount);
       boolean[] values = ColumnEncoder.deserializeBooleanArray(input, 
positionCount);
       for (int i = 0; i < positionCount; i++) {
         if (nullIndicators == null || !nullIndicators[i]) {
@@ -48,6 +48,7 @@ public class ByteArrayColumnEncoder implements ColumnEncoder {
           columnBuilder.appendNull();
         }
       }
+      return columnBuilder.build();
     } else {
       throw new IllegalArgumentException("Invalid data type: " + dataType);
     }
diff --git 
a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/ColumnEncoder.java
 
b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/ColumnEncoder.java
index e24639549c..7bf79c11e6 100644
--- 
a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/ColumnEncoder.java
+++ 
b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/ColumnEncoder.java
@@ -19,14 +19,21 @@
 
 package org.apache.iotdb.tsfile.read.common.block.column;
 
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+
 import java.io.DataOutputStream;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 
 public interface ColumnEncoder {
 
+  /** Read a time column from the specified input. */
+  default TimeColumn readTimeColumn(ByteBuffer input, int positionCount) {
+    throw new UnsupportedOperationException();
+  }
+
   /** Read a column from the specified input. */
-  void readColumn(ColumnBuilder columnBuilder, ByteBuffer input, int 
positionCount);
+  Column readColumn(ByteBuffer input, TSDataType dataType, int positionCount);
 
   /** Write the specified column to the specified output */
   void writeColumn(DataOutputStream output, Column column) throws IOException;
diff --git 
a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/ColumnEncoderFactory.java
 
b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/ColumnEncoderFactory.java
index 4c08a17686..18c93afeea 100644
--- 
a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/ColumnEncoderFactory.java
+++ 
b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/ColumnEncoderFactory.java
@@ -24,13 +24,14 @@ import java.util.Map;
 
 public class ColumnEncoderFactory {
 
-  private static Map<ColumnEncoding, ColumnEncoder> encodingToEncoder = new 
HashMap<>();
+  private static final Map<ColumnEncoding, ColumnEncoder> encodingToEncoder = 
new HashMap<>();
 
   static {
     encodingToEncoder.put(ColumnEncoding.INT32_ARRAY, new 
Int32ArrayColumnEncoder());
     encodingToEncoder.put(ColumnEncoding.INT64_ARRAY, new 
Int64ArrayColumnEncoder());
     encodingToEncoder.put(ColumnEncoding.BYTE_ARRAY, new 
ByteArrayColumnEncoder());
     encodingToEncoder.put(ColumnEncoding.BINARY_ARRAY, new 
BinaryArrayColumnEncoder());
+    encodingToEncoder.put(ColumnEncoding.RLE, new RunLengthColumnEncoder());
   }
 
   public static ColumnEncoder get(ColumnEncoding columnEncoding) {
diff --git 
a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/ColumnEncoding.java
 
b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/ColumnEncoding.java
index 0c7f2a70b8..f8008ae288 100644
--- 
a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/ColumnEncoding.java
+++ 
b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/ColumnEncoding.java
@@ -31,7 +31,9 @@ public enum ColumnEncoding {
   /** INT64, DOUBLE. */
   INT64_ARRAY((byte) 2),
   /** TEXT. */
-  BINARY_ARRAY((byte) 3);
+  BINARY_ARRAY((byte) 3),
+  /** All data types. */
+  RLE((byte) 4);
 
   private final byte value;
 
@@ -57,6 +59,8 @@ public enum ColumnEncoding {
         return INT64_ARRAY;
       case 3:
         return BINARY_ARRAY;
+      case 4:
+        return RLE;
       default:
         throw new IllegalArgumentException("Invalid value: " + value);
     }
diff --git 
a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/Int32ArrayColumnEncoder.java
 
b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/Int32ArrayColumnEncoder.java
index da95bd8cae..23339473fb 100644
--- 
a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/Int32ArrayColumnEncoder.java
+++ 
b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/Int32ArrayColumnEncoder.java
@@ -28,7 +28,7 @@ import java.nio.ByteBuffer;
 public class Int32ArrayColumnEncoder implements ColumnEncoder {
 
   @Override
-  public void readColumn(ColumnBuilder columnBuilder, ByteBuffer input, int 
positionCount) {
+  public Column readColumn(ByteBuffer input, TSDataType dataType, int 
positionCount) {
 
     // Serialized data layout:
     //    +---------------+-----------------+-------------+
@@ -39,8 +39,9 @@ public class Int32ArrayColumnEncoder implements ColumnEncoder 
{
 
     boolean[] nullIndicators = ColumnEncoder.deserializeNullIndicators(input, 
positionCount);
 
-    TSDataType dataType = columnBuilder.getDataType();
+    ColumnBuilder columnBuilder;
     if (TSDataType.INT32.equals(dataType)) {
+      columnBuilder = new IntColumnBuilder(null, positionCount);
       for (int i = 0; i < positionCount; i++) {
         if (nullIndicators == null || !nullIndicators[i]) {
           columnBuilder.writeInt(input.getInt());
@@ -49,6 +50,7 @@ public class Int32ArrayColumnEncoder implements ColumnEncoder 
{
         }
       }
     } else if (TSDataType.FLOAT.equals(dataType)) {
+      columnBuilder = new FloatColumnBuilder(null, positionCount);
       for (int i = 0; i < positionCount; i++) {
         if (nullIndicators == null || !nullIndicators[i]) {
           columnBuilder.writeFloat(Float.intBitsToFloat(input.getInt()));
@@ -59,6 +61,8 @@ public class Int32ArrayColumnEncoder implements ColumnEncoder 
{
     } else {
       throw new IllegalArgumentException("Invalid data type: " + dataType);
     }
+
+    return columnBuilder.build();
   }
 
   @Override
diff --git 
a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/Int64ArrayColumnEncoder.java
 
b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/Int64ArrayColumnEncoder.java
index a7f1154d4a..9264564185 100644
--- 
a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/Int64ArrayColumnEncoder.java
+++ 
b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/Int64ArrayColumnEncoder.java
@@ -28,7 +28,24 @@ import java.nio.ByteBuffer;
 public class Int64ArrayColumnEncoder implements ColumnEncoder {
 
   @Override
-  public void readColumn(ColumnBuilder columnBuilder, ByteBuffer input, int 
positionCount) {
+  public TimeColumn readTimeColumn(ByteBuffer input, int positionCount) {
+    return (TimeColumn)
+        readColumnInternal(new TimeColumnBuilder(null, positionCount), input, 
positionCount);
+  }
+
+  @Override
+  public Column readColumn(ByteBuffer input, TSDataType dataType, int 
positionCount) {
+    if (TSDataType.INT64.equals(dataType)) {
+      return readColumnInternal(new LongColumnBuilder(null, positionCount), 
input, positionCount);
+    } else if (TSDataType.DOUBLE.equals(dataType)) {
+      return readColumnInternal(new DoubleColumnBuilder(null, positionCount), 
input, positionCount);
+    } else {
+      throw new IllegalArgumentException("Invalid data type: " + dataType);
+    }
+  }
+
+  private Column readColumnInternal(
+      ColumnBuilder columnBuilder, ByteBuffer input, int positionCount) {
 
     // Serialized data layout:
     //    +---------------+-----------------+-------------+
@@ -38,7 +55,6 @@ public class Int64ArrayColumnEncoder implements ColumnEncoder 
{
     //    +---------------+-----------------+-------------+
 
     boolean[] nullIndicators = ColumnEncoder.deserializeNullIndicators(input, 
positionCount);
-
     TSDataType dataType = columnBuilder.getDataType();
     if (TSDataType.INT64.equals(dataType)) {
       for (int i = 0; i < positionCount; i++) {
@@ -59,6 +75,7 @@ public class Int64ArrayColumnEncoder implements ColumnEncoder 
{
     } else {
       throw new IllegalArgumentException("Invalid data type: " + dataType);
     }
+    return columnBuilder.build();
   }
 
   @Override
diff --git 
a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/RunLengthColumnEncoder.java
 
b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/RunLengthColumnEncoder.java
new file mode 100644
index 0000000000..9ee0665e31
--- /dev/null
+++ 
b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/RunLengthColumnEncoder.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.tsfile.read.common.block.column;
+
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+public class RunLengthColumnEncoder implements ColumnEncoder {
+
+  @Override
+  public Column readColumn(ByteBuffer input, TSDataType dataType, int 
positionCount) {
+    // Serialized data layout:
+    //    +-----------+-------------------------+
+    //    | encoding  | serialized inner column |
+    //    +-----------+-------------------------+
+    //    | byte      | list[byte]              |
+    //    +-----------+-------------------------+
+    ColumnEncoder columnEncoder = 
ColumnEncoderFactory.get(ColumnEncoding.deserializeFrom(input));
+    Column innerColumn = columnEncoder.readColumn(input, dataType, 1);
+    return new RunLengthEncodedColumn(innerColumn, positionCount);
+  }
+
+  @Override
+  public void writeColumn(DataOutputStream output, Column column) throws 
IOException {
+    Column innerColumn = ((RunLengthEncodedColumn) column).getValue();
+    if (innerColumn instanceof RunLengthEncodedColumn) {
+      throw new IOException("Unable to encode a nested RLE column.");
+    }
+
+    innerColumn.getEncoding().serializeTo(output);
+    ColumnEncoder columnEncoder = 
ColumnEncoderFactory.get(innerColumn.getEncoding());
+    columnEncoder.writeColumn(output, innerColumn);
+  }
+}
diff --git 
a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/RunLengthEncodedColumn.java
 
b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/RunLengthEncodedColumn.java
index b33995ee92..2dc69d43ec 100644
--- 
a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/RunLengthEncodedColumn.java
+++ 
b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/RunLengthEncodedColumn.java
@@ -69,7 +69,7 @@ public class RunLengthEncodedColumn implements Column {
 
   @Override
   public ColumnEncoding getEncoding() {
-    return value.getEncoding();
+    return ColumnEncoding.RLE;
   }
 
   @Override
diff --git 
a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/TsBlockSerde.java
 
b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/TsBlockSerde.java
index ca1b9f22c0..16eaf04003 100644
--- 
a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/TsBlockSerde.java
+++ 
b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/TsBlockSerde.java
@@ -21,7 +21,6 @@ package org.apache.iotdb.tsfile.read.common.block.column;
 
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.block.TsBlock;
-import org.apache.iotdb.tsfile.read.common.block.TsBlockBuilder;
 
 import java.io.ByteArrayOutputStream;
 import java.io.DataOutputStream;
@@ -59,9 +58,6 @@ public class TsBlockSerde {
     // Position count.
     int positionCount = byteBuffer.getInt();
 
-    TsBlockBuilder builder = new TsBlockBuilder(positionCount, 
valueColumnDataTypes);
-    builder.declarePositions(positionCount);
-
     // Column encodings.
     List<ColumnEncoding> columnEncodings = new ArrayList<>(valueColumnCount + 
1);
     for (int i = 0; i < valueColumnCount + 1; i++) {
@@ -69,18 +65,19 @@ public class TsBlockSerde {
     }
 
     // Time column.
-    TimeColumnBuilder timeColumnBuilder = builder.getTimeColumnBuilder();
-    ColumnEncoderFactory.get(columnEncodings.get(0))
-        .readColumn(timeColumnBuilder, byteBuffer, positionCount);
+    TimeColumn timeColumn =
+        
ColumnEncoderFactory.get(columnEncodings.get(0)).readTimeColumn(byteBuffer, 
positionCount);
 
+    // Value columns
+    Column[] valueColumns = new Column[valueColumnCount];
     for (int i = 0; i < valueColumnCount; i++) {
       // Value column.
-      ColumnBuilder columnBuilder = builder.getColumnBuilder(i);
-      ColumnEncoderFactory.get(columnEncodings.get(1 + i))
-          .readColumn(columnBuilder, byteBuffer, positionCount);
+      valueColumns[i] =
+          ColumnEncoderFactory.get(columnEncodings.get(1 + i))
+              .readColumn(byteBuffer, valueColumnDataTypes.get(i), 
positionCount);
     }
 
-    return builder.build();
+    return new TsBlock(positionCount, timeColumn, valueColumns);
   }
 
   /**
diff --git 
a/tsfile/src/test/java/org/apache/iotdb/tsfile/common/block/BinaryArrayColumnEncoderTest.java
 
b/tsfile/src/test/java/org/apache/iotdb/tsfile/common/block/BinaryArrayColumnEncoderTest.java
index 4a63caa9bf..c3d08d02e8 100644
--- 
a/tsfile/src/test/java/org/apache/iotdb/tsfile/common/block/BinaryArrayColumnEncoderTest.java
+++ 
b/tsfile/src/test/java/org/apache/iotdb/tsfile/common/block/BinaryArrayColumnEncoderTest.java
@@ -19,8 +19,8 @@
 
 package org.apache.iotdb.tsfile.common.block;
 
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.block.column.BinaryColumn;
-import org.apache.iotdb.tsfile.read.common.block.column.BinaryColumnBuilder;
 import org.apache.iotdb.tsfile.read.common.block.column.ColumnEncoder;
 import org.apache.iotdb.tsfile.read.common.block.column.ColumnEncoderFactory;
 import org.apache.iotdb.tsfile.read.common.block.column.ColumnEncoding;
@@ -55,6 +55,7 @@ public class BinaryArrayColumnEncoderTest {
       }
     }
     BinaryColumn input = new BinaryColumn(positionCount, 
Optional.of(nullIndicators), values);
+    long expectedRetainedSize = input.getRetainedSizeInBytes();
     ColumnEncoder encoder = 
ColumnEncoderFactory.get(ColumnEncoding.BINARY_ARRAY);
 
     ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
@@ -67,11 +68,10 @@ public class BinaryArrayColumnEncoderTest {
     }
 
     ByteBuffer buffer = ByteBuffer.wrap(byteArrayOutputStream.toByteArray());
-    BinaryColumnBuilder binaryColumnBuilder = new BinaryColumnBuilder(null, 
positionCount);
-    encoder.readColumn(binaryColumnBuilder, buffer, positionCount);
-    BinaryColumn output = (BinaryColumn) binaryColumnBuilder.build();
+    BinaryColumn output = (BinaryColumn) encoder.readColumn(buffer, 
TSDataType.TEXT, positionCount);
     Assert.assertEquals(positionCount, output.getPositionCount());
     Assert.assertTrue(output.mayHaveNull());
+    Assert.assertEquals(expectedRetainedSize, output.getRetainedSizeInBytes());
     for (int i = 0; i < positionCount; i++) {
       Assert.assertEquals(i % 2 == 0, output.isNull(i));
       if (i % 2 != 0) {
diff --git 
a/tsfile/src/test/java/org/apache/iotdb/tsfile/common/block/ByteArrayColumnEncoderTest.java
 
b/tsfile/src/test/java/org/apache/iotdb/tsfile/common/block/ByteArrayColumnEncoderTest.java
index b4457445a4..28bde621e7 100644
--- 
a/tsfile/src/test/java/org/apache/iotdb/tsfile/common/block/ByteArrayColumnEncoderTest.java
+++ 
b/tsfile/src/test/java/org/apache/iotdb/tsfile/common/block/ByteArrayColumnEncoderTest.java
@@ -19,8 +19,8 @@
 
 package org.apache.iotdb.tsfile.common.block;
 
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.block.column.BooleanColumn;
-import org.apache.iotdb.tsfile.read.common.block.column.BooleanColumnBuilder;
 import org.apache.iotdb.tsfile.read.common.block.column.ColumnEncoder;
 import org.apache.iotdb.tsfile.read.common.block.column.ColumnEncoderFactory;
 import org.apache.iotdb.tsfile.read.common.block.column.ColumnEncoding;
@@ -51,6 +51,7 @@ public class ByteArrayColumnEncoderTest {
       }
     }
     BooleanColumn input = new BooleanColumn(positionCount, 
Optional.of(nullIndicators), values);
+    long expectedRetainedSize = input.getRetainedSizeInBytes();
     ColumnEncoder encoder = 
ColumnEncoderFactory.get(ColumnEncoding.BYTE_ARRAY);
 
     ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
@@ -63,11 +64,11 @@ public class ByteArrayColumnEncoderTest {
     }
 
     ByteBuffer buffer = ByteBuffer.wrap(byteArrayOutputStream.toByteArray());
-    BooleanColumnBuilder booleanColumnBuilder = new BooleanColumnBuilder(null, 
positionCount);
-    encoder.readColumn(booleanColumnBuilder, buffer, positionCount);
-    BooleanColumn output = (BooleanColumn) booleanColumnBuilder.build();
+    BooleanColumn output =
+        (BooleanColumn) encoder.readColumn(buffer, TSDataType.BOOLEAN, 
positionCount);
     Assert.assertEquals(positionCount, output.getPositionCount());
     Assert.assertTrue(output.mayHaveNull());
+    Assert.assertEquals(expectedRetainedSize, output.getRetainedSizeInBytes());
     for (int i = 0; i < positionCount; i++) {
       Assert.assertEquals(i % 2 == 0, output.isNull(i));
       if (i % 2 != 0) {
diff --git 
a/tsfile/src/test/java/org/apache/iotdb/tsfile/common/block/Int32ArrayColumnEncoderTest.java
 
b/tsfile/src/test/java/org/apache/iotdb/tsfile/common/block/Int32ArrayColumnEncoderTest.java
index 3b3dca7fb9..09d9ab1977 100644
--- 
a/tsfile/src/test/java/org/apache/iotdb/tsfile/common/block/Int32ArrayColumnEncoderTest.java
+++ 
b/tsfile/src/test/java/org/apache/iotdb/tsfile/common/block/Int32ArrayColumnEncoderTest.java
@@ -19,13 +19,12 @@
 
 package org.apache.iotdb.tsfile.common.block;
 
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.block.column.ColumnEncoder;
 import org.apache.iotdb.tsfile.read.common.block.column.ColumnEncoderFactory;
 import org.apache.iotdb.tsfile.read.common.block.column.ColumnEncoding;
 import org.apache.iotdb.tsfile.read.common.block.column.FloatColumn;
-import org.apache.iotdb.tsfile.read.common.block.column.FloatColumnBuilder;
 import org.apache.iotdb.tsfile.read.common.block.column.IntColumn;
-import org.apache.iotdb.tsfile.read.common.block.column.IntColumnBuilder;
 
 import org.junit.Assert;
 import org.junit.Test;
@@ -53,6 +52,7 @@ public class Int32ArrayColumnEncoderTest {
       }
     }
     IntColumn input = new IntColumn(positionCount, 
Optional.of(nullIndicators), values);
+    long expectedRetainedSize = input.getRetainedSizeInBytes();
     ColumnEncoder encoder = 
ColumnEncoderFactory.get(ColumnEncoding.INT32_ARRAY);
 
     ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
@@ -65,11 +65,10 @@ public class Int32ArrayColumnEncoderTest {
     }
 
     ByteBuffer buffer = ByteBuffer.wrap(byteArrayOutputStream.toByteArray());
-    IntColumnBuilder intColumnBuilder = new IntColumnBuilder(null, 
positionCount);
-    encoder.readColumn(intColumnBuilder, buffer, positionCount);
-    IntColumn output = (IntColumn) intColumnBuilder.build();
+    IntColumn output = (IntColumn) encoder.readColumn(buffer, 
TSDataType.INT32, positionCount);
     Assert.assertEquals(positionCount, output.getPositionCount());
     Assert.assertTrue(output.mayHaveNull());
+    Assert.assertEquals(expectedRetainedSize, output.getRetainedSizeInBytes());
     for (int i = 0; i < positionCount; i++) {
       Assert.assertEquals(i % 2 == 0, output.isNull(i));
       if (i % 2 != 0) {
@@ -93,6 +92,7 @@ public class Int32ArrayColumnEncoderTest {
       }
     }
     FloatColumn input = new FloatColumn(positionCount, 
Optional.of(nullIndicators), values);
+    long expectedRetainedSize = input.getRetainedSizeInBytes();
     ColumnEncoder encoder = 
ColumnEncoderFactory.get(ColumnEncoding.INT32_ARRAY);
 
     ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
@@ -105,11 +105,10 @@ public class Int32ArrayColumnEncoderTest {
     }
 
     ByteBuffer buffer = ByteBuffer.wrap(byteArrayOutputStream.toByteArray());
-    FloatColumnBuilder floatColumnBuilder = new FloatColumnBuilder(null, 
positionCount);
-    encoder.readColumn(floatColumnBuilder, buffer, positionCount);
-    FloatColumn output = (FloatColumn) floatColumnBuilder.build();
+    FloatColumn output = (FloatColumn) encoder.readColumn(buffer, 
TSDataType.FLOAT, positionCount);
     Assert.assertEquals(positionCount, output.getPositionCount());
     Assert.assertTrue(output.mayHaveNull());
+    Assert.assertEquals(expectedRetainedSize, output.getRetainedSizeInBytes());
     for (int i = 0; i < positionCount; i++) {
       Assert.assertEquals(i % 2 == 0, output.isNull(i));
       if (i % 2 != 0) {
diff --git 
a/tsfile/src/test/java/org/apache/iotdb/tsfile/common/block/Int64ArrayColumnEncoderTest.java
 
b/tsfile/src/test/java/org/apache/iotdb/tsfile/common/block/Int64ArrayColumnEncoderTest.java
index 048801f1da..31e140535f 100644
--- 
a/tsfile/src/test/java/org/apache/iotdb/tsfile/common/block/Int64ArrayColumnEncoderTest.java
+++ 
b/tsfile/src/test/java/org/apache/iotdb/tsfile/common/block/Int64ArrayColumnEncoderTest.java
@@ -19,13 +19,12 @@
 
 package org.apache.iotdb.tsfile.common.block;
 
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.block.column.ColumnEncoder;
 import org.apache.iotdb.tsfile.read.common.block.column.ColumnEncoderFactory;
 import org.apache.iotdb.tsfile.read.common.block.column.ColumnEncoding;
 import org.apache.iotdb.tsfile.read.common.block.column.DoubleColumn;
-import org.apache.iotdb.tsfile.read.common.block.column.DoubleColumnBuilder;
 import org.apache.iotdb.tsfile.read.common.block.column.LongColumn;
-import org.apache.iotdb.tsfile.read.common.block.column.LongColumnBuilder;
 
 import org.junit.Assert;
 import org.junit.Test;
@@ -54,6 +53,7 @@ public class Int64ArrayColumnEncoderTest {
       }
     }
     LongColumn input = new LongColumn(positionCount, 
Optional.of(nullIndicators), values);
+    long expectedRetainedSize = input.getRetainedSizeInBytes();
     ColumnEncoder encoder = 
ColumnEncoderFactory.get(ColumnEncoding.INT64_ARRAY);
 
     ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
@@ -66,11 +66,10 @@ public class Int64ArrayColumnEncoderTest {
     }
 
     ByteBuffer buffer = ByteBuffer.wrap(byteArrayOutputStream.toByteArray());
-    LongColumnBuilder longColumnBuilder = new LongColumnBuilder(null, 
positionCount);
-    encoder.readColumn(longColumnBuilder, buffer, positionCount);
-    LongColumn output = (LongColumn) longColumnBuilder.build();
+    LongColumn output = (LongColumn) encoder.readColumn(buffer, 
TSDataType.INT64, positionCount);
     Assert.assertEquals(positionCount, output.getPositionCount());
     Assert.assertTrue(output.mayHaveNull());
+    Assert.assertEquals(expectedRetainedSize, output.getRetainedSizeInBytes());
     for (int i = 0; i < positionCount; i++) {
       Assert.assertEquals(i % 2 == 0, output.isNull(i));
       if (i % 2 != 0) {
@@ -94,6 +93,7 @@ public class Int64ArrayColumnEncoderTest {
       }
     }
     DoubleColumn input = new DoubleColumn(positionCount, 
Optional.of(nullIndicators), values);
+    long expectedRetainedSize = input.getRetainedSizeInBytes();
     ColumnEncoder encoder = 
ColumnEncoderFactory.get(ColumnEncoding.INT64_ARRAY);
 
     ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
@@ -106,11 +106,12 @@ public class Int64ArrayColumnEncoderTest {
     }
 
     ByteBuffer buffer = ByteBuffer.wrap(byteArrayOutputStream.toByteArray());
-    DoubleColumnBuilder doubleColumnBuilder = new DoubleColumnBuilder(null, 
positionCount);
-    encoder.readColumn(doubleColumnBuilder, buffer, positionCount);
-    DoubleColumn output = (DoubleColumn) doubleColumnBuilder.build();
+
+    DoubleColumn output =
+        (DoubleColumn) encoder.readColumn(buffer, TSDataType.DOUBLE, 
positionCount);
     Assert.assertEquals(positionCount, output.getPositionCount());
     Assert.assertTrue(output.mayHaveNull());
+    Assert.assertEquals(expectedRetainedSize, output.getRetainedSizeInBytes());
     for (int i = 0; i < positionCount; i++) {
       Assert.assertEquals(i % 2 == 0, output.isNull(i));
       if (i % 2 != 0) {
diff --git 
a/tsfile/src/test/java/org/apache/iotdb/tsfile/common/block/BinaryArrayColumnEncoderTest.java
 
b/tsfile/src/test/java/org/apache/iotdb/tsfile/common/block/RunLengthColumnEncoderTest.java
similarity index 53%
copy from 
tsfile/src/test/java/org/apache/iotdb/tsfile/common/block/BinaryArrayColumnEncoderTest.java
copy to 
tsfile/src/test/java/org/apache/iotdb/tsfile/common/block/RunLengthColumnEncoderTest.java
index 4a63caa9bf..07d926939d 100644
--- 
a/tsfile/src/test/java/org/apache/iotdb/tsfile/common/block/BinaryArrayColumnEncoderTest.java
+++ 
b/tsfile/src/test/java/org/apache/iotdb/tsfile/common/block/RunLengthColumnEncoderTest.java
@@ -20,10 +20,16 @@
 package org.apache.iotdb.tsfile.common.block;
 
 import org.apache.iotdb.tsfile.read.common.block.column.BinaryColumn;
-import org.apache.iotdb.tsfile.read.common.block.column.BinaryColumnBuilder;
+import org.apache.iotdb.tsfile.read.common.block.column.BooleanColumn;
+import org.apache.iotdb.tsfile.read.common.block.column.Column;
 import org.apache.iotdb.tsfile.read.common.block.column.ColumnEncoder;
 import org.apache.iotdb.tsfile.read.common.block.column.ColumnEncoderFactory;
 import org.apache.iotdb.tsfile.read.common.block.column.ColumnEncoding;
+import org.apache.iotdb.tsfile.read.common.block.column.DoubleColumn;
+import org.apache.iotdb.tsfile.read.common.block.column.FloatColumn;
+import org.apache.iotdb.tsfile.read.common.block.column.IntColumn;
+import org.apache.iotdb.tsfile.read.common.block.column.LongColumn;
+import org.apache.iotdb.tsfile.read.common.block.column.RunLengthEncodedColumn;
 import org.apache.iotdb.tsfile.utils.Binary;
 
 import org.junit.Assert;
@@ -34,28 +40,15 @@ import java.io.DataOutputStream;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.Optional;
-import java.util.Random;
 
-public class BinaryArrayColumnEncoderTest {
-  @Test
-  public void testBinaryColumn() {
-    final int positionCount = 10;
+public class RunLengthColumnEncoderTest {
 
-    Random random = new Random();
+  private void testInternal(Column column) {
+    final int positionCount = 10;
 
-    boolean[] nullIndicators = new boolean[positionCount];
-    Binary[] values = new Binary[positionCount];
-    for (int i = 0; i < positionCount; i++) {
-      nullIndicators[i] = i % 2 == 0;
-      if (i % 2 != 0) {
-        int length = random.nextInt(1024) + 1;
-        byte[] value = new byte[length];
-        random.nextBytes(value);
-        values[i] = new Binary(value);
-      }
-    }
-    BinaryColumn input = new BinaryColumn(positionCount, 
Optional.of(nullIndicators), values);
-    ColumnEncoder encoder = 
ColumnEncoderFactory.get(ColumnEncoding.BINARY_ARRAY);
+    Column input = new RunLengthEncodedColumn(column, positionCount);
+    long expectedRetainedSize = input.getRetainedSizeInBytes();
+    ColumnEncoder encoder = ColumnEncoderFactory.get(ColumnEncoding.RLE);
 
     ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
     DataOutputStream dos = new DataOutputStream(byteArrayOutputStream);
@@ -67,16 +60,42 @@ public class BinaryArrayColumnEncoderTest {
     }
 
     ByteBuffer buffer = ByteBuffer.wrap(byteArrayOutputStream.toByteArray());
-    BinaryColumnBuilder binaryColumnBuilder = new BinaryColumnBuilder(null, 
positionCount);
-    encoder.readColumn(binaryColumnBuilder, buffer, positionCount);
-    BinaryColumn output = (BinaryColumn) binaryColumnBuilder.build();
+    Column output = encoder.readColumn(buffer, input.getDataType(), 
positionCount);
     Assert.assertEquals(positionCount, output.getPositionCount());
-    Assert.assertTrue(output.mayHaveNull());
+    Assert.assertFalse(output.mayHaveNull());
+    Assert.assertEquals(expectedRetainedSize, output.getRetainedSizeInBytes());
     for (int i = 0; i < positionCount; i++) {
-      Assert.assertEquals(i % 2 == 0, output.isNull(i));
-      if (i % 2 != 0) {
-        Assert.assertEquals(values[i], output.getBinary(i));
-      }
+      Assert.assertEquals(column.getObject(0), output.getObject(i));
     }
   }
+
+  @Test
+  public void testBooleanColumn() {
+    testInternal(new BooleanColumn(1, Optional.empty(), new boolean[] {true}));
+  }
+
+  @Test
+  public void testIntColumn() {
+    testInternal(new IntColumn(1, Optional.empty(), new int[] {0}));
+  }
+
+  @Test
+  public void testLongColumn() {
+    testInternal(new LongColumn(1, Optional.empty(), new long[] {0L}));
+  }
+
+  @Test
+  public void testFloatColumn() {
+    testInternal(new FloatColumn(1, Optional.empty(), new float[] {0.0F}));
+  }
+
+  @Test
+  public void testDoubleColumn() {
+    testInternal(new DoubleColumn(1, Optional.empty(), new double[] {0.0D}));
+  }
+
+  @Test
+  public void testTextColumn() {
+    testInternal(new BinaryColumn(1, Optional.empty(), new Binary[] {new 
Binary("foo")}));
+  }
 }

Reply via email to