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

rong 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 562048d4800 [IOTDB-5966] Pipe: Revision of Tablet serialize and 
deserialize (#10045)
562048d4800 is described below

commit 562048d48001a33304e54547c59fd7769abb5342
Author: yschengzi <[email protected]>
AuthorDate: Sun Jun 4 02:24:24 2023 +0800

    [IOTDB-5966] Pipe: Revision of Tablet serialize and deserialize (#10045)
    
    Co-authored-by: Steve Yurong Su <[email protected]>
---
 .../apache/iotdb/tsfile/write/record/Tablet.java   | 422 +++++++++++++--------
 .../iotdb/tsfile/write/record/TabletTest.java      |  38 ++
 2 files changed, 307 insertions(+), 153 deletions(-)

diff --git 
a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/record/Tablet.java 
b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/record/Tablet.java
index ce70aecb1da..ea1cd5846ca 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/record/Tablet.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/record/Tablet.java
@@ -31,7 +31,6 @@ import java.io.DataOutputStream;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -349,10 +348,11 @@ public class Tablet {
 
   /** serialize Tablet */
   public ByteBuffer serialize() throws IOException {
-    PublicBAOS byteArrayOutputStream = new PublicBAOS();
-    DataOutputStream outputStream = new 
DataOutputStream(byteArrayOutputStream);
-    serialize(outputStream);
-    return ByteBuffer.wrap(byteArrayOutputStream.getBuf(), 0, 
byteArrayOutputStream.size());
+    try (PublicBAOS byteArrayOutputStream = new PublicBAOS();
+        DataOutputStream outputStream = new 
DataOutputStream(byteArrayOutputStream)) {
+      serialize(outputStream);
+      return ByteBuffer.wrap(byteArrayOutputStream.getBuf(), 0, 
byteArrayOutputStream.size());
+    }
   }
 
   public void serialize(DataOutputStream stream) throws IOException {
@@ -366,35 +366,41 @@ public class Tablet {
 
   /** Serialize measurement schemas */
   private void writeMeasurementSchemas(DataOutputStream stream) throws 
IOException {
-    ReadWriteIOUtils.write(schemas.size(), stream);
-    for (MeasurementSchema schema : schemas) {
-      if (schema == null) {
-        ReadWriteIOUtils.write(BytesUtils.boolToByte(false), stream);
-      } else {
-        ReadWriteIOUtils.write(BytesUtils.boolToByte(true), stream);
-        schema.serializeTo(stream);
+    ReadWriteIOUtils.write(BytesUtils.boolToByte(schemas != null), stream);
+    if (schemas != null) {
+      ReadWriteIOUtils.write(schemas.size(), stream);
+      for (MeasurementSchema schema : schemas) {
+        if (schema == null) {
+          ReadWriteIOUtils.write(BytesUtils.boolToByte(false), stream);
+        } else {
+          ReadWriteIOUtils.write(BytesUtils.boolToByte(true), stream);
+          schema.serializeTo(stream);
+        }
       }
     }
   }
 
   private void writeTimes(DataOutputStream stream) throws IOException {
-    ReadWriteIOUtils.write(timestamps.length, stream);
-    for (long time : timestamps) {
-      ReadWriteIOUtils.write(time, stream);
+    ReadWriteIOUtils.write(BytesUtils.boolToByte(timestamps != null), stream);
+    if (timestamps != null) {
+      for (int i = 0; i < rowSize; i++) {
+        ReadWriteIOUtils.write(timestamps[i], stream);
+      }
     }
   }
 
   /** Serialize bitmaps */
   private void writeBitMaps(DataOutputStream stream) throws IOException {
-    ReadWriteIOUtils.write(bitMaps != null ? 1 : 0, stream);
+    ReadWriteIOUtils.write(BytesUtils.boolToByte(bitMaps != null), stream);
     if (bitMaps != null) {
-      for (BitMap bitMap : bitMaps) {
-        if (bitMap == null) {
-          ReadWriteIOUtils.write(0, stream);
+      int size = (schemas == null ? 0 : schemas.size());
+      for (int i = 0; i < size; i++) {
+        if (bitMaps[i] == null) {
+          ReadWriteIOUtils.write(BytesUtils.boolToByte(false), stream);
         } else {
-          ReadWriteIOUtils.write(1, stream);
-          ReadWriteIOUtils.write(bitMap.getSize(), stream);
-          ReadWriteIOUtils.write(new Binary(bitMap.getByteArray()), stream);
+          ReadWriteIOUtils.write(BytesUtils.boolToByte(true), stream);
+          ReadWriteIOUtils.write(bitMaps[i].getSize(), stream);
+          ReadWriteIOUtils.write(new Binary(bitMaps[i].getByteArray()), 
stream);
         }
       }
     }
@@ -402,63 +408,64 @@ public class Tablet {
 
   /** Serialize values */
   private void writeValues(DataOutputStream stream) throws IOException {
-    for (int i = 0; i < values.length; i++) {
-      serializeColumn(schemas.get(i).getType(), values[i], stream);
+    ReadWriteIOUtils.write(BytesUtils.boolToByte(values != null), stream);
+    if (values != null) {
+      int size = (schemas == null ? 0 : schemas.size());
+      for (int i = 0; i < size; i++) {
+        serializeColumn(schemas.get(i).getType(), values[i], stream);
+      }
     }
   }
 
   private void serializeColumn(TSDataType dataType, Object column, 
DataOutputStream stream)
       throws IOException {
-    switch (dataType) {
-      case INT32:
-        int[] intValues = (int[]) column;
-        ReadWriteIOUtils.write(intValues.length, stream);
-        for (int j = 0; j < intValues.length; j++) {
-          ReadWriteIOUtils.write(intValues[j], stream);
-        }
-        break;
-      case INT64:
-        long[] longValues = (long[]) column;
-        ReadWriteIOUtils.write(longValues.length, stream);
-        for (int j = 0; j < longValues.length; j++) {
-          ReadWriteIOUtils.write(longValues[j], stream);
-        }
-        break;
-      case FLOAT:
-        float[] floatValues = (float[]) column;
-        ReadWriteIOUtils.write(floatValues.length, stream);
-        for (int j = 0; j < floatValues.length; j++) {
-          ReadWriteIOUtils.write(floatValues[j], stream);
-        }
-        break;
-      case DOUBLE:
-        double[] doubleValues = (double[]) column;
-        ReadWriteIOUtils.write(doubleValues.length, stream);
-        for (int j = 0; j < doubleValues.length; j++) {
-          ReadWriteIOUtils.write(doubleValues[j], stream);
-        }
-        break;
-      case BOOLEAN:
-        boolean[] boolValues = (boolean[]) column;
-        ReadWriteIOUtils.write(boolValues.length, stream);
-        for (int j = 0; j < boolValues.length; j++) {
-          ReadWriteIOUtils.write(boolValues[j] ? 1 : 0, stream);
-        }
-        break;
-      case TEXT:
-        Binary[] binaryValues = (Binary[]) column;
-        ReadWriteIOUtils.write(binaryValues.length, stream);
-        for (int j = 0; j < binaryValues.length; j++) {
-          boolean isNull = (binaryValues[j] == null);
-          ReadWriteIOUtils.write(isNull ? 1 : 0, stream);
-          if (!isNull) {
-            ReadWriteIOUtils.write(binaryValues[j], stream);
+    ReadWriteIOUtils.write(BytesUtils.boolToByte(column != null), stream);
+
+    if (column != null) {
+      switch (dataType) {
+        case INT32:
+          int[] intValues = (int[]) column;
+          for (int j = 0; j < rowSize; j++) {
+            ReadWriteIOUtils.write(intValues[j], stream);
           }
-        }
-        break;
-      default:
-        throw new UnSupportedDataTypeException(
-            String.format("Data type %s is not supported.", dataType));
+          break;
+        case INT64:
+          long[] longValues = (long[]) column;
+          for (int j = 0; j < rowSize; j++) {
+            ReadWriteIOUtils.write(longValues[j], stream);
+          }
+          break;
+        case FLOAT:
+          float[] floatValues = (float[]) column;
+          for (int j = 0; j < rowSize; j++) {
+            ReadWriteIOUtils.write(floatValues[j], stream);
+          }
+          break;
+        case DOUBLE:
+          double[] doubleValues = (double[]) column;
+          for (int j = 0; j < rowSize; j++) {
+            ReadWriteIOUtils.write(doubleValues[j], stream);
+          }
+          break;
+        case BOOLEAN:
+          boolean[] boolValues = (boolean[]) column;
+          for (int j = 0; j < rowSize; j++) {
+            ReadWriteIOUtils.write(BytesUtils.boolToByte(boolValues[j]), 
stream);
+          }
+          break;
+        case TEXT:
+          Binary[] binaryValues = (Binary[]) column;
+          for (int j = 0; j < rowSize; j++) {
+            ReadWriteIOUtils.write(BytesUtils.boolToByte(binaryValues[j] != 
null), stream);
+            if (binaryValues[j] != null) {
+              ReadWriteIOUtils.write(binaryValues[j], stream);
+            }
+          }
+          break;
+        default:
+          throw new UnSupportedDataTypeException(
+              String.format("Data type %s is not supported.", dataType));
+      }
     }
   }
 
@@ -468,33 +475,43 @@ public class Tablet {
     int rowSize = ReadWriteIOUtils.readInt(byteBuffer);
 
     // deserialize schemas
-    int schemaSize = ReadWriteIOUtils.readInt(byteBuffer);
+    int schemaSize = 0;
     List<MeasurementSchema> schemas = new ArrayList<>();
-    for (int i = 0; i < schemaSize; i++) {
-      boolean hasSchema = BytesUtils.byteToBool(byteBuffer.get());
-      if (hasSchema) {
-        schemas.add(MeasurementSchema.deserializeFrom(byteBuffer));
+    boolean isSchemasNotNull = 
BytesUtils.byteToBool(ReadWriteIOUtils.readByte(byteBuffer));
+    if (isSchemasNotNull) {
+      schemaSize = ReadWriteIOUtils.readInt(byteBuffer);
+      for (int i = 0; i < schemaSize; i++) {
+        boolean hasSchema = 
BytesUtils.byteToBool(ReadWriteIOUtils.readByte(byteBuffer));
+        if (hasSchema) {
+          schemas.add(MeasurementSchema.deserializeFrom(byteBuffer));
+        }
       }
     }
 
     // deserialize times
-    int timesSize = ReadWriteIOUtils.readInt(byteBuffer);
-    long[] times = new long[timesSize];
-    for (int i = 0; i < timesSize; i++) {
-      times[i] = ReadWriteIOUtils.readLong(byteBuffer);
+    long[] times = new long[rowSize];
+    boolean isTimesNotNull = 
BytesUtils.byteToBool(ReadWriteIOUtils.readByte(byteBuffer));
+    if (isTimesNotNull) {
+      for (int i = 0; i < rowSize; i++) {
+        times[i] = ReadWriteIOUtils.readLong(byteBuffer);
+      }
     }
 
     // deserialize bitmaps
-    boolean hasBitMaps = (ReadWriteIOUtils.readInt(byteBuffer) == 1);
-    BitMap[] bitMaps = null;
-    if (hasBitMaps) {
+    BitMap[] bitMaps = new BitMap[schemaSize];
+    boolean isBitMapsNotNull = 
BytesUtils.byteToBool(ReadWriteIOUtils.readByte(byteBuffer));
+    if (isBitMapsNotNull) {
       bitMaps = readBitMapsFromBuffer(byteBuffer, schemaSize);
     }
 
     // deserialize values
     TSDataType[] dataTypes =
         
schemas.stream().map(MeasurementSchema::getType).toArray(TSDataType[]::new);
-    Object[] values = readTabletValuesFromBuffer(byteBuffer, dataTypes, 
schemaSize);
+    Object[] values = new Object[schemaSize];
+    boolean isValuesNotNull = 
BytesUtils.byteToBool(ReadWriteIOUtils.readByte(byteBuffer));
+    if (isValuesNotNull) {
+      values = readTabletValuesFromBuffer(byteBuffer, dataTypes, schemaSize, 
rowSize);
+    }
 
     Tablet tablet = new Tablet(deviceId, schemas, times, values, bitMaps, 
rowSize);
     tablet.constructMeasurementIndexMap();
@@ -502,78 +519,82 @@ public class Tablet {
   }
 
   /** deserialize bitmaps */
-  public static BitMap[] readBitMapsFromBuffer(ByteBuffer buffer, int columns) 
{
+  public static BitMap[] readBitMapsFromBuffer(ByteBuffer byteBuffer, int 
columns) {
     BitMap[] bitMaps = new BitMap[columns];
     for (int i = 0; i < columns; i++) {
-      boolean hasBitMap = (ReadWriteIOUtils.readInt(buffer) == 1);
+      boolean hasBitMap = 
BytesUtils.byteToBool(ReadWriteIOUtils.readByte(byteBuffer));
       if (hasBitMap) {
-        int bitMapSize = ReadWriteIOUtils.readInt(buffer);
-        byte[] bytes = ReadWriteIOUtils.readBinary(buffer).getValues();
-        bitMaps[i] = new BitMap(bitMapSize, bytes);
+        final int size = ReadWriteIOUtils.readInt(byteBuffer);
+        final Binary valueBinary = ReadWriteIOUtils.readBinary(byteBuffer);
+        bitMaps[i] = new BitMap(size, valueBinary.getValues());
       }
     }
     return bitMaps;
   }
 
   /**
-   * @param buffer data values
+   * @param byteBuffer data values
    * @param columns column number
    */
   @SuppressWarnings("squid:S3776") // Suppress high Cognitive Complexity 
warning
   public static Object[] readTabletValuesFromBuffer(
-      ByteBuffer buffer, TSDataType[] types, int columns) {
+      ByteBuffer byteBuffer, TSDataType[] types, int columns, int rowSize) {
     Object[] values = new Object[columns];
     for (int i = 0; i < columns; i++) {
-      int arraySize = ReadWriteIOUtils.readInt(buffer);
-      switch (types[i]) {
-        case BOOLEAN:
-          boolean[] boolValues = new boolean[arraySize];
-          for (int index = 0; index < arraySize; index++) {
-            boolValues[index] = ReadWriteIOUtils.readInt(buffer) == 1;
-          }
-          values[i] = boolValues;
-          break;
-        case INT32:
-          int[] intValues = new int[arraySize];
-          for (int index = 0; index < arraySize; index++) {
-            intValues[index] = ReadWriteIOUtils.readInt(buffer);
-          }
-          values[i] = intValues;
-          break;
-        case INT64:
-          long[] longValues = new long[arraySize];
-          for (int index = 0; index < arraySize; index++) {
-            longValues[index] = ReadWriteIOUtils.readLong(buffer);
-          }
-          values[i] = longValues;
-          break;
-        case FLOAT:
-          float[] floatValues = new float[arraySize];
-          for (int index = 0; index < arraySize; index++) {
-            floatValues[index] = ReadWriteIOUtils.readFloat(buffer);
-          }
-          values[i] = floatValues;
-          break;
-        case DOUBLE:
-          double[] doubleValues = new double[arraySize];
-          for (int index = 0; index < arraySize; index++) {
-            doubleValues[index] = ReadWriteIOUtils.readDouble(buffer);
-          }
-          values[i] = doubleValues;
-          break;
-        case TEXT:
-          Binary[] binaryValues = new Binary[arraySize];
-          for (int index = 0; index < arraySize; index++) {
-            boolean isNull = (ReadWriteIOUtils.readInt(buffer) == 1);
-            if (!isNull) {
-              binaryValues[index] = ReadWriteIOUtils.readBinary(buffer);
+      boolean isValueColumnsNotNull = 
BytesUtils.byteToBool(ReadWriteIOUtils.readByte(byteBuffer));
+
+      if (isValueColumnsNotNull) {
+        switch (types[i]) {
+          case BOOLEAN:
+            boolean[] boolValues = new boolean[rowSize];
+            for (int index = 0; index < rowSize; index++) {
+              boolValues[index] = 
BytesUtils.byteToBool(ReadWriteIOUtils.readByte(byteBuffer));
             }
-          }
-          values[i] = binaryValues;
-          break;
-        default:
-          throw new UnSupportedDataTypeException(
-              String.format("data type %s is not supported when convert data 
at client", types[i]));
+            values[i] = boolValues;
+            break;
+          case INT32:
+            int[] intValues = new int[rowSize];
+            for (int index = 0; index < rowSize; index++) {
+              intValues[index] = ReadWriteIOUtils.readInt(byteBuffer);
+            }
+            values[i] = intValues;
+            break;
+          case INT64:
+            long[] longValues = new long[rowSize];
+            for (int index = 0; index < rowSize; index++) {
+              longValues[index] = ReadWriteIOUtils.readLong(byteBuffer);
+            }
+            values[i] = longValues;
+            break;
+          case FLOAT:
+            float[] floatValues = new float[rowSize];
+            for (int index = 0; index < rowSize; index++) {
+              floatValues[index] = ReadWriteIOUtils.readFloat(byteBuffer);
+            }
+            values[i] = floatValues;
+            break;
+          case DOUBLE:
+            double[] doubleValues = new double[rowSize];
+            for (int index = 0; index < rowSize; index++) {
+              doubleValues[index] = ReadWriteIOUtils.readDouble(byteBuffer);
+            }
+            values[i] = doubleValues;
+            break;
+          case TEXT:
+            Binary[] binaryValues = new Binary[rowSize];
+            for (int index = 0; index < rowSize; index++) {
+              boolean isNotNull = 
BytesUtils.byteToBool(ReadWriteIOUtils.readByte(byteBuffer));
+              if (isNotNull) {
+                binaryValues[index] = ReadWriteIOUtils.readBinary(byteBuffer);
+              }
+            }
+            values[i] = binaryValues;
+            break;
+          default:
+            throw new UnSupportedDataTypeException(
+                String.format(
+                    "data type %s is not supported when convert data at 
client", types[i]));
+        }
       }
     }
     return values;
@@ -584,58 +605,121 @@ public class Tablet {
     if (this == o) {
       return true;
     }
-    if (o == null || getClass() != o.getClass()) {
+    if (o == null || !getClass().equals(o.getClass())) {
       return false;
     }
     Tablet that = (Tablet) o;
 
     boolean flag =
         that.rowSize == rowSize
-            && Arrays.equals(that.timestamps, timestamps)
-            && Arrays.equals(that.bitMaps, bitMaps)
+            && Objects.equals(that.deviceId, deviceId)
             && Objects.equals(that.schemas, schemas)
-            && Objects.equals(that.measurementIndex, measurementIndex)
-            && Objects.equals(that.deviceId, deviceId);
+            && Objects.equals(that.measurementIndex, measurementIndex);
     if (!flag) {
       return false;
     }
 
+    // assert timestamps and bitmaps
+    int columns = (schemas == null ? 0 : schemas.size());
+    if (!isTimestampsEqual(this.timestamps, that.timestamps, rowSize)
+        || !isBitMapsEqual(this.bitMaps, that.bitMaps, columns)) {
+      return false;
+    }
+
     // assert values
     Object[] thatValues = that.values;
+    if (thatValues == values) {
+      return true;
+    }
+    if (thatValues == null || values == null) {
+      return false;
+    }
     if (thatValues.length != values.length) {
       return false;
     }
     for (int i = 0, n = values.length; i < n; i++) {
+      if (thatValues[i] == values[i]) {
+        continue;
+      }
+      if (thatValues[i] == null || values[i] == null) {
+        return false;
+      }
+      if (!thatValues[i].getClass().equals(values[i].getClass())) {
+        return false;
+      }
+
       switch (schemas.get(i).getType()) {
         case INT32:
-          if (!Arrays.equals((int[]) thatValues[i], (int[]) values[i])) {
+          int[] thisIntValues = (int[]) values[i];
+          int[] thatIntValues = (int[]) thatValues[i];
+          if (thisIntValues.length < rowSize || thatIntValues.length < 
rowSize) {
             return false;
           }
+          for (int j = 0; j < rowSize; j++) {
+            if (thisIntValues[j] != thatIntValues[j]) {
+              return false;
+            }
+          }
           break;
         case INT64:
-          if (!Arrays.equals((long[]) thatValues[i], (long[]) values[i])) {
+          long[] thisLongValues = (long[]) values[i];
+          long[] thatLongValues = (long[]) thatValues[i];
+          if (thisLongValues.length < rowSize || thatLongValues.length < 
rowSize) {
             return false;
           }
+          for (int j = 0; j < rowSize; j++) {
+            if (thisLongValues[j] != thatLongValues[j]) {
+              return false;
+            }
+          }
           break;
         case FLOAT:
-          if (!Arrays.equals((float[]) thatValues[i], (float[]) values[i])) {
+          float[] thisFloatValues = (float[]) values[i];
+          float[] thatFloatValues = (float[]) thatValues[i];
+          if (thisFloatValues.length < rowSize || thatFloatValues.length < 
rowSize) {
             return false;
           }
+          for (int j = 0; j < rowSize; j++) {
+            if (thisFloatValues[j] != thatFloatValues[j]) {
+              return false;
+            }
+          }
           break;
         case DOUBLE:
-          if (!Arrays.equals((double[]) thatValues[i], (double[]) values[i])) {
+          double[] thisDoubleValues = (double[]) values[i];
+          double[] thatDoubleValues = (double[]) thatValues[i];
+          if (thisDoubleValues.length < rowSize || thatDoubleValues.length < 
rowSize) {
             return false;
           }
+          for (int j = 0; j < rowSize; j++) {
+            if (thisDoubleValues[j] != thatDoubleValues[j]) {
+              return false;
+            }
+          }
           break;
         case BOOLEAN:
-          if (!Arrays.equals((boolean[]) thatValues[i], (boolean[]) 
values[i])) {
+          boolean[] thisBooleanValues = (boolean[]) values[i];
+          boolean[] thatBooleanValues = (boolean[]) thatValues[i];
+          if (thisBooleanValues.length < rowSize || thatBooleanValues.length < 
rowSize) {
             return false;
           }
+          for (int j = 0; j < rowSize; j++) {
+            if (thisBooleanValues[j] != thatBooleanValues[j]) {
+              return false;
+            }
+          }
           break;
         case TEXT:
-          if (!Arrays.equals((Binary[]) thatValues[i], (Binary[]) values[i])) {
+          Binary[] thisBinaryValues = (Binary[]) values[i];
+          Binary[] thatBinaryValues = (Binary[]) thatValues[i];
+          if (thisBinaryValues.length < rowSize || thatBinaryValues.length < 
rowSize) {
             return false;
           }
+          for (int j = 0; j < rowSize; j++) {
+            if (!thisBinaryValues[j].equals(thatBinaryValues[j])) {
+              return false;
+            }
+          }
           break;
         default:
           throw new UnSupportedDataTypeException(
@@ -645,4 +729,36 @@ public class Tablet {
 
     return true;
   }
+
+  private boolean isTimestampsEqual(long[] thisTimestamps, long[] 
thatTimestamps, int rowSize) {
+    if (thisTimestamps == thatTimestamps) {
+      return true;
+    }
+    if (thisTimestamps == null || thatTimestamps == null) {
+      return false;
+    }
+
+    for (int i = 0; i < rowSize; i++) {
+      if (thisTimestamps[i] != thatTimestamps[i]) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  private boolean isBitMapsEqual(BitMap[] thisBitMaps, BitMap[] thatBitMaps, 
int columns) {
+    if (thisBitMaps == thatBitMaps) {
+      return true;
+    }
+    if (thisBitMaps == null || thatBitMaps == null) {
+      return false;
+    }
+
+    for (int i = 0; i < columns; i++) {
+      if (!thisBitMaps[i].equals(thatBitMaps[i])) {
+        return false;
+      }
+    }
+    return true;
+  }
 }
diff --git 
a/tsfile/src/test/java/org/apache/iotdb/tsfile/write/record/TabletTest.java 
b/tsfile/src/test/java/org/apache/iotdb/tsfile/write/record/TabletTest.java
index 34ad5a5a7d9..f91172501f7 100644
--- a/tsfile/src/test/java/org/apache/iotdb/tsfile/write/record/TabletTest.java
+++ b/tsfile/src/test/java/org/apache/iotdb/tsfile/write/record/TabletTest.java
@@ -30,6 +30,7 @@ import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.List;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
@@ -61,6 +62,43 @@ public class TabletTest {
             values,
             new BitMap[] {new BitMap(1024), new BitMap(1024)},
             rowSize);
+    try {
+      ByteBuffer byteBuffer = tablet.serialize();
+      Tablet newTablet = Tablet.deserialize(byteBuffer);
+      assertEquals(newTablet, tablet);
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail();
+    }
+  }
+
+  @Test
+  public void testSerializationAndDeSerializationWithMoreData() {
+    String deviceId = "root.sg";
+    List<MeasurementSchema> measurementSchemas = new ArrayList<>();
+    measurementSchemas.add(new MeasurementSchema("s0", TSDataType.INT32, 
TSEncoding.PLAIN));
+    measurementSchemas.add(new MeasurementSchema("s1", TSDataType.INT64, 
TSEncoding.PLAIN));
+    measurementSchemas.add(new MeasurementSchema("s2", TSDataType.FLOAT, 
TSEncoding.PLAIN));
+    measurementSchemas.add(new MeasurementSchema("s3", TSDataType.DOUBLE, 
TSEncoding.PLAIN));
+    measurementSchemas.add(new MeasurementSchema("s4", TSDataType.BOOLEAN, 
TSEncoding.PLAIN));
+    measurementSchemas.add(new MeasurementSchema("s5", TSDataType.TEXT, 
TSEncoding.PLAIN));
+
+    int rowSize = 1000;
+    Tablet tablet = new Tablet(deviceId, measurementSchemas);
+    tablet.rowSize = rowSize;
+    tablet.initBitMaps();
+    for (int i = 0; i < rowSize; i++) {
+      tablet.addTimestamp(i, i);
+      tablet.addValue(measurementSchemas.get(0).getMeasurementId(), i, i);
+      tablet.addValue(measurementSchemas.get(1).getMeasurementId(), i, (long) 
i);
+      tablet.addValue(measurementSchemas.get(2).getMeasurementId(), i, (float) 
i);
+      tablet.addValue(measurementSchemas.get(3).getMeasurementId(), i, 
(double) i);
+      tablet.addValue(measurementSchemas.get(4).getMeasurementId(), i, (i % 2) 
== 0);
+      tablet.addValue(measurementSchemas.get(5).getMeasurementId(), i, 
String.valueOf(i));
+
+      tablet.bitMaps[i % measurementSchemas.size()].mark(i);
+    }
+
     try {
       ByteBuffer byteBuffer = tablet.serialize();
       Tablet newTablet = Tablet.deserialize(byteBuffer);

Reply via email to