Fix date type is not correctly cast during sorting a Tablet
diff --git a/iotdb-client/session/src/main/java/org/apache/iotdb/session/Session.java b/iotdb-client/session/src/main/java/org/apache/iotdb/session/Session.java index a552002..f50260c 100644 --- a/iotdb-client/session/src/main/java/org/apache/iotdb/session/Session.java +++ b/iotdb-client/session/src/main/java/org/apache/iotdb/session/Session.java
@@ -78,6 +78,7 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.nio.ByteBuffer; +import java.time.LocalDate; import java.time.ZoneId; import java.util.ArrayList; import java.util.Arrays; @@ -3295,13 +3296,19 @@ } return sortedValues; case INT32: - case DATE: int[] intValues = (int[]) valueList; int[] sortedIntValues = new int[intValues.length]; for (int i = 0; i < index.length; i++) { sortedIntValues[i] = intValues[index[i]]; } return sortedIntValues; + case DATE: + LocalDate[] dateValues = (LocalDate[]) valueList; + LocalDate[] sortedDateValues = new LocalDate[dateValues.length]; + for (int i = 0; i < index.length; i++) { + sortedDateValues[i] = dateValues[index[i]]; + } + return sortedDateValues; case INT64: case TIMESTAMP: long[] longValues = (long[]) valueList;
diff --git a/iotdb-client/session/src/test/java/org/apache/iotdb/session/TabletTest.java b/iotdb-client/session/src/test/java/org/apache/iotdb/session/TabletTest.java index 689ebab..53f582d 100644 --- a/iotdb-client/session/src/test/java/org/apache/iotdb/session/TabletTest.java +++ b/iotdb-client/session/src/test/java/org/apache/iotdb/session/TabletTest.java
@@ -21,10 +21,13 @@ import org.apache.tsfile.enums.TSDataType; import org.apache.tsfile.file.metadata.enums.TSEncoding; +import org.apache.tsfile.utils.Binary; import org.apache.tsfile.write.record.Tablet; import org.apache.tsfile.write.schema.MeasurementSchema; import org.junit.Test; +import java.nio.charset.StandardCharsets; +import java.time.LocalDate; import java.util.ArrayList; import java.util.List; @@ -36,6 +39,16 @@ Session session = new Session("127.0.0.1", 1234); List<MeasurementSchema> schemaList = new ArrayList<>(); schemaList.add(new MeasurementSchema("s1", TSDataType.INT64, TSEncoding.RLE)); + schemaList.add(new MeasurementSchema("s2", TSDataType.TIMESTAMP)); + schemaList.add(new MeasurementSchema("s3", TSDataType.INT32)); + schemaList.add(new MeasurementSchema("s4", TSDataType.DATE)); + schemaList.add(new MeasurementSchema("s5", TSDataType.BOOLEAN)); + schemaList.add(new MeasurementSchema("s6", TSDataType.DOUBLE)); + schemaList.add(new MeasurementSchema("s7", TSDataType.BLOB)); + schemaList.add(new MeasurementSchema("s8", TSDataType.TEXT)); + schemaList.add(new MeasurementSchema("s9", TSDataType.STRING)); + ; + // insert three rows data Tablet tablet = new Tablet("root.sg1.d1", schemaList, 3); long[] timestamps = tablet.timestamps; @@ -52,11 +65,32 @@ timestamps[0] = 2; timestamps[1] = 0; timestamps[2] = 1; - // just one column INT64 data - long[] sensor = (long[]) values[0]; - sensor[0] = 0; - sensor[1] = 1; - sensor[2] = 2; + values[0] = new long[] {0, 1, 2}; + values[1] = new long[] {0, 1, 2}; + values[2] = new int[] {0, 1, 2}; + values[3] = + new LocalDate[] {LocalDate.ofEpochDay(0), LocalDate.ofEpochDay(1), LocalDate.ofEpochDay(2)}; + values[4] = new boolean[] {true, false, true}; + values[5] = new double[] {0.0, 1.0, 2.0}; + values[6] = + new Binary[] { + new Binary("0".getBytes(StandardCharsets.UTF_8)), + new Binary("1".getBytes(StandardCharsets.UTF_8)), + new Binary("2".getBytes(StandardCharsets.UTF_8)) + }; + values[7] = + new Binary[] { + new Binary("0".getBytes(StandardCharsets.UTF_8)), + new Binary("1".getBytes(StandardCharsets.UTF_8)), + new Binary("2".getBytes(StandardCharsets.UTF_8)) + }; + values[8] = + new Binary[] { + new Binary("0".getBytes(StandardCharsets.UTF_8)), + new Binary("1".getBytes(StandardCharsets.UTF_8)), + new Binary("2".getBytes(StandardCharsets.UTF_8)) + }; + tablet.rowSize = 3; session.sortTablet(tablet); @@ -72,10 +106,36 @@ If the data equal to above tablet, test pass, otherwise test fialed */ long[] resTimestamps = tablet.timestamps; - long[] resValues = (long[]) tablet.values[0]; long[] expectedTimestamps = new long[] {0, 1, 2}; - long[] expectedValues = new long[] {1, 2, 0}; assertArrayEquals(expectedTimestamps, resTimestamps); - assertArrayEquals(expectedValues, resValues); + assertArrayEquals(new long[] {1, 2, 0}, ((long[]) tablet.values[0])); + assertArrayEquals(new long[] {1, 2, 0}, ((long[]) tablet.values[1])); + assertArrayEquals(new int[] {1, 2, 0}, ((int[]) tablet.values[2])); + assertArrayEquals( + new LocalDate[] {LocalDate.ofEpochDay(1), LocalDate.ofEpochDay(2), LocalDate.ofEpochDay(0)}, + ((LocalDate[]) tablet.values[3])); + assertArrayEquals(new boolean[] {false, true, true}, ((boolean[]) tablet.values[4])); + assertArrayEquals(new double[] {1.0, 2.0, 0.0}, ((double[]) tablet.values[5]), 0.001); + assertArrayEquals( + new Binary[] { + new Binary("1".getBytes(StandardCharsets.UTF_8)), + new Binary("2".getBytes(StandardCharsets.UTF_8)), + new Binary("0".getBytes(StandardCharsets.UTF_8)) + }, + ((Binary[]) tablet.values[6])); + assertArrayEquals( + new Binary[] { + new Binary("1".getBytes(StandardCharsets.UTF_8)), + new Binary("2".getBytes(StandardCharsets.UTF_8)), + new Binary("0".getBytes(StandardCharsets.UTF_8)) + }, + ((Binary[]) tablet.values[7])); + assertArrayEquals( + new Binary[] { + new Binary("1".getBytes(StandardCharsets.UTF_8)), + new Binary("2".getBytes(StandardCharsets.UTF_8)), + new Binary("0".getBytes(StandardCharsets.UTF_8)) + }, + ((Binary[]) tablet.values[8])); } }