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

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

commit 345b74aec0f462111c92036776d5849a3e2e8300
Author: Tian Jiang <[email protected]>
AuthorDate: Fri Aug 2 19:14:29 2024 +0800

    Fix date type is not correctly cast during sorting a Tablet
---
 .../java/org/apache/iotdb/session/Session.java     |  9 ++-
 .../java/org/apache/iotdb/session/TabletTest.java  | 76 +++++++++++++++++++---
 2 files changed, 76 insertions(+), 9 deletions(-)

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 a552002fdae..f50260ccff9 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 org.slf4j.LoggerFactory;
 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 @@ public class Session implements ISession {
         }
         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 689ebab4684..53f582d5e2b 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 @@ package org.apache.iotdb.session;
 
 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 @@ public class TabletTest {
     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 @@ public class TabletTest {
     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 @@ public class TabletTest {
     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]));
   }
 }

Reply via email to