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

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


The following commit(s) were added to refs/heads/iotdb by this push:
     new c10ccbef Fix error when write aligned tablet with null date (#250)
c10ccbef is described below

commit c10ccbef638420edff831885bce078e46ad812dd
Author: Haonan <[email protected]>
AuthorDate: Tue Sep 24 14:17:25 2024 +0800

    Fix error when write aligned tablet with null date (#250)
    
    (cherry picked from commit efb39a61bc8f2561075e3fc47f3630cda314a5de)
---
 .../write/chunk/AlignedChunkGroupWriterImpl.java   |  5 +++-
 .../apache/tsfile/write/TsFileWriteApiTest.java    | 31 ++++++++++++++++------
 2 files changed, 27 insertions(+), 9 deletions(-)

diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/AlignedChunkGroupWriterImpl.java
 
b/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/AlignedChunkGroupWriterImpl.java
index 41fa5577..5ffba51b 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/AlignedChunkGroupWriterImpl.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/AlignedChunkGroupWriterImpl.java
@@ -231,7 +231,10 @@ public class AlignedChunkGroupWriterImpl implements 
IChunkGroupWriter {
           case DATE:
             valueChunkWriter.write(
                 time,
-                DateUtils.parseDateExpressionToInt(((LocalDate[]) 
tablet.values[columnIndex])[row]),
+                isNull
+                    ? 0
+                    : DateUtils.parseDateExpressionToInt(
+                        ((LocalDate[]) tablet.values[columnIndex])[row]),
                 isNull);
             break;
           case INT64:
diff --git 
a/java/tsfile/src/test/java/org/apache/tsfile/write/TsFileWriteApiTest.java 
b/java/tsfile/src/test/java/org/apache/tsfile/write/TsFileWriteApiTest.java
index a1ec2aa1..672ca2c1 100644
--- a/java/tsfile/src/test/java/org/apache/tsfile/write/TsFileWriteApiTest.java
+++ b/java/tsfile/src/test/java/org/apache/tsfile/write/TsFileWriteApiTest.java
@@ -52,6 +52,7 @@ import org.junit.Test;
 import java.io.File;
 import java.io.IOException;
 import java.nio.ByteBuffer;
+import java.time.LocalDate;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -354,8 +355,9 @@ public class TsFileWriteApiTest {
     setEnv(100, 30);
     try (TsFileWriter tsFileWriter = new TsFileWriter(f)) {
       measurementSchemas.add(new MeasurementSchema("s1", TSDataType.TEXT, 
TSEncoding.PLAIN));
-      measurementSchemas.add(new MeasurementSchema("s2", TSDataType.TEXT, 
TSEncoding.PLAIN));
-      measurementSchemas.add(new MeasurementSchema("s3", TSDataType.TEXT, 
TSEncoding.PLAIN));
+      measurementSchemas.add(new MeasurementSchema("s2", TSDataType.STRING, 
TSEncoding.PLAIN));
+      measurementSchemas.add(new MeasurementSchema("s3", TSDataType.BLOB, 
TSEncoding.PLAIN));
+      measurementSchemas.add(new MeasurementSchema("s4", TSDataType.DATE, 
TSEncoding.PLAIN));
 
       // register nonAligned timeseries
       tsFileWriter.registerTimeseries(new Path(deviceId), measurementSchemas);
@@ -364,12 +366,12 @@ public class TsFileWriteApiTest {
       long[] timestamps = tablet.timestamps;
       Object[] values = tablet.values;
       tablet.initBitMaps();
-      long sensorNum = measurementSchemas.size();
+      int sensorNum = measurementSchemas.size();
       long startTime = 0;
       for (long r = 0; r < 10000; r++) {
         int row = tablet.rowSize++;
         timestamps[row] = startTime++;
-        for (int i = 0; i < sensorNum; i++) {
+        for (int i = 0; i < sensorNum - 1; i++) {
           if (i == 1 && r > 1000) {
             tablet.bitMaps[i].mark((int) r % tablet.getMaxRowNumber());
             continue;
@@ -377,6 +379,12 @@ public class TsFileWriteApiTest {
           Binary[] textSensor = (Binary[]) values[i];
           textSensor[row] = new Binary("testString.........", 
TSFileConfig.STRING_CHARSET);
         }
+        if (r > 1000) {
+          tablet.bitMaps[sensorNum - 1].mark((int) r % 
tablet.getMaxRowNumber());
+        } else {
+          LocalDate[] dateSensor = (LocalDate[]) values[sensorNum - 1];
+          dateSensor[row] = LocalDate.of(2024, 4, 1);
+        }
         // write
         if (tablet.rowSize == tablet.getMaxRowNumber()) {
           tsFileWriter.write(tablet);
@@ -400,8 +408,9 @@ public class TsFileWriteApiTest {
     setEnv(100, 30);
     try (TsFileWriter tsFileWriter = new TsFileWriter(f)) {
       measurementSchemas.add(new MeasurementSchema("s1", TSDataType.TEXT, 
TSEncoding.PLAIN));
-      measurementSchemas.add(new MeasurementSchema("s2", TSDataType.TEXT, 
TSEncoding.PLAIN));
-      measurementSchemas.add(new MeasurementSchema("s3", TSDataType.TEXT, 
TSEncoding.PLAIN));
+      measurementSchemas.add(new MeasurementSchema("s2", TSDataType.STRING, 
TSEncoding.PLAIN));
+      measurementSchemas.add(new MeasurementSchema("s3", TSDataType.BLOB, 
TSEncoding.PLAIN));
+      measurementSchemas.add(new MeasurementSchema("s4", TSDataType.DATE, 
TSEncoding.PLAIN));
 
       // register aligned timeseries
       tsFileWriter.registerAlignedTimeseries(new Path(deviceId), 
measurementSchemas);
@@ -410,12 +419,12 @@ public class TsFileWriteApiTest {
       long[] timestamps = tablet.timestamps;
       Object[] values = tablet.values;
       tablet.initBitMaps();
-      long sensorNum = measurementSchemas.size();
+      int sensorNum = measurementSchemas.size();
       long startTime = 0;
       for (long r = 0; r < 10000; r++) {
         int row = tablet.rowSize++;
         timestamps[row] = startTime++;
-        for (int i = 0; i < sensorNum; i++) {
+        for (int i = 0; i < sensorNum - 1; i++) {
           if (i == 1 && r > 1000) {
             tablet.bitMaps[i].mark((int) r % tablet.getMaxRowNumber());
             continue;
@@ -423,6 +432,12 @@ public class TsFileWriteApiTest {
           Binary[] textSensor = (Binary[]) values[i];
           textSensor[row] = new Binary("testString.........", 
TSFileConfig.STRING_CHARSET);
         }
+        if (r > 1000) {
+          tablet.bitMaps[sensorNum - 1].mark((int) r % 
tablet.getMaxRowNumber());
+        } else {
+          LocalDate[] dateSensor = (LocalDate[]) values[sensorNum - 1];
+          dateSensor[row] = LocalDate.of(2024, 4, 1);
+        }
         // write
         if (tablet.rowSize == tablet.getMaxRowNumber()) {
           tsFileWriter.writeAligned(tablet);

Reply via email to