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

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


The following commit(s) were added to refs/heads/TableModelIngestion by this 
push:
     new 44a687251f1 add test for InsertTabletStatement.swap and insertColumn
44a687251f1 is described below

commit 44a687251f18f81a5a018bc50c8d5dfb7609b886
Author: jt2594838 <[email protected]>
AuthorDate: Thu Jul 4 10:50:25 2024 +0800

    add test for InsertTabletStatement.swap and insertColumn
---
 .../plan/parser/StatementGenerator.java            |   6 +-
 .../fetcher/TableHeaderSchemaValidator.java        |   9 +-
 .../plan/statement/crud/InsertBaseStatement.java   |   7 +
 .../plan/parser/StatementGeneratorTest.java        | 152 +++++++++++++++++++++
 4 files changed, 167 insertions(+), 7 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/StatementGenerator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/StatementGenerator.java
index 37441d0ce43..ed1cfc5b1bf 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/StatementGenerator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/StatementGenerator.java
@@ -101,6 +101,7 @@ import 
org.apache.tsfile.file.metadata.enums.CompressionType;
 import org.apache.tsfile.file.metadata.enums.TSEncoding;
 import org.apache.tsfile.utils.ReadWriteIOUtils;
 import org.apache.tsfile.utils.TimeDuration;
+import org.apache.tsfile.write.record.Tablet.ColumnType;
 
 import java.nio.ByteBuffer;
 import java.time.ZoneId;
@@ -110,11 +111,8 @@ import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import org.apache.tsfile.write.record.Tablet.ColumnType;
 
-/**
- * Convert SQL and RPC requests to {@link Statement}.
- */
+/** Convert SQL and RPC requests to {@link Statement}. */
 public class StatementGenerator {
 
   private static final PerformanceOverviewMetrics PERFORMANCE_OVERVIEW_METRICS 
=
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableHeaderSchemaValidator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableHeaderSchemaValidator.java
index dfd4a5febe9..cef7ad3a799 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableHeaderSchemaValidator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableHeaderSchemaValidator.java
@@ -122,15 +122,18 @@ public class TableHeaderSchemaValidator {
           // check and validate column data type and category
           if (!columnSchema.getType().equals(UnknownType.UNKNOWN)
               && !TypeFactory.getType(existingColumn.getDataType())
-              .equals(columnSchema.getType())) {
+                  .equals(columnSchema.getType())) {
             throw new SemanticException(
                 String.format("Wrong data type at column %s.", 
columnSchema.getName()));
           }
           if (columnSchema.getColumnCategory() != null
               && 
!existingColumn.getColumnCategory().equals(columnSchema.getColumnCategory())) {
             throw new SemanticException(
-                String.format("Wrong category at column %s : %s/%s", 
columnSchema.getName(),
-                    columnSchema.getColumnCategory(), 
existingColumn.getColumnCategory()));
+                String.format(
+                    "Wrong category at column %s : %s/%s",
+                    columnSchema.getName(),
+                    columnSchema.getColumnCategory(),
+                    existingColumn.getColumnCategory()));
           }
         }
       }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/crud/InsertBaseStatement.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/crud/InsertBaseStatement.java
index 84b7e7a2ef2..a7dc15dab53 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/crud/InsertBaseStatement.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/crud/InsertBaseStatement.java
@@ -433,6 +433,10 @@ public abstract class InsertBaseStatement extends 
Statement {
   }
 
   public void insertColumn(int pos, ColumnSchema columnSchema) {
+    if (pos < 0 || pos > measurements.length) {
+      throw new ArrayIndexOutOfBoundsException(pos);
+    }
+
     if (measurementSchemas != null) {
       MeasurementSchema[] tmp = new 
MeasurementSchema[measurementSchemas.length + 1];
       System.arraycopy(measurementSchemas, 0, tmp, 0, pos);
@@ -464,6 +468,9 @@ public abstract class InsertBaseStatement extends Statement 
{
   }
 
   public void swapColumn(int src, int target) {
+    if (src < 0 || src >= measurements.length || target < 0 || target >= 
measurements.length) {
+      throw new ArrayIndexOutOfBoundsException(src + "/" + target);
+    }
     if (measurementSchemas != null) {
       CommonUtils.swapArray(measurementSchemas, src, target);
     }
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/parser/StatementGeneratorTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/parser/StatementGeneratorTest.java
index ec152ba06bd..1a75ab49d5b 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/parser/StatementGeneratorTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/parser/StatementGeneratorTest.java
@@ -34,7 +34,10 @@ import 
org.apache.iotdb.db.queryengine.plan.expression.leaf.ConstantOperand;
 import org.apache.iotdb.db.queryengine.plan.expression.leaf.TimeSeriesOperand;
 import org.apache.iotdb.db.queryengine.plan.expression.leaf.TimestampOperand;
 import 
org.apache.iotdb.db.queryengine.plan.expression.multi.FunctionExpression;
+import org.apache.iotdb.db.queryengine.plan.relational.metadata.ColumnSchema;
+import 
org.apache.iotdb.db.queryengine.plan.relational.type.InternalTypeManager;
 import org.apache.iotdb.db.queryengine.plan.statement.Statement;
+import org.apache.iotdb.db.queryengine.plan.statement.StatementTestUtils;
 import org.apache.iotdb.db.queryengine.plan.statement.StatementType;
 import org.apache.iotdb.db.queryengine.plan.statement.component.ResultColumn;
 import org.apache.iotdb.db.queryengine.plan.statement.crud.DeleteDataStatement;
@@ -82,6 +85,8 @@ import org.apache.iotdb.session.template.MeasurementNode;
 import org.apache.tsfile.enums.TSDataType;
 import org.apache.tsfile.file.metadata.enums.CompressionType;
 import org.apache.tsfile.file.metadata.enums.TSEncoding;
+import org.apache.tsfile.read.common.type.TypeFactory;
+import org.apache.tsfile.utils.BitMap;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -100,8 +105,10 @@ import java.util.stream.Collectors;
 
 import static 
org.apache.iotdb.db.schemaengine.template.TemplateQueryType.SHOW_MEASUREMENTS;
 import static org.apache.tsfile.file.metadata.enums.CompressionType.SNAPPY;
+import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertThrows;
 import static org.junit.Assert.assertTrue;
 
@@ -229,6 +236,150 @@ public class StatementGeneratorTest {
     assertTrue(statement.isWriteToTable());
   }
 
+  @Test
+  public void testTabletInsertColumn() {
+    final InsertTabletStatement insertTabletStatement =
+        StatementTestUtils.genInsertTabletStatement(false);
+    // insert at head
+    int insertPos = 0;
+
+    ColumnSchema columnSchema =
+        new ColumnSchema(
+            "s1", TypeFactory.getType(TSDataType.STRING), false, 
TsTableColumnCategory.ID);
+    insertTabletStatement.insertColumn(insertPos, columnSchema);
+    assertEquals(4, insertTabletStatement.getMeasurements().length);
+    assertEquals(columnSchema.getName(), 
insertTabletStatement.getMeasurements()[insertPos]);
+    assertEquals(
+        InternalTypeManager.getTSDataType(columnSchema.getType()),
+        insertTabletStatement.getDataType(insertPos));
+    assertEquals(
+        columnSchema.getColumnCategory(), 
insertTabletStatement.getColumnCategories()[insertPos]);
+    final Object[] column1 = (Object[]) 
insertTabletStatement.getColumns()[insertPos];
+    for (Object o : column1) {
+      assertNull(o);
+    }
+
+    // insert at middle
+    insertPos = 2;
+    columnSchema =
+        new ColumnSchema(
+            "s2", TypeFactory.getType(TSDataType.INT64), false, 
TsTableColumnCategory.ATTRIBUTE);
+    insertTabletStatement.insertColumn(insertPos, columnSchema);
+    assertEquals(5, insertTabletStatement.getMeasurements().length);
+    assertEquals(columnSchema.getName(), 
insertTabletStatement.getMeasurements()[insertPos]);
+    assertEquals(
+        InternalTypeManager.getTSDataType(columnSchema.getType()),
+        insertTabletStatement.getDataType(insertPos));
+    assertEquals(
+        columnSchema.getColumnCategory(), 
insertTabletStatement.getColumnCategories()[insertPos]);
+    final long[] column2 = (long[]) 
insertTabletStatement.getColumns()[insertPos];
+    for (long o : column2) {
+      assertEquals(0, o);
+    }
+
+    // insert at last
+    insertPos = 5;
+    columnSchema =
+        new ColumnSchema(
+            "s3",
+            TypeFactory.getType(TSDataType.BOOLEAN),
+            false,
+            TsTableColumnCategory.MEASUREMENT);
+    insertTabletStatement.insertColumn(insertPos, columnSchema);
+    assertEquals(6, insertTabletStatement.getMeasurements().length);
+    assertEquals(columnSchema.getName(), 
insertTabletStatement.getMeasurements()[insertPos]);
+    assertEquals(
+        InternalTypeManager.getTSDataType(columnSchema.getType()),
+        insertTabletStatement.getDataType(insertPos));
+    assertEquals(
+        columnSchema.getColumnCategory(), 
insertTabletStatement.getColumnCategories()[insertPos]);
+    final boolean[] column3 = (boolean[]) 
insertTabletStatement.getColumns()[insertPos];
+    for (boolean o : column3) {
+      assertFalse(o);
+    }
+
+    // illegal insertion
+    ColumnSchema finalColumnSchema = columnSchema;
+    assertThrows(
+        ArrayIndexOutOfBoundsException.class,
+        () -> insertTabletStatement.insertColumn(-1, finalColumnSchema));
+    assertThrows(
+        ArrayIndexOutOfBoundsException.class,
+        () -> insertTabletStatement.insertColumn(7, finalColumnSchema));
+  }
+
+  @Test
+  public void testInsertTabletSwapColumn() {
+    final String[] columnNames = StatementTestUtils.genColumnNames();
+    final Object[] columns = StatementTestUtils.genColumns();
+    final TSDataType[] tsDataTypes = StatementTestUtils.genDataTypes();
+    final TsTableColumnCategory[] columnCategories = 
StatementTestUtils.genColumnCategories();
+
+    final InsertTabletStatement insertTabletStatement =
+        StatementTestUtils.genInsertTabletStatement(false);
+    BitMap[] bitMaps = new BitMap[columnNames.length];
+    for (int i = 0; i < bitMaps.length; i++) {
+      bitMaps[i] = new BitMap(3);
+      bitMaps[i].mark(i);
+    }
+    insertTabletStatement.setBitMaps(bitMaps);
+
+    // [0, 1, 2] -> [2, 1, 0]
+    insertTabletStatement.swapColumn(0, 2);
+    assertEquals(3, insertTabletStatement.getMeasurements().length);
+    assertEquals(columnNames[0], insertTabletStatement.getMeasurements()[2]);
+    assertEquals(columnNames[2], insertTabletStatement.getMeasurements()[0]);
+    assertEquals(tsDataTypes[0], insertTabletStatement.getDataType(2));
+    assertEquals(tsDataTypes[2], insertTabletStatement.getDataType(0));
+    assertEquals(columnCategories[0], 
insertTabletStatement.getColumnCategories()[2]);
+    assertEquals(columnCategories[2], 
insertTabletStatement.getColumnCategories()[0]);
+    assertArrayEquals(
+        ((double[]) columns[2]), ((double[]) 
insertTabletStatement.getColumns()[0]), 0.0001);
+    assertArrayEquals(((String[]) columns[0]), ((String[]) 
insertTabletStatement.getColumns()[2]));
+    assertTrue(insertTabletStatement.getBitMaps()[0].isMarked(2));
+    assertTrue(insertTabletStatement.getBitMaps()[2].isMarked(0));
+
+    // [2, 1, 0] -> [1, 2, 0]
+    insertTabletStatement.swapColumn(0, 1);
+    assertEquals(3, insertTabletStatement.getMeasurements().length);
+    assertEquals(columnNames[1], insertTabletStatement.getMeasurements()[0]);
+    assertEquals(columnNames[2], insertTabletStatement.getMeasurements()[1]);
+    assertEquals(tsDataTypes[1], insertTabletStatement.getDataType(0));
+    assertEquals(tsDataTypes[2], insertTabletStatement.getDataType(1));
+    assertEquals(columnCategories[1], 
insertTabletStatement.getColumnCategories()[0]);
+    assertEquals(columnCategories[2], 
insertTabletStatement.getColumnCategories()[1]);
+    assertArrayEquals(((String[]) columns[1]), ((String[]) 
insertTabletStatement.getColumns()[0]));
+    assertArrayEquals(
+        ((double[]) columns[2]), ((double[]) 
insertTabletStatement.getColumns()[1]), 0.0001);
+    assertTrue(insertTabletStatement.getBitMaps()[0].isMarked(1));
+    assertTrue(insertTabletStatement.getBitMaps()[1].isMarked(2));
+
+    // [1, 2, 0] -> [1, 2, 0]
+    insertTabletStatement.swapColumn(1, 1);
+    assertEquals(3, insertTabletStatement.getMeasurements().length);
+    assertEquals(columnNames[1], insertTabletStatement.getMeasurements()[0]);
+    assertEquals(columnNames[2], insertTabletStatement.getMeasurements()[1]);
+    assertEquals(tsDataTypes[1], insertTabletStatement.getDataType(0));
+    assertEquals(tsDataTypes[2], insertTabletStatement.getDataType(1));
+    assertEquals(columnCategories[1], 
insertTabletStatement.getColumnCategories()[0]);
+    assertEquals(columnCategories[2], 
insertTabletStatement.getColumnCategories()[1]);
+    assertArrayEquals(((String[]) columns[1]), ((String[]) 
insertTabletStatement.getColumns()[0]));
+    assertArrayEquals(
+        ((double[]) columns[2]), ((double[]) 
insertTabletStatement.getColumns()[1]), 0.0001);
+    assertTrue(insertTabletStatement.getBitMaps()[0].isMarked(1));
+    assertTrue(insertTabletStatement.getBitMaps()[1].isMarked(2));
+
+    // illegal
+    assertThrows(
+        ArrayIndexOutOfBoundsException.class, () -> 
insertTabletStatement.swapColumn(-1, 1));
+    assertThrows(
+        ArrayIndexOutOfBoundsException.class, () -> 
insertTabletStatement.swapColumn(3, 1));
+    assertThrows(
+        ArrayIndexOutOfBoundsException.class, () -> 
insertTabletStatement.swapColumn(1, -1));
+    assertThrows(
+        ArrayIndexOutOfBoundsException.class, () -> 
insertTabletStatement.swapColumn(1, 3));
+  }
+
   @Test
   public void testInsertTablets() throws IllegalPathException {
     TSInsertTabletsReq req =
@@ -529,6 +680,7 @@ public class StatementGeneratorTest {
 
   @FunctionalInterface
   interface grantRevokeCheck {
+
     void checkParser(String privilege, String name, boolean isuser, String 
path, boolean grantOpt);
   }
 

Reply via email to