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();