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
commit 2b282e7b0fdcd574c76ac1fee2fc2ea971db64b4 Author: jt2594838 <[email protected]> AuthorDate: Tue Jun 11 19:34:12 2024 +0800 finish analyze --- .../db/queryengine/plan/analyze/Analysis.java | 6 +- .../db/queryengine/plan/analyze/AnalyzeUtils.java | 61 +++++++-- .../queryengine/plan/analyze/AnalyzeVisitor.java | 150 +++++++++------------ .../db/queryengine/plan/analyze/IAnalysis.java | 15 +++ .../plan/analyze/LoadTsfileAnalyzer.java | 2 +- .../memory/StatementMemorySourceVisitor.java | 2 +- .../plan/optimization/AggregationPushDown.java | 2 +- .../plan/optimization/ColumnInjectionPushDown.java | 2 +- .../plan/optimization/LimitOffsetPushDown.java | 2 +- .../OrderByExpressionWithLimitChangeToTopK.java | 2 +- .../plan/optimization/PredicatePushDown.java | 2 +- .../queryengine/plan/planner/LogicalPlanner.java | 2 +- .../queryengine/plan/planner/TreeModelPlanner.java | 6 +- .../planner/distribution/DistributionPlanner.java | 10 +- .../SimpleFragmentParallelPlanner.java | 14 +- .../planner/plan/node/load/LoadTsFileNode.java | 6 +- .../plan/relational/analyzer/Analysis.java | 2 +- .../relational/analyzer/StatementAnalyzer.java | 36 +---- .../plan/relational/metadata/Metadata.java | 15 +++ .../plan/relational/planner/LogicalPlanner.java | 2 +- .../distribute/FragmentInstanceGenerator.java | 2 +- .../distribute/TableDistributionPlanner.java | 2 +- .../db/queryengine/plan/analyze/AnalyzeTest.java | 2 +- .../plan/optimization/OptimizationTestUtil.java | 4 +- .../plan/planner/distribution/Util.java | 4 +- .../plan/planner/distribution/Util2.java | 4 +- .../planner/logical/LogicalPlannerTestUtil.java | 2 +- 27 files changed, 189 insertions(+), 170 deletions(-) diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/Analysis.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/Analysis.java index cb383edd45b..23caac86c1d 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/Analysis.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/Analysis.java @@ -370,11 +370,11 @@ public class Analysis implements IAnalysis { return (QueryStatement) statement; } - public Statement getStatement() { + public Statement getTreeStatement() { return statement; } - public void setStatement(Statement statement) { + public void setTreeStatement(Statement statement) { this.statement = statement; } @@ -469,7 +469,7 @@ public class Analysis implements IAnalysis { public TsBlock constructResultForMemorySource(MPPQueryContext context) { StatementMemorySource memorySource = new StatementMemorySourceVisitor() - .process(getStatement(), new StatementMemorySourceContext(context, this)); + .process(getTreeStatement(), new StatementMemorySourceContext(context, this)); setRespDatasetHeader(memorySource.getDatasetHeader()); return memorySource.getTsBlock(); } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeUtils.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeUtils.java index af861730016..df3a795f1b1 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeUtils.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeUtils.java @@ -33,7 +33,6 @@ import org.apache.iotdb.commons.partition.DataPartitionQueryParam; import org.apache.iotdb.commons.service.metric.PerformanceOverviewMetrics; import org.apache.iotdb.db.exception.sql.SemanticException; import org.apache.iotdb.db.queryengine.common.MPPQueryContext; -import org.apache.iotdb.db.queryengine.plan.analyze.schema.ISchemaFetcher; import org.apache.iotdb.db.queryengine.plan.statement.crud.InsertBaseStatement; import org.apache.iotdb.db.queryengine.plan.statement.crud.InsertMultiTabletsStatement; import org.apache.iotdb.db.queryengine.plan.statement.crud.InsertRowStatement; @@ -54,6 +53,41 @@ public class AnalyzeUtils { // util class } + public static IAnalysis analyzeInsert(MPPQueryContext context, + InsertBaseStatement insertBaseStatement, Runnable schemaValidation, + DataPartitionQueryFunc partitionFetcher) { + context.setQueryType(QueryType.WRITE); + insertBaseStatement.semanticCheck(); + IAnalysis analysis = new org.apache.iotdb.db.queryengine.plan.analyze.Analysis(); + validateSchema(analysis, insertBaseStatement, + schemaValidation); + InsertBaseStatement realStatement = removeLogicalView(analysis, insertBaseStatement); + if (analysis.isFinishQueryAfterAnalyze()) { + return analysis; + } + analysis.setTreeStatement(realStatement); + + if (realStatement instanceof InsertTabletStatement) { + InsertTabletStatement realInsertTabletStatement = (InsertTabletStatement) realStatement; + DataPartitionQueryParam dataPartitionQueryParam = new DataPartitionQueryParam(); + dataPartitionQueryParam.setDevicePath( + realInsertTabletStatement.getDevicePath().getFullPath()); + dataPartitionQueryParam.setTimePartitionSlotList( + realInsertTabletStatement.getTimePartitionSlots()); + + analysis = getAnalysisForWriting( + analysis, + Collections.singletonList(dataPartitionQueryParam), + context.getSession().getUserName(), partitionFetcher); + } else { + analysis = computeAnalysisForMultiTablets( + analysis, + (InsertMultiTabletsStatement) realStatement, + context.getSession().getUserName(), partitionFetcher); + } + return analysis; + } + public static void validateSchema( IAnalysis analysis, InsertBaseStatement insertStatement, Runnable schemaValidation) { @@ -103,12 +137,12 @@ public class AnalyzeUtils { } /** get analysis according to statement and params */ - public static Analysis getAnalysisForWriting( - Analysis analysis, List<DataPartitionQueryParam> dataPartitionQueryParams, String userName, - IPartitionFetcher partitionFetcher) { + public static IAnalysis getAnalysisForWriting( + IAnalysis analysis, List<DataPartitionQueryParam> dataPartitionQueryParams, String userName, + DataPartitionQueryFunc partitionQueryFunc) { DataPartition dataPartition = - partitionFetcher.getOrCreateDataPartition(dataPartitionQueryParams, userName); + partitionQueryFunc.queryDataPartition(dataPartitionQueryParams, userName); if (dataPartition.isEmpty()) { analysis.setFinishQueryAfterAnalyze(true); analysis.setFailStatus( @@ -121,9 +155,9 @@ public class AnalyzeUtils { return analysis; } - public static Analysis computeAnalysisForInsertRows( - Analysis analysis, InsertRowsStatement insertRowsStatement, String userName, - IPartitionFetcher partitionFetcher) { + public static IAnalysis computeAnalysisForInsertRows( + IAnalysis analysis, InsertRowsStatement insertRowsStatement, String userName, + DataPartitionQueryFunc partitionFetcher) { Map<String, Set<TTimePartitionSlot>> dataPartitionQueryParamMap = new HashMap<>(); for (InsertRowStatement insertRowStatement : insertRowsStatement.getInsertRowStatementList()) { Set<TTimePartitionSlot> timePartitionSlotSet = @@ -143,9 +177,9 @@ public class AnalyzeUtils { return getAnalysisForWriting(analysis, dataPartitionQueryParams, userName, partitionFetcher); } - public static Analysis computeAnalysisForMultiTablets( - Analysis analysis, InsertMultiTabletsStatement insertMultiTabletsStatement, String userName - , IPartitionFetcher partitionFetcher) { + public static IAnalysis computeAnalysisForMultiTablets( + IAnalysis analysis, InsertMultiTabletsStatement insertMultiTabletsStatement, String userName + , DataPartitionQueryFunc partitionFetcher) { Map<String, Set<TTimePartitionSlot>> dataPartitionQueryParamMap = new HashMap<>(); for (InsertTabletStatement insertTabletStatement : insertMultiTabletsStatement.getInsertTabletStatementList()) { @@ -165,4 +199,9 @@ public class AnalyzeUtils { return getAnalysisForWriting(analysis, dataPartitionQueryParams, userName, partitionFetcher); } + + public interface DataPartitionQueryFunc { + DataPartition queryDataPartition(List<DataPartitionQueryParam> dataPartitionQueryParams, + String userName); + } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java index af95e958a8c..b63ea6ddc1e 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java @@ -206,7 +206,7 @@ import static org.apache.iotdb.db.schemaengine.schemaregion.view.visitor.GetSour import static org.apache.iotdb.db.utils.constant.SqlConstant.COUNT_TIME_HEADER; /** This visitor is used to analyze each type of Statement and returns the {@link Analysis}. */ -public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> { +public class AnalyzeVisitor extends StatementVisitor<IAnalysis, MPPQueryContext> { private static final Logger logger = LoggerFactory.getLogger(AnalyzeVisitor.class); @@ -241,7 +241,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> @Override public Analysis visitExplain(ExplainStatement explainStatement, MPPQueryContext context) { Analysis analysis = visitQuery(explainStatement.getQueryStatement(), context); - analysis.setStatement(explainStatement); + analysis.setTreeStatement(explainStatement); analysis.setFinishQueryAfterAnalyze(true); return analysis; } @@ -251,7 +251,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> ExplainAnalyzeStatement explainAnalyzeStatement, MPPQueryContext context) { Analysis analysis = visitQuery(explainAnalyzeStatement.getQueryStatement(), context); context.setExplainAnalyze(true); - analysis.setStatement(explainAnalyzeStatement); + analysis.setTreeStatement(explainAnalyzeStatement); analysis.setRespDatasetHeader( new DatasetHeader( Collections.singletonList( @@ -406,7 +406,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> (QueryStatement) concatPathRewriter.rewrite( queryStatement, new PathPatternTree(queryStatement.useWildcard()), context); - analysis.setStatement(queryStatement); + analysis.setTreeStatement(queryStatement); // request schema fetch API long startTime = System.nanoTime(); @@ -578,8 +578,8 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> } analysis.setUseLogicalView(useLogicalView); if (useLogicalView - && analysis.getStatement() instanceof QueryStatement - && (((QueryStatement) analysis.getStatement()).isGroupByTag())) { + && analysis.getTreeStatement() instanceof QueryStatement + && (((QueryStatement) analysis.getTreeStatement()).isGroupByTag())) { throw new SemanticException("Views cannot be used in GROUP BY TAGS query yet."); } @@ -2277,7 +2277,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> } @Override - public Analysis visitInsert(InsertStatement insertStatement, MPPQueryContext context) { + public IAnalysis visitInsert(InsertStatement insertStatement, MPPQueryContext context) { context.setQueryType(QueryType.WRITE); long[] timeArray = insertStatement.getTimes(); PartialPath devicePath = insertStatement.getDevice(); @@ -2362,7 +2362,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> } Analysis analysis = new Analysis(); - analysis.setStatement(createTimeSeriesStatement); + analysis.setTreeStatement(createTimeSeriesStatement); checkIsTableCompatible(createTimeSeriesStatement.getPath(), context); checkIsTemplateCompatible( @@ -2474,7 +2474,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> } Analysis analysis = new Analysis(); - analysis.setStatement(createAlignedTimeSeriesStatement); + analysis.setTreeStatement(createAlignedTimeSeriesStatement); checkIsTableCompatible(createAlignedTimeSeriesStatement.getDevicePath(), context); checkIsTemplateCompatible( @@ -2504,7 +2504,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> context.setQueryType(QueryType.WRITE); Analysis analysis = new Analysis(); - analysis.setStatement(internalCreateTimeSeriesStatement); + analysis.setTreeStatement(internalCreateTimeSeriesStatement); checkIsTableCompatible(internalCreateTimeSeriesStatement.getDevicePath(), context); checkIsTemplateCompatible( internalCreateTimeSeriesStatement.getDevicePath(), @@ -2534,7 +2534,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> context.setQueryType(QueryType.WRITE); Analysis analysis = new Analysis(); - analysis.setStatement(internalCreateMultiTimeSeriesStatement); + analysis.setTreeStatement(internalCreateMultiTimeSeriesStatement); PathPatternTree pathPatternTree = new PathPatternTree(); DataNodeSchemaLockManager.getInstance().takeReadLock(SchemaLockType.TIMESERIES_VS_TEMPLATE); @@ -2560,7 +2560,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> CreateMultiTimeSeriesStatement createMultiTimeSeriesStatement, MPPQueryContext context) { context.setQueryType(QueryType.WRITE); Analysis analysis = new Analysis(); - analysis.setStatement(createMultiTimeSeriesStatement); + analysis.setTreeStatement(createMultiTimeSeriesStatement); analyzeSchemaProps(createMultiTimeSeriesStatement.getPropsList()); @@ -2591,7 +2591,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> AlterTimeSeriesStatement alterTimeSeriesStatement, MPPQueryContext context) { context.setQueryType(QueryType.WRITE); Analysis analysis = new Analysis(); - analysis.setStatement(alterTimeSeriesStatement); + analysis.setTreeStatement(alterTimeSeriesStatement); Pair<Template, PartialPath> templateInfo = schemaFetcher.checkTemplateSetAndPreSetInfo( @@ -2615,41 +2615,15 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> } @Override - public Analysis visitInsertTablet( + public IAnalysis visitInsertTablet( InsertTabletStatement insertTabletStatement, MPPQueryContext context) { - context.setQueryType(QueryType.WRITE); - insertTabletStatement.semanticCheck(); - Analysis analysis = new Analysis(); - validateSchema(analysis, insertTabletStatement, - () -> SchemaValidator.validate(schemaFetcher, insertTabletStatement, context)); - InsertBaseStatement realStatement = removeLogicalView(analysis, insertTabletStatement); - if (analysis.isFinishQueryAfterAnalyze()) { - return analysis; - } - analysis.setStatement(realStatement); - - if (realStatement instanceof InsertTabletStatement) { - InsertTabletStatement realInsertTabletStatement = (InsertTabletStatement) realStatement; - DataPartitionQueryParam dataPartitionQueryParam = new DataPartitionQueryParam(); - dataPartitionQueryParam.setDevicePath( - realInsertTabletStatement.getDevicePath().getFullPath()); - dataPartitionQueryParam.setTimePartitionSlotList( - realInsertTabletStatement.getTimePartitionSlots()); - - return getAnalysisForWriting( - analysis, - Collections.singletonList(dataPartitionQueryParam), - context.getSession().getUserName(), partitionFetcher); - } else { - return computeAnalysisForMultiTablets( - analysis, - (InsertMultiTabletsStatement) realStatement, - context.getSession().getUserName(), partitionFetcher); - } + return AnalyzeUtils.analyzeInsert(context, insertTabletStatement, + () -> SchemaValidator.validate(schemaFetcher, insertTabletStatement, context), + partitionFetcher::getOrCreateDataPartition); } @Override - public Analysis visitInsertRow(InsertRowStatement insertRowStatement, MPPQueryContext context) { + public IAnalysis visitInsertRow(InsertRowStatement insertRowStatement, MPPQueryContext context) { context.setQueryType(QueryType.WRITE); insertRowStatement.semanticCheck(); Analysis analysis = new Analysis(); @@ -2659,7 +2633,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> if (analysis.isFinishQueryAfterAnalyze()) { return analysis; } - analysis.setStatement(realInsertStatement); + analysis.setTreeStatement(realInsertStatement); if (realInsertStatement instanceof InsertRowStatement) { InsertRowStatement realInsertRowStatement = (InsertRowStatement) realInsertStatement; @@ -2671,16 +2645,16 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> return getAnalysisForWriting( analysis, Collections.singletonList(dataPartitionQueryParam), - context.getSession().getUserName(), partitionFetcher); + context.getSession().getUserName(), partitionFetcher::getOrCreateDataPartition); } else { return computeAnalysisForInsertRows( analysis, (InsertRowsStatement) realInsertStatement, context.getSession().getUserName() - , partitionFetcher); + , partitionFetcher::getOrCreateDataPartition); } } @Override - public Analysis visitInsertRows( + public IAnalysis visitInsertRows( InsertRowsStatement insertRowsStatement, MPPQueryContext context) { context.setQueryType(QueryType.WRITE); insertRowsStatement.semanticCheck(); @@ -2692,14 +2666,14 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> if (analysis.isFinishQueryAfterAnalyze()) { return analysis; } - analysis.setStatement(realInsertRowsStatement); + analysis.setTreeStatement(realInsertRowsStatement); return computeAnalysisForInsertRows( - analysis, realInsertRowsStatement, context.getSession().getUserName(), partitionFetcher); + analysis, realInsertRowsStatement, context.getSession().getUserName(), partitionFetcher::getOrCreateDataPartition); } @Override - public Analysis visitInsertMultiTablets( + public IAnalysis visitInsertMultiTablets( InsertMultiTabletsStatement insertMultiTabletsStatement, MPPQueryContext context) { context.setQueryType(QueryType.WRITE); insertMultiTabletsStatement.semanticCheck(); @@ -2711,14 +2685,14 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> if (analysis.isFinishQueryAfterAnalyze()) { return analysis; } - analysis.setStatement(realStatement); + analysis.setTreeStatement(realStatement); return computeAnalysisForMultiTablets( - analysis, realStatement, context.getSession().getUserName(), partitionFetcher); + analysis, realStatement, context.getSession().getUserName(), partitionFetcher::getOrCreateDataPartition); } @Override - public Analysis visitInsertRowsOfOneDevice( + public IAnalysis visitInsertRowsOfOneDevice( InsertRowsOfOneDeviceStatement insertRowsOfOneDeviceStatement, MPPQueryContext context) { context.setQueryType(QueryType.WRITE); insertRowsOfOneDeviceStatement.semanticCheck(); @@ -2730,7 +2704,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> if (analysis.isFinishQueryAfterAnalyze()) { return analysis; } - analysis.setStatement(realInsertStatement); + analysis.setTreeStatement(realInsertStatement); if (realInsertStatement instanceof InsertRowsOfOneDeviceStatement) { InsertRowsOfOneDeviceStatement realStatement = @@ -2743,22 +2717,22 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> analysis, Collections.singletonList(dataPartitionQueryParam), context.getSession().getUserName(), - partitionFetcher); + partitionFetcher::getOrCreateDataPartition); } else { return computeAnalysisForInsertRows( analysis, (InsertRowsStatement) realInsertStatement, context.getSession().getUserName() - , partitionFetcher); + , partitionFetcher::getOrCreateDataPartition); } } @Override - public Analysis visitPipeEnrichedStatement( + public IAnalysis visitPipeEnrichedStatement( PipeEnrichedStatement pipeEnrichedStatement, MPPQueryContext context) { - Analysis analysis = pipeEnrichedStatement.getInnerStatement().accept(this, context); + IAnalysis analysis = pipeEnrichedStatement.getInnerStatement().accept(this, context); // statement may be changed because of logical view - pipeEnrichedStatement.setInnerStatement(analysis.getStatement()); - analysis.setStatement(pipeEnrichedStatement); + pipeEnrichedStatement.setInnerStatement(analysis.getTreeStatement()); + analysis.setTreeStatement(pipeEnrichedStatement); return analysis; } @@ -2837,7 +2811,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> public Analysis visitShowTimeSeries( ShowTimeSeriesStatement showTimeSeriesStatement, MPPQueryContext context) { Analysis analysis = new Analysis(); - analysis.setStatement(showTimeSeriesStatement); + analysis.setTreeStatement(showTimeSeriesStatement); PathPatternTree patternTree = new PathPatternTree(); patternTree.appendPathPattern(showTimeSeriesStatement.getPathPattern()); @@ -2890,7 +2864,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> public Analysis visitShowStorageGroup( ShowDatabaseStatement showDatabaseStatement, MPPQueryContext context) { Analysis analysis = new Analysis(); - analysis.setStatement(showDatabaseStatement); + analysis.setTreeStatement(showDatabaseStatement); analysis.setRespDatasetHeader( DatasetHeaderFactory.getShowStorageGroupHeader(showDatabaseStatement.isDetailed())); return analysis; @@ -2899,7 +2873,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> @Override public Analysis visitShowTTL(ShowTTLStatement showTTLStatement, MPPQueryContext context) { Analysis analysis = new Analysis(); - analysis.setStatement(showTTLStatement); + analysis.setTreeStatement(showTTLStatement); analysis.setRespDatasetHeader(DatasetHeaderFactory.getShowTTLHeader()); return analysis; } @@ -2965,7 +2939,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> public Analysis visitShowDevices( ShowDevicesStatement showDevicesStatement, MPPQueryContext context) { Analysis analysis = new Analysis(); - analysis.setStatement(showDevicesStatement); + analysis.setTreeStatement(showDevicesStatement); PathPatternTree patternTree = new PathPatternTree(); patternTree.appendPathPattern( @@ -2989,7 +2963,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> public Analysis visitShowCluster( ShowClusterStatement showClusterStatement, MPPQueryContext context) { Analysis analysis = new Analysis(); - analysis.setStatement(showClusterStatement); + analysis.setTreeStatement(showClusterStatement); if (showClusterStatement.isDetails()) { analysis.setRespDatasetHeader(DatasetHeaderFactory.getShowClusterDetailsHeader()); } else { @@ -3002,7 +2976,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> public Analysis visitCountStorageGroup( CountDatabaseStatement countDatabaseStatement, MPPQueryContext context) { Analysis analysis = new Analysis(); - analysis.setStatement(countDatabaseStatement); + analysis.setTreeStatement(countDatabaseStatement); analysis.setRespDatasetHeader(DatasetHeaderFactory.getCountStorageGroupHeader()); return analysis; } @@ -3011,7 +2985,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> public Analysis visitSchemaFetch( SchemaFetchStatement schemaFetchStatement, MPPQueryContext context) { Analysis analysis = new Analysis(); - analysis.setStatement(schemaFetchStatement); + analysis.setTreeStatement(schemaFetchStatement); SchemaPartition schemaPartition = partitionFetcher.getSchemaPartition(schemaFetchStatement.getPatternTree()); @@ -3028,7 +3002,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> public Analysis visitCountDevices( CountDevicesStatement countDevicesStatement, MPPQueryContext context) { Analysis analysis = new Analysis(); - analysis.setStatement(countDevicesStatement); + analysis.setTreeStatement(countDevicesStatement); PathPatternTree patternTree = new PathPatternTree(); patternTree.appendPathPattern( @@ -3049,7 +3023,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> public Analysis visitCountTimeSeries( CountTimeSeriesStatement countTimeSeriesStatement, MPPQueryContext context) { Analysis analysis = new Analysis(); - analysis.setStatement(countTimeSeriesStatement); + analysis.setTreeStatement(countTimeSeriesStatement); PathPatternTree patternTree = new PathPatternTree(); patternTree.appendPathPattern(countTimeSeriesStatement.getPathPattern()); @@ -3081,7 +3055,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> public Analysis visitCountLevelTimeSeries( CountLevelTimeSeriesStatement countLevelTimeSeriesStatement, MPPQueryContext context) { Analysis analysis = new Analysis(); - analysis.setStatement(countLevelTimeSeriesStatement); + analysis.setTreeStatement(countLevelTimeSeriesStatement); PathPatternTree patternTree = new PathPatternTree(); patternTree.appendPathPattern(countLevelTimeSeriesStatement.getPathPattern()); @@ -3098,7 +3072,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> @Override public Analysis visitCountNodes(CountNodesStatement countStatement, MPPQueryContext context) { Analysis analysis = new Analysis(); - analysis.setStatement(countStatement); + analysis.setTreeStatement(countStatement); PathPatternTree patternTree = new PathPatternTree(); patternTree.appendPathPattern(countStatement.getPathPattern()); @@ -3143,7 +3117,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> public Analysis visitShowVersion( ShowVersionStatement showVersionStatement, MPPQueryContext context) { Analysis analysis = new Analysis(); - analysis.setStatement(showVersionStatement); + analysis.setTreeStatement(showVersionStatement); analysis.setRespDatasetHeader(DatasetHeaderFactory.getShowVersionHeader()); analysis.setFinishQueryAfterAnalyze(true); return analysis; @@ -3152,7 +3126,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> private Analysis visitSchemaNodeManagementPartition( Statement statement, PartialPath path, PathPatternTree scope, DatasetHeader header) { Analysis analysis = new Analysis(); - analysis.setStatement(statement); + analysis.setTreeStatement(statement); PathPatternTree patternTree = new PathPatternTree(); patternTree.appendPathPattern(path); @@ -3177,7 +3151,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> DeleteDataStatement deleteDataStatement, MPPQueryContext context) { context.setQueryType(QueryType.WRITE); Analysis analysis = new Analysis(); - analysis.setStatement(deleteDataStatement); + analysis.setTreeStatement(deleteDataStatement); PathPatternTree patternTree = new PathPatternTree(); deleteDataStatement.getPathList().forEach(patternTree::appendPathPattern); @@ -3249,7 +3223,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> "Measurement under template is not allowed to have the same measurement name"); } Analysis analysis = new Analysis(); - analysis.setStatement(createTemplateStatement); + analysis.setTreeStatement(createTemplateStatement); return analysis; } @@ -3258,7 +3232,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> ShowNodesInSchemaTemplateStatement showNodesInSchemaTemplateStatement, MPPQueryContext context) { Analysis analysis = new Analysis(); - analysis.setStatement(showNodesInSchemaTemplateStatement); + analysis.setTreeStatement(showNodesInSchemaTemplateStatement); analysis.setRespDatasetHeader(DatasetHeaderFactory.getShowNodesInSchemaTemplateHeader()); return analysis; } @@ -3267,7 +3241,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> public Analysis visitShowSchemaTemplate( ShowSchemaTemplateStatement showSchemaTemplateStatement, MPPQueryContext context) { Analysis analysis = new Analysis(); - analysis.setStatement(showSchemaTemplateStatement); + analysis.setTreeStatement(showSchemaTemplateStatement); analysis.setRespDatasetHeader(DatasetHeaderFactory.getShowSchemaTemplateHeader()); return analysis; } @@ -3277,7 +3251,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> SetSchemaTemplateStatement setSchemaTemplateStatement, MPPQueryContext context) { context.setQueryType(QueryType.WRITE); Analysis analysis = new Analysis(); - analysis.setStatement(setSchemaTemplateStatement); + analysis.setTreeStatement(setSchemaTemplateStatement); return analysis; } @@ -3285,7 +3259,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> public Analysis visitShowPathSetTemplate( ShowPathSetTemplateStatement showPathSetTemplateStatement, MPPQueryContext context) { Analysis analysis = new Analysis(); - analysis.setStatement(showPathSetTemplateStatement); + analysis.setTreeStatement(showPathSetTemplateStatement); analysis.setRespDatasetHeader(DatasetHeaderFactory.getShowPathSetTemplateHeader()); return analysis; } @@ -3295,7 +3269,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> ActivateTemplateStatement activateTemplateStatement, MPPQueryContext context) { context.setQueryType(QueryType.WRITE); Analysis analysis = new Analysis(); - analysis.setStatement(activateTemplateStatement); + analysis.setTreeStatement(activateTemplateStatement); PartialPath activatePath = activateTemplateStatement.getPath(); @@ -3325,7 +3299,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> BatchActivateTemplateStatement batchActivateTemplateStatement, MPPQueryContext context) { context.setQueryType(QueryType.WRITE); Analysis analysis = new Analysis(); - analysis.setStatement(batchActivateTemplateStatement); + analysis.setTreeStatement(batchActivateTemplateStatement); Map<PartialPath, Pair<Template, PartialPath>> deviceTemplateSetInfoMap = new HashMap<>(batchActivateTemplateStatement.getDevicePathList().size()); @@ -3361,7 +3335,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> MPPQueryContext context) { context.setQueryType(QueryType.WRITE); Analysis analysis = new Analysis(); - analysis.setStatement(internalBatchActivateTemplateStatement); + analysis.setTreeStatement(internalBatchActivateTemplateStatement); PathPatternTree patternTree = new PathPatternTree(); for (PartialPath activatePath : @@ -3382,7 +3356,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> public Analysis visitShowPathsUsingTemplate( ShowPathsUsingTemplateStatement showPathsUsingTemplateStatement, MPPQueryContext context) { Analysis analysis = new Analysis(); - analysis.setStatement(showPathsUsingTemplateStatement); + analysis.setTreeStatement(showPathsUsingTemplateStatement); analysis.setRespDatasetHeader(DatasetHeaderFactory.getShowPathsUsingTemplateHeader()); Pair<Template, List<PartialPath>> templateSetInfo = @@ -3429,7 +3403,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> public Analysis visitShowQueries( ShowQueriesStatement showQueriesStatement, MPPQueryContext context) { Analysis analysis = new Analysis(); - analysis.setStatement(showQueriesStatement); + analysis.setTreeStatement(showQueriesStatement); analysis.setRespDatasetHeader(DatasetHeaderFactory.getShowQueriesHeader()); analysis.setVirtualSource(true); @@ -3501,7 +3475,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> CreateLogicalViewStatement createLogicalViewStatement, MPPQueryContext context) { Analysis analysis = new Analysis(); context.setQueryType(QueryType.WRITE); - analysis.setStatement(createLogicalViewStatement); + analysis.setTreeStatement(createLogicalViewStatement); if (createLogicalViewStatement.getViewExpressions() == null) { // Analyze query in statement @@ -3763,7 +3737,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> ShowLogicalViewStatement showLogicalViewStatement, MPPQueryContext context) { context.setQueryType(QueryType.READ); Analysis analysis = new Analysis(); - analysis.setStatement(showLogicalViewStatement); + analysis.setTreeStatement(showLogicalViewStatement); PathPatternTree patternTree = new PathPatternTree(); patternTree.appendPathPattern(showLogicalViewStatement.getPathPattern()); @@ -3780,7 +3754,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> public Analysis visitShowCurrentTimestamp( ShowCurrentTimestampStatement showCurrentTimestampStatement, MPPQueryContext context) { Analysis analysis = new Analysis(); - analysis.setStatement(showCurrentTimestampStatement); + analysis.setTreeStatement(showCurrentTimestampStatement); analysis.setFinishQueryAfterAnalyze(true); analysis.setRespDatasetHeader(DatasetHeaderFactory.getShowCurrentTimestampHeader()); return analysis; diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/IAnalysis.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/IAnalysis.java index bb3821aef6e..1fcb7bf41ec 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/IAnalysis.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/IAnalysis.java @@ -20,9 +20,11 @@ package org.apache.iotdb.db.queryengine.plan.analyze; import org.apache.iotdb.common.rpc.thrift.TSStatus; +import org.apache.iotdb.commons.partition.DataPartition; import org.apache.iotdb.db.queryengine.common.MPPQueryContext; import org.apache.iotdb.db.queryengine.common.header.DatasetHeader; +import org.apache.iotdb.db.queryengine.plan.statement.Statement; import org.apache.tsfile.read.common.block.TsBlock; public interface IAnalysis { @@ -50,4 +52,17 @@ public interface IAnalysis { default void setFailStatus(TSStatus status) { } + + default boolean isFinishQueryAfterAnalyze() { + return false; + } + + default void setTreeStatement(Statement realStatement) {} + + default void setDataPartitionInfo(DataPartition dataPartition) { + } + + default Statement getTreeStatement(){ + return null; + } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/LoadTsfileAnalyzer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/LoadTsfileAnalyzer.java index a372772e374..70d0a382525 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/LoadTsfileAnalyzer.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/LoadTsfileAnalyzer.java @@ -195,7 +195,7 @@ public class LoadTsfileAnalyzer { // data partition will be queried in the scheduler final Analysis analysis = new Analysis(); - analysis.setStatement(loadTsFileStatement); + analysis.setTreeStatement(loadTsFileStatement); return analysis; } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/memory/StatementMemorySourceVisitor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/memory/StatementMemorySourceVisitor.java index 7a37902dbb9..6a2bbab43fd 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/memory/StatementMemorySourceVisitor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/memory/StatementMemorySourceVisitor.java @@ -79,7 +79,7 @@ public class StatementMemorySourceVisitor @Override public StatementMemorySource visitExplain( ExplainStatement node, StatementMemorySourceContext context) { - context.getAnalysis().setStatement(node.getQueryStatement()); + context.getAnalysis().setTreeStatement(node.getQueryStatement()); DatasetHeader header = new DatasetHeader( Collections.singletonList( diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/AggregationPushDown.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/AggregationPushDown.java index 00907e2f669..8f0c7e5dad9 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/AggregationPushDown.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/AggregationPushDown.java @@ -79,7 +79,7 @@ public class AggregationPushDown implements PlanOptimizer { @Override public PlanNode optimize(PlanNode plan, Analysis analysis, MPPQueryContext context) { - if (analysis.getStatement().getType() != StatementType.QUERY) { + if (analysis.getTreeStatement().getType() != StatementType.QUERY) { return plan; } QueryStatement queryStatement = analysis.getQueryStatement(); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/ColumnInjectionPushDown.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/ColumnInjectionPushDown.java index f90346f3c51..921ab330588 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/ColumnInjectionPushDown.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/ColumnInjectionPushDown.java @@ -63,7 +63,7 @@ public class ColumnInjectionPushDown implements PlanOptimizer { @Override public PlanNode optimize(PlanNode plan, Analysis analysis, MPPQueryContext context) { - if (analysis.getStatement().getType() != StatementType.QUERY) { + if (analysis.getTreeStatement().getType() != StatementType.QUERY) { return plan; } QueryStatement queryStatement = analysis.getQueryStatement(); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/LimitOffsetPushDown.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/LimitOffsetPushDown.java index df73a23dd18..da560a63026 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/LimitOffsetPushDown.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/LimitOffsetPushDown.java @@ -67,7 +67,7 @@ public class LimitOffsetPushDown implements PlanOptimizer { @Override public PlanNode optimize(PlanNode plan, Analysis analysis, MPPQueryContext context) { - if (analysis.getStatement().getType() != StatementType.QUERY) { + if (analysis.getTreeStatement().getType() != StatementType.QUERY) { return plan; } QueryStatement queryStatement = analysis.getQueryStatement(); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/OrderByExpressionWithLimitChangeToTopK.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/OrderByExpressionWithLimitChangeToTopK.java index 1f0730b3c6b..90b5d2fdb43 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/OrderByExpressionWithLimitChangeToTopK.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/OrderByExpressionWithLimitChangeToTopK.java @@ -65,7 +65,7 @@ public class OrderByExpressionWithLimitChangeToTopK implements PlanOptimizer { @Override public PlanNode optimize(PlanNode plan, Analysis analysis, MPPQueryContext context) { - if (analysis.getStatement().getType() != StatementType.QUERY) { + if (analysis.getTreeStatement().getType() != StatementType.QUERY) { return plan; } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/PredicatePushDown.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/PredicatePushDown.java index 65a7023bb31..475eced371d 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/PredicatePushDown.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/PredicatePushDown.java @@ -62,7 +62,7 @@ public class PredicatePushDown implements PlanOptimizer { @Override public PlanNode optimize(PlanNode plan, Analysis analysis, MPPQueryContext context) { - if (analysis.getStatement().getType() != StatementType.QUERY) { + if (analysis.getTreeStatement().getType() != StatementType.QUERY) { return plan; } QueryStatement queryStatement = analysis.getQueryStatement(); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanner.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanner.java index 5f460f0267d..64f6b273176 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanner.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanner.java @@ -45,7 +45,7 @@ public class LogicalPlanner { public LogicalQueryPlan plan(Analysis analysis) { long startTime = System.nanoTime(); - PlanNode rootNode = new LogicalPlanVisitor(analysis).process(analysis.getStatement(), context); + PlanNode rootNode = new LogicalPlanVisitor(analysis).process(analysis.getTreeStatement(), context); // optimize the query logical plan if (analysis.isQuery()) { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TreeModelPlanner.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TreeModelPlanner.java index 843374ec49c..a819fa950de 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TreeModelPlanner.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TreeModelPlanner.java @@ -162,9 +162,9 @@ public class TreeModelPlanner implements IPlanner { // Get the inner statement of PipeEnrichedStatement Statement statementToRedirect = - analysis.getStatement() instanceof PipeEnrichedStatement - ? ((PipeEnrichedStatement) analysis.getStatement()).getInnerStatement() - : analysis.getStatement(); + analysis.getTreeStatement() instanceof PipeEnrichedStatement + ? ((PipeEnrichedStatement) analysis.getTreeStatement()).getInnerStatement() + : analysis.getTreeStatement(); if (statementToRedirect instanceof InsertBaseStatement && !analysis.isFinishQueryAfterAnalyze()) { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/DistributionPlanner.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/DistributionPlanner.java index 4a4d168a321..dd0974ac635 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/DistributionPlanner.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/DistributionPlanner.java @@ -89,7 +89,7 @@ public class DistributionPlanner { public PlanNode addExchangeNode(PlanNode root) { ExchangeNodeAdder adder = new ExchangeNodeAdder(this.analysis); NodeGroupContext nodeGroupContext = - new NodeGroupContext(context, analysis.getStatement(), root); + new NodeGroupContext(context, analysis.getTreeStatement(), root); PlanNode newRoot = adder.visit(root, nodeGroupContext); adjustUpStream(newRoot, nodeGroupContext); return newRoot; @@ -112,8 +112,8 @@ public class DistributionPlanner { } final boolean needShuffleSinkNode = - analysis.getStatement() instanceof QueryStatement - && needShuffleSinkNode((QueryStatement) analysis.getStatement(), context); + analysis.getTreeStatement() instanceof QueryStatement + && needShuffleSinkNode((QueryStatement) analysis.getTreeStatement(), context); adjustUpStreamHelper(root, new HashMap<>(), needShuffleSinkNode, context); } @@ -183,7 +183,7 @@ public class DistributionPlanner { } public PlanNode optimize(PlanNode rootWithExchange) { - if (analysis.getStatement() != null && analysis.getStatement().isQuery()) { + if (analysis.getTreeStatement() != null && analysis.getTreeStatement().isQuery()) { for (PlanOptimizer optimizer : optimizers) { rootWithExchange = optimizer.optimize(rootWithExchange, analysis, context); } @@ -201,7 +201,7 @@ public class DistributionPlanner { PlanNode rootWithExchange = addExchangeNode(rootAfterRewrite); PlanNode optimizedRootWithExchange = optimize(rootWithExchange); - if (analysis.getStatement() != null && analysis.getStatement().isQuery()) { + if (analysis.getTreeStatement() != null && analysis.getTreeStatement().isQuery()) { analysis .getRespDatasetHeader() .setColumnToTsBlockIndexMap(optimizedRootWithExchange.getOutputColumnNames()); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/SimpleFragmentParallelPlanner.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/SimpleFragmentParallelPlanner.java index 0a7f17166c3..e955f5f5a22 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/SimpleFragmentParallelPlanner.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/SimpleFragmentParallelPlanner.java @@ -106,8 +106,8 @@ public class SimpleFragmentParallelPlanner implements IFragmentParallelPlaner { dataNodeFIMap.get(fragmentInstance.getHostDataNode()).size())); // compute dataNodeSeriesScanNum in LastQueryScanNode - if (analysis.getStatement() instanceof QueryStatement - && ((QueryStatement) analysis.getStatement()).isLastQuery()) { + if (analysis.getTreeStatement() instanceof QueryStatement + && ((QueryStatement) analysis.getTreeStatement()).isLastQuery()) { final Map<Path, AtomicInteger> pathSumMap = new HashMap<>(); dataNodeFIMap .values() @@ -183,11 +183,11 @@ public class SimpleFragmentParallelPlanner implements IFragmentParallelPlaner { return v; }); - if (analysis.getStatement() instanceof QueryStatement - || analysis.getStatement() instanceof ExplainAnalyzeStatement - || analysis.getStatement() instanceof ShowQueriesStatement - || (analysis.getStatement() instanceof ShowTimeSeriesStatement - && ((ShowTimeSeriesStatement) analysis.getStatement()).isOrderByHeat())) { + if (analysis.getTreeStatement() instanceof QueryStatement + || analysis.getTreeStatement() instanceof ExplainAnalyzeStatement + || analysis.getTreeStatement() instanceof ShowQueriesStatement + || (analysis.getTreeStatement() instanceof ShowTimeSeriesStatement + && ((ShowTimeSeriesStatement) analysis.getTreeStatement()).isOrderByHeat())) { fragmentInstance.getFragment().generateTypeProvider(queryContext.getTypeProvider()); } instanceMap.putIfAbsent(fragment.getId(), fragmentInstance); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/load/LoadTsFileNode.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/load/LoadTsFileNode.java index 74df1b08dbd..b7bb2b24859 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/load/LoadTsFileNode.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/load/LoadTsFileNode.java @@ -91,10 +91,10 @@ public class LoadTsFileNode extends WritePlanNode { public List<WritePlanNode> splitByPartition(Analysis analysis) { List<WritePlanNode> res = new ArrayList<>(); LoadTsFileStatement statement = - analysis.getStatement() instanceof PipeEnrichedStatement + analysis.getTreeStatement() instanceof PipeEnrichedStatement ? (LoadTsFileStatement) - ((PipeEnrichedStatement) analysis.getStatement()).getInnerStatement() - : (LoadTsFileStatement) analysis.getStatement(); + ((PipeEnrichedStatement) analysis.getTreeStatement()).getInnerStatement() + : (LoadTsFileStatement) analysis.getTreeStatement(); for (int i = 0; i < resources.size(); i++) { res.add( diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/Analysis.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/Analysis.java index 9faf14e320d..b8749f6957f 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/Analysis.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/Analysis.java @@ -186,7 +186,7 @@ public class Analysis implements IAnalysis { return parameters; } - public Statement getStatement() { + public Statement getTreeStatement() { return root; } 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 75e7153513a..9ba4c068c7f 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 @@ -27,6 +27,7 @@ import org.apache.iotdb.db.queryengine.common.MPPQueryContext; import org.apache.iotdb.db.queryengine.common.SessionInfo; import org.apache.iotdb.db.queryengine.execution.warnings.IoTDBWarning; import org.apache.iotdb.db.queryengine.execution.warnings.WarningCollector; +import org.apache.iotdb.db.queryengine.plan.analyze.AnalyzeUtils; import org.apache.iotdb.db.queryengine.plan.analyze.IAnalysis; import org.apache.iotdb.db.queryengine.plan.analyze.QueryType; import org.apache.iotdb.db.queryengine.plan.analyze.schema.SchemaValidator; @@ -372,36 +373,11 @@ public class StatementAnalyzer { final MPPQueryContext context = insert.getContext(); final InsertTabletStatement insertTabletStatement = insert.getInnerTreeStatement(); - context.setQueryType(QueryType.WRITE); - insertTabletStatement.semanticCheck(); - IAnalysis analysis = new org.apache.iotdb.db.queryengine.plan.analyze.Analysis(); - - validateSchema(analysis, insertTabletStatement, - () -> SchemaValidator.validate(metadata, insert, context)); - InsertBaseStatement realStatement = removeLogicalView(analysis, insertTabletStatement); - if (analysis.isFinishQueryAfterAnalyze()) { - return ret; - } - analysis.setStatement(realStatement); - - if (realStatement instanceof InsertTabletStatement) { - InsertTabletStatement realInsertTabletStatement = (InsertTabletStatement) realStatement; - DataPartitionQueryParam dataPartitionQueryParam = new DataPartitionQueryParam(); - dataPartitionQueryParam.setDevicePath( - realInsertTabletStatement.getDevicePath().getFullPath()); - dataPartitionQueryParam.setTimePartitionSlotList( - realInsertTabletStatement.getTimePartitionSlots()); - - analysis = getAnalysisForWriting( - analysis, - Collections.singletonList(dataPartitionQueryParam), - context.getSession().getUserName(), partitionFetcher); - } else { - analysis = computeAnalysisForMultiTablets( - analysis, - (InsertMultiTabletsStatement) realStatement, - context.getSession().getUserName(), partitionFetcher); - } + + IAnalysis analysis = AnalyzeUtils.analyzeInsert(context, insertTabletStatement, + () -> SchemaValidator.validate(metadata, insert, context), + metadata::getOrCreateDataPartition); + // TODO-TableIngestion: use IAnalysis // StatementAnalyzer.this.analysis = analysis; return ret; diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/Metadata.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/Metadata.java index df047d7d652..1411338c070 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/Metadata.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/Metadata.java @@ -19,6 +19,9 @@ package org.apache.iotdb.db.queryengine.plan.relational.metadata; +import java.util.Map; +import org.apache.iotdb.commons.partition.DataPartition; +import org.apache.iotdb.commons.partition.DataPartitionQueryParam; import org.apache.iotdb.db.queryengine.common.MPPQueryContext; import org.apache.iotdb.db.queryengine.common.SessionInfo; import org.apache.iotdb.db.queryengine.plan.analyze.schema.ISchemaComputationWithAutoCreation; @@ -84,4 +87,16 @@ public interface Metadata { MPPQueryContext context) { throw new UnsupportedOperationException(); } + + /** + * Get or create data partition, used in cluster write scenarios. if enableAutoCreateSchema is + * true and database/series/time slots not exists, then automatically create. + * + * @param dataPartitionQueryParams the list of DataPartitionQueryParams + * @param userName + */ + default DataPartition getOrCreateDataPartition( + List<DataPartitionQueryParam> dataPartitionQueryParams, String userName) { + throw new UnsupportedOperationException(); + } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/LogicalPlanner.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/LogicalPlanner.java index 719ede30231..8526d39da25 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/LogicalPlanner.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/LogicalPlanner.java @@ -85,7 +85,7 @@ public class LogicalPlanner { } public LogicalQueryPlan plan(Analysis analysis) throws IoTDBException { - PlanNode planNode = planStatement(analysis, analysis.getStatement()); + PlanNode planNode = planStatement(analysis, analysis.getTreeStatement()); relationalPlanOptimizers.forEach( optimizer -> diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/FragmentInstanceGenerator.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/FragmentInstanceGenerator.java index 623217e340f..6ce858d179d 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/FragmentInstanceGenerator.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/FragmentInstanceGenerator.java @@ -141,7 +141,7 @@ public class FragmentInstanceGenerator { return v; }); - if (analysis.getStatement() instanceof Query) { + if (analysis.getTreeStatement() instanceof Query) { fragmentInstance.getFragment().generateTableModelTypeProvider(queryContext.getTypeProvider()); } instanceMap.putIfAbsent(fragment.getId(), fragmentInstance); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/TableDistributionPlanner.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/TableDistributionPlanner.java index 83f1548ee3a..7fa34d6de89 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/TableDistributionPlanner.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/TableDistributionPlanner.java @@ -59,7 +59,7 @@ public class TableDistributionPlanner { } PlanNode outputNodeWithExchange = distributedPlanNodeResult.get(0); - if (analysis.getStatement() instanceof Query) { + if (analysis.getTreeStatement() instanceof Query) { analysis .getRespDatasetHeader() .setColumnToTsBlockIndexMap( diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeTest.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeTest.java index b9681477344..a3716c720de 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeTest.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeTest.java @@ -642,7 +642,7 @@ public class AnalyzeTest { for (int i = 0; i < sqls.length; i++) { Analysis analysis = analyzeSQL(sqls[i]); - QueryStatement queryStatement = (QueryStatement) analysis.getStatement(); + QueryStatement queryStatement = (QueryStatement) analysis.getTreeStatement(); if (predicates[i] == null) { Assert.assertNull(queryStatement.getWhereCondition()); } else { diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/optimization/OptimizationTestUtil.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/optimization/OptimizationTestUtil.java index 2df3f0ef124..921ea82cc54 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/optimization/OptimizationTestUtil.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/optimization/OptimizationTestUtil.java @@ -122,7 +122,7 @@ public class OptimizationTestUtil { Analysis analysis = analyzer.analyze(statement); PlanNode actualPlan = - new LogicalPlanVisitor(analysis).process(analysis.getStatement(), context); + new LogicalPlanVisitor(analysis).process(analysis.getTreeStatement(), context); for (PlanOptimizer preOptimizer : preOptimizers) { actualPlan = preOptimizer.optimize(actualPlan, analysis, context); } @@ -142,7 +142,7 @@ public class OptimizationTestUtil { Analysis analysis = analyzer.analyze(statement); PlanNode actualPlan = - new LogicalPlanVisitor(analysis).process(analysis.getStatement(), context); + new LogicalPlanVisitor(analysis).process(analysis.getTreeStatement(), context); for (PlanOptimizer preOptimizer : preOptimizers) { actualPlan = preOptimizer.optimize(actualPlan, analysis, context); } diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/Util.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/Util.java index 59cd36a2f8a..223d12f6af3 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/Util.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/Util.java @@ -228,8 +228,8 @@ public class Util { analysis.setSchemaPartitionInfo(schemaPartition); analysis.setSchemaTree(genSchemaTree()); // to avoid some special case which is not the point of test - analysis.setStatement(Mockito.mock(QueryStatement.class)); - Mockito.when(analysis.getStatement().isQuery()).thenReturn(false); + analysis.setTreeStatement(Mockito.mock(QueryStatement.class)); + Mockito.when(analysis.getTreeStatement().isQuery()).thenReturn(false); return analysis; } catch (IllegalPathException e) { return new Analysis(); diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/Util2.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/Util2.java index eb802edd9e5..a2583bf812a 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/Util2.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/Util2.java @@ -142,8 +142,8 @@ public class Util2 { analysis.setSchemaPartitionInfo(schemaPartition); analysis.setSchemaTree(genSchemaTree()); // to avoid some special case which is not the point of test - analysis.setStatement(Mockito.mock(QueryStatement.class)); - Mockito.when(analysis.getStatement().isQuery()).thenReturn(false); + analysis.setTreeStatement(Mockito.mock(QueryStatement.class)); + Mockito.when(analysis.getTreeStatement().isQuery()).thenReturn(false); return analysis; } diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/logical/LogicalPlannerTestUtil.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/logical/LogicalPlannerTestUtil.java index 176cc7bde18..f48b2ef6d43 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/logical/LogicalPlannerTestUtil.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/logical/LogicalPlannerTestUtil.java @@ -55,6 +55,6 @@ public class LogicalPlannerTestUtil { Analyzer analyzer = new Analyzer(context, new FakePartitionFetcherImpl(), new FakeSchemaFetcherImpl()); Analysis analysis = analyzer.analyze(statement); - return new LogicalPlanVisitor(analysis).process(analysis.getStatement(), context); + return new LogicalPlanVisitor(analysis).process(analysis.getTreeStatement(), context); } }
