This is an automated email from the ASF dual-hosted git repository. jackietien pushed a commit to branch mergemaster0808 in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 3c3efe2c1bac40e60fe0072c545c8ffe09d6e70e Author: YangYumings <[email protected]> AuthorDate: Mon Aug 5 10:24:38 2024 +0800 Convert date to LocalDate in sortlist() (cherry picked from commit 0733a499a0f0ca468d9a6b4cc61ee0cf50f3d5fc) --- iotdb | 1 + .../java/org/apache/iotdb/session/Session.java | 9 ++- .../java/org/apache/iotdb/session/TabletTest.java | 75 +++++++++++++++++++--- .../planner/plan/node/write/InsertTabletNode.java | 1 + .../node/write/InsertTabletNodeSerdeTest.java | 35 ++++++++++ 5 files changed, 112 insertions(+), 9 deletions(-) diff --git a/iotdb b/iotdb new file mode 160000 index 00000000000..6ade33a6b9a --- /dev/null +++ b/iotdb @@ -0,0 +1 @@ +Subproject commit 6ade33a6b9a90820d0f2d536d81136b4af6a98c7 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 caa02baee3f..35229b54162 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 @@ -79,6 +79,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; @@ -3361,13 +3362,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[] date = (LocalDate[]) valueList; + LocalDate[] sortedDateValues = new LocalDate[date.length]; + for (int i = 0; i < index.length; i++) { + sortedDateValues[i] = date[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 7df3ce16150..9f8c178e3d0 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,11 +21,14 @@ 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.IMeasurementSchema; 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; @@ -37,6 +40,15 @@ public class TabletTest { Session session = new Session("127.0.0.1", 1234); List<IMeasurementSchema> 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; @@ -53,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); @@ -73,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])); } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertTabletNode.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertTabletNode.java index 4f46c6fda54..9a35947edf2 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertTabletNode.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertTabletNode.java @@ -386,6 +386,7 @@ public class InsertTabletNode extends InsertNode implements WALEntryValue { case DATE: values[i] = new int[rowSize]; break; + case TIMESTAMP: case INT64: values[i] = new long[rowSize]; break; diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/node/write/InsertTabletNodeSerdeTest.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/node/write/InsertTabletNodeSerdeTest.java index 183b95fe0a1..013aad45b95 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/node/write/InsertTabletNodeSerdeTest.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/node/write/InsertTabletNodeSerdeTest.java @@ -29,6 +29,7 @@ import org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.RelationalIn import org.apache.iotdb.db.storageengine.dataregion.wal.utils.WALByteBufferForTest; import org.apache.tsfile.enums.TSDataType; +import org.apache.tsfile.utils.Binary; import org.apache.tsfile.write.schema.MeasurementSchema; import org.junit.Assert; import org.junit.Test; @@ -36,6 +37,8 @@ import org.junit.Test; import java.io.ByteArrayInputStream; import java.io.DataInputStream; import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.nio.ByteBuffer; public class InsertTabletNodeSerdeTest { @@ -147,6 +150,38 @@ public class InsertTabletNodeSerdeTest { Assert.assertEquals(insertTabletNode, tmpNode); } + @Test + public void testInitTabletValuesWithAllTypes() + throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { + InsertTabletNode insertTabletNode = new InsertTabletNode(new PlanNodeId("1")); + Method initTabletValuesMethod = + InsertTabletNode.class.getDeclaredMethod( + "initTabletValues", int.class, int.class, TSDataType[].class); + initTabletValuesMethod.setAccessible(true); + + TSDataType[] dataTypes = { + TSDataType.TEXT, TSDataType.FLOAT, TSDataType.INT32, + TSDataType.TIMESTAMP, TSDataType.DOUBLE, TSDataType.BOOLEAN + }; + + int columnSize = dataTypes.length; + int rowSize = 5; + + Object[] values = + (Object[]) initTabletValuesMethod.invoke(insertTabletNode, columnSize, rowSize, dataTypes); + + // Assert the result + Assert.assertEquals(columnSize, values.length); + + // Validate each element in the values array + Assert.assertEquals(Binary[].class, values[0].getClass()); + Assert.assertEquals(float[].class, values[1].getClass()); + Assert.assertEquals(int[].class, values[2].getClass()); + Assert.assertEquals(long[].class, values[3].getClass()); + Assert.assertEquals(double[].class, values[4].getClass()); + Assert.assertEquals(boolean[].class, values[5].getClass()); + } + private InsertTabletNode getInsertTabletNode() throws IllegalPathException { long[] times = new long[] {110L, 111L, 112L, 113L}; TSDataType[] dataTypes = new TSDataType[5];
