From 7db83bfa448738371bd01c779be77b7694354600 Mon Sep 17 00:00:00 2001 From: HTHou Date: Tue, 24 Sep 2024 12:33:47 +0800 Subject: [PATCH] Fix error when write aligned tablet with null date --- .../chunk/AlignedChunkGroupWriterImpl.java | 5 ++- .../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 ecd974f83..7d2b60906 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 @@ -191,7 +191,10 @@ public int write(Tablet tablet) throws WriteProcessException, IOException { 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 4e5607a62..76f482c5c 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 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 void writeNonAlignedWithTabletWithNullValue() { 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 void writeNonAlignedWithTabletWithNullValue() { 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 void writeNonAlignedWithTabletWithNullValue() { 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 void writeAlignedWithTabletWithNullValue() { 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 void writeAlignedWithTabletWithNullValue() { 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 void writeAlignedWithTabletWithNullValue() { 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);