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 c1027990b78 adding test for insertRow in analyzer
c1027990b78 is described below

commit c1027990b7838869c00d70bf6d6f99b29bf8b9f9
Author: Tian Jiang <[email protected]>
AuthorDate: Mon Jul 8 11:06:38 2024 +0800

    adding test for insertRow in analyzer
---
 .../relational/analyzer/StatementAnalyzer.java     |   2 +-
 .../plan/relational/analyzer/AnalyzerTest.java     | 193 +++++++++++++--------
 .../plan/statement/StatementTestUtils.java         |  31 ++++
 3 files changed, 153 insertions(+), 73 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/StatementAnalyzer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/StatementAnalyzer.java
index dab50e52423..4e22b1016d4 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/StatementAnalyzer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/StatementAnalyzer.java
@@ -377,7 +377,7 @@ public class StatementAnalyzer {
       return visitInsert(insert, scope);
     }
 
-    protected Scope visitInsert(WrappedInsertStatement insert, Optional<Scope> 
scope) {
+    private Scope visitInsert(WrappedInsertStatement insert, Optional<Scope> 
scope) {
       final Scope ret = Scope.create();
 
       final MPPQueryContext context = insert.getContext();
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AnalyzerTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AnalyzerTest.java
index ed02e45b014..eccd095b97f 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AnalyzerTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AnalyzerTest.java
@@ -37,6 +37,7 @@ import 
org.apache.iotdb.db.queryengine.execution.warnings.WarningCollector;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.DistributedQueryPlan;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.LogicalQueryPlan;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNode;
+import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.RelationalInsertRowNode;
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.RelationalInsertTabletNode;
 import org.apache.iotdb.db.queryengine.plan.relational.function.OperatorType;
 import org.apache.iotdb.db.queryengine.plan.relational.metadata.ColumnHandle;
@@ -60,6 +61,7 @@ import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.LogicalExpression
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Statement;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.parser.SqlParser;
 import org.apache.iotdb.db.queryengine.plan.statement.StatementTestUtils;
+import org.apache.iotdb.db.queryengine.plan.statement.crud.InsertRowStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.crud.InsertTabletStatement;
 
 import org.apache.tsfile.file.metadata.IDeviceID.Factory;
@@ -658,79 +660,82 @@ public class AnalyzerTest {
     rootNode = logicalQueryPlan.getRootNode();
   }
 
-  @Test
-  public void analyzeTablet() {
-
-    TableSchema tableSchema = StatementTestUtils.genTableSchema();
-    Metadata mockMetadata =
-        new TestMatadata() {
-          @Override
-          public TableSchema validateTableHeaderSchema(
-              String database, TableSchema schema, MPPQueryContext context) {
-            assertEquals(tableSchema, schema);
-            return tableSchema;
-          }
-
-          @Override
-          public void validateDeviceSchema(
-              ITableDeviceSchemaValidation schemaValidation, MPPQueryContext 
context) {
-            assertEquals(sessionInfo.getDatabaseName().get(), 
schemaValidation.getDatabase());
-            assertEquals(StatementTestUtils.tableName(), 
schemaValidation.getTableName());
-            Object[] columns = StatementTestUtils.genColumns();
-            for (int i = 0; i < schemaValidation.getDeviceIdList().size(); 
i++) {
-              Object[] objects = schemaValidation.getDeviceIdList().get(i);
-              assertEquals(objects[0].toString(), 
StatementTestUtils.tableName());
-              assertEquals(objects[1].toString(), ((String[]) columns[0])[i]);
-            }
-            List<String> attributeColumnNameList = 
schemaValidation.getAttributeColumnNameList();
-            assertEquals(Collections.singletonList("attr1"), 
attributeColumnNameList);
-            assertEquals(1, schemaValidation.getAttributeValueList().size());
-            assertArrayEquals(
-                (Object[]) columns[1], 
schemaValidation.getAttributeValueList().get(0));
+  private Metadata mockMetadataForInsertion() {
+    return new TestMatadata() {
+      @Override
+      public TableSchema validateTableHeaderSchema(
+          String database, TableSchema schema, MPPQueryContext context) {
+        TableSchema tableSchema = StatementTestUtils.genTableSchema();
+        assertEquals(tableSchema, schema);
+        return tableSchema;
+      }
+
+      @Override
+      public void validateDeviceSchema(
+          ITableDeviceSchemaValidation schemaValidation, MPPQueryContext 
context) {
+        assertEquals(sessionInfo.getDatabaseName().get(), 
schemaValidation.getDatabase());
+        assertEquals(StatementTestUtils.tableName(), 
schemaValidation.getTableName());
+        Object[] columns = StatementTestUtils.genColumns();
+        for (int i = 0; i < schemaValidation.getDeviceIdList().size(); i++) {
+          Object[] objects = schemaValidation.getDeviceIdList().get(i);
+          assertEquals(objects[0].toString(), StatementTestUtils.tableName());
+          assertEquals(objects[1].toString(), ((String[]) columns[0])[i]);
+        }
+        List<String> attributeColumnNameList = 
schemaValidation.getAttributeColumnNameList();
+        assertEquals(Collections.singletonList("attr1"), 
attributeColumnNameList);
+        assertEquals(1, schemaValidation.getAttributeValueList().size());
+        for (int i = 0; i < schemaValidation.getAttributeValueList().size(); 
i++) {
+          assertEquals(
+              ((Object[]) columns[1])[i], ((Object[]) 
schemaValidation.getAttributeValueList().get(0))[i]);
+        }
+      }
+
+      @Override
+      public DataPartition getOrCreateDataPartition(
+          List<DataPartitionQueryParam> dataPartitionQueryParams, String 
userName) {
+        int seriesSlotNum = 1000;
+        String partitionExecutorName =
+            
"org.apache.iotdb.commons.partition.executor.hash.BKDRHashExecutor";
+        SeriesPartitionExecutor seriesPartitionExecutor =
+            SeriesPartitionExecutor.getSeriesPartitionExecutor(
+                partitionExecutorName, seriesSlotNum);
+
+        Map<String, Map<TSeriesPartitionSlot, Map<TTimePartitionSlot, 
List<TRegionReplicaSet>>>>
+            dataPartitionMap = new HashMap<>();
+
+        for (DataPartitionQueryParam dataPartitionQueryParam : 
dataPartitionQueryParams) {
+          String databaseName = dataPartitionQueryParam.getDatabaseName();
+          assertEquals(sessionInfo.getDatabaseName().get(), databaseName);
+
+          String tableName = 
dataPartitionQueryParam.getDeviceID().getTableName();
+          assertEquals(StatementTestUtils.tableName(), tableName);
+
+          TSeriesPartitionSlot partitionSlot =
+              seriesPartitionExecutor.getSeriesPartitionSlot(
+                  dataPartitionQueryParam.getDeviceID());
+          for (TTimePartitionSlot tTimePartitionSlot :
+              dataPartitionQueryParam.getTimePartitionSlotList()) {
+            dataPartitionMap
+                .computeIfAbsent(databaseName, d -> new HashMap<>())
+                .computeIfAbsent(partitionSlot, slot -> new HashMap<>())
+                .computeIfAbsent(tTimePartitionSlot, slot -> new ArrayList<>())
+                .add(
+                    new TRegionReplicaSet(
+                        new TConsensusGroupId(
+                            TConsensusGroupType.DataRegion, 
partitionSlot.slotId),
+                        Collections.singletonList(
+                            new TDataNodeLocation(
+                                partitionSlot.slotId, null, null, null, null, 
null))));
           }
+        }
+        return new DataPartition(dataPartitionMap, partitionExecutorName, 
seriesSlotNum);
+      }
+    };
+  }
 
-          @Override
-          public DataPartition getOrCreateDataPartition(
-              List<DataPartitionQueryParam> dataPartitionQueryParams, String 
userName) {
-            int seriesSlotNum = 1000;
-            String partitionExecutorName =
-                
"org.apache.iotdb.commons.partition.executor.hash.BKDRHashExecutor";
-            SeriesPartitionExecutor seriesPartitionExecutor =
-                SeriesPartitionExecutor.getSeriesPartitionExecutor(
-                    partitionExecutorName, seriesSlotNum);
-
-            Map<String, Map<TSeriesPartitionSlot, Map<TTimePartitionSlot, 
List<TRegionReplicaSet>>>>
-                dataPartitionMap = new HashMap<>();
-            assertEquals(3, dataPartitionQueryParams.size());
-
-            for (DataPartitionQueryParam dataPartitionQueryParam : 
dataPartitionQueryParams) {
-              String databaseName = dataPartitionQueryParam.getDatabaseName();
-              assertEquals(sessionInfo.getDatabaseName().get(), databaseName);
-
-              String tableName = 
dataPartitionQueryParam.getDeviceID().getTableName();
-              assertEquals(StatementTestUtils.tableName(), tableName);
-
-              TSeriesPartitionSlot partitionSlot =
-                  seriesPartitionExecutor.getSeriesPartitionSlot(
-                      dataPartitionQueryParam.getDeviceID());
-              for (TTimePartitionSlot tTimePartitionSlot :
-                  dataPartitionQueryParam.getTimePartitionSlotList()) {
-                dataPartitionMap
-                    .computeIfAbsent(databaseName, d -> new HashMap<>())
-                    .computeIfAbsent(partitionSlot, slot -> new HashMap<>())
-                    .computeIfAbsent(tTimePartitionSlot, slot -> new 
ArrayList<>())
-                    .add(
-                        new TRegionReplicaSet(
-                            new TConsensusGroupId(
-                                TConsensusGroupType.DataRegion, 
partitionSlot.slotId),
-                            Collections.singletonList(
-                                new TDataNodeLocation(
-                                    partitionSlot.slotId, null, null, null, 
null, null))));
-              }
-            }
-            return new DataPartition(dataPartitionMap, partitionExecutorName, 
seriesSlotNum);
-          }
-        };
+  @Test
+  public void analyzeInsertTablet() {
+    Metadata mockMetadata = mockMetadataForInsertion();
 
     InsertTabletStatement insertTabletStatement = 
StatementTestUtils.genInsertTabletStatement(true);
     context = new MPPQueryContext("", queryId, sessionInfo, null, null);
@@ -740,6 +745,11 @@ public class AnalyzerTest {
             mockMetadata,
             new SqlParser(),
             sessionInfo);
+    assertEquals(1, 
actualAnalysis.getDataPartition().getDataPartitionMap().size());
+    Map<TSeriesPartitionSlot, Map<TTimePartitionSlot, 
List<TRegionReplicaSet>>> partitionSlotMapMap = 
actualAnalysis.getDataPartition()
+        .getDataPartitionMap().get(sessionInfo.getDatabaseName().orElse(null));
+    assertEquals(3, partitionSlotMapMap.size());
+
     logicalQueryPlan =
         new LogicalPlanner(context, mockMetadata, sessionInfo, 
WarningCollector.NOOP)
             .plan(actualAnalysis);
@@ -756,7 +766,7 @@ public class AnalyzerTest {
               new String[] {StatementTestUtils.tableName(), ((String[]) 
columns[0])[i]}),
           insertTabletNode.getDeviceID(i));
     }
-    assertEquals(columns, insertTabletNode.getColumns());
+    assertArrayEquals(columns, insertTabletNode.getColumns());
     assertArrayEquals(StatementTestUtils.genTimestamps(), 
insertTabletNode.getTimes());
 
     distributionPlanner = new TableDistributionPlanner(actualAnalysis, 
logicalQueryPlan, context);
@@ -764,6 +774,45 @@ public class AnalyzerTest {
     assertEquals(3, distributedQueryPlan.getInstances().size());
   }
 
+  @Test
+  public void analyzeInsertRow() {
+    Metadata mockMetadata = mockMetadataForInsertion();
+
+    InsertRowStatement insertStatement = 
StatementTestUtils.genInsertRowStatement(true);
+    context = new MPPQueryContext("", queryId, sessionInfo, null, null);
+    actualAnalysis =
+        analyzeStatement(
+            insertStatement.toRelationalStatement(context),
+            mockMetadata,
+            new SqlParser(),
+            sessionInfo);
+    assertEquals(1, 
actualAnalysis.getDataPartition().getDataPartitionMap().size());
+    Map<TSeriesPartitionSlot, Map<TTimePartitionSlot, 
List<TRegionReplicaSet>>> partitionSlotMapMap = 
actualAnalysis.getDataPartition()
+        .getDataPartitionMap().get(sessionInfo.getDatabaseName().orElse(null));
+    assertEquals(1, partitionSlotMapMap.size());
+
+    logicalQueryPlan =
+        new LogicalPlanner(context, mockMetadata, sessionInfo, 
WarningCollector.NOOP)
+            .plan(actualAnalysis);
+
+    RelationalInsertRowNode insertNode =
+        (RelationalInsertRowNode) logicalQueryPlan.getRootNode();
+
+    assertEquals(insertNode.getTableName(), StatementTestUtils.tableName());
+    Object[] columns = StatementTestUtils.genValues(0);
+    assertEquals(
+        Factory.DEFAULT_FACTORY.create(
+            new String[] {StatementTestUtils.tableName(), ((String) 
columns[0])}),
+        insertNode.getDeviceID());
+
+    assertArrayEquals(columns, insertNode.getValues());
+    assertEquals(StatementTestUtils.genTimestamps()[0], insertNode.getTime());
+
+    distributionPlanner = new TableDistributionPlanner(actualAnalysis, 
logicalQueryPlan, context);
+    distributedQueryPlan = distributionPlanner.plan();
+    assertEquals(1, distributedQueryPlan.getInstances().size());
+  }
+
   public static Analysis analyzeSQL(String sql, Metadata metadata) {
     SqlParser sqlParser = new SqlParser();
     Statement statement = sqlParser.createStatement(sql, 
ZoneId.systemDefault());
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/statement/StatementTestUtils.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/statement/StatementTestUtils.java
index 284b81eae6f..8e27e3e8cab 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/statement/StatementTestUtils.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/statement/StatementTestUtils.java
@@ -29,6 +29,7 @@ import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNodeId;
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.RelationalInsertTabletNode;
 import org.apache.iotdb.db.queryengine.plan.relational.metadata.ColumnSchema;
 import org.apache.iotdb.db.queryengine.plan.relational.metadata.TableSchema;
+import org.apache.iotdb.db.queryengine.plan.statement.crud.InsertRowStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.crud.InsertTabletStatement;
 
 import org.apache.tsfile.enums.TSDataType;
@@ -107,6 +108,10 @@ public class StatementTestUtils {
     return new Object[] {ids, attrs, values};
   }
 
+  public static Object[] genValues(int offset) {
+    return new Object[] {"id:" + offset, "attr:" + offset, offset * 1.0};
+  }
+
   public static long[] genTimestamps() {
     return genTimestamps(3, 0);
   }
@@ -119,6 +124,27 @@ public class StatementTestUtils {
     return timestamps;
   }
 
+  public static InsertRowStatement genInsertRowStatement(
+      boolean writeToTable, int offset) {
+    String[] measurements = genColumnNames();
+    TSDataType[] dataTypes = genDataTypes();
+    TsTableColumnCategory[] columnCategories = genColumnCategories();
+
+    Object[] values = genValues(offset);
+    long[] timestamps = genTimestamps(1, offset);
+
+    InsertRowStatement insertStatement = new InsertRowStatement();
+    insertStatement.setDevicePath(new PartialPath(new String[] {tableName()}));
+    insertStatement.setMeasurements(measurements);
+    insertStatement.setDataTypes(dataTypes);
+    insertStatement.setColumnCategories(columnCategories);
+    insertStatement.setValues(values);
+    insertStatement.setTime(timestamps[0]);
+    insertStatement.setWriteToTable(writeToTable);
+
+    return insertStatement;
+  }
+
   public static InsertTabletStatement genInsertTabletStatement(
       boolean writeToTable, int rowCnt, int offset) {
     String[] measurements = genColumnNames();
@@ -164,10 +190,15 @@ public class StatementTestUtils {
         columnCategories);
   }
 
+
   public static InsertTabletStatement genInsertTabletStatement(boolean 
writeToTable) {
     return genInsertTabletStatement(writeToTable, 3, 0);
   }
 
+  public static InsertRowStatement genInsertRowStatement(boolean writeToTable) 
{
+    return genInsertRowStatement(writeToTable, 0);
+  }
+
   public static TsTable genTsTable() {
     final TsTable tsTable = new TsTable(tableName());
     String[] measurements = genColumnNames();

Reply via email to