implement analyze for SimpleAggregationQueryStatement
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java index 30162d3..79ff01b 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java
@@ -100,6 +100,7 @@ import org.apache.iotdb.db.mpp.plan.statement.crud.InsertTabletStatement; import org.apache.iotdb.db.mpp.plan.statement.crud.LoadTsFileStatement; import org.apache.iotdb.db.mpp.plan.statement.crud.QueryStatement; +import org.apache.iotdb.db.mpp.plan.statement.crud.SimpleAggregationQueryStatement; import org.apache.iotdb.db.mpp.plan.statement.internal.InternalBatchActivateTemplateStatement; import org.apache.iotdb.db.mpp.plan.statement.internal.InternalCreateMultiTimeSeriesStatement; import org.apache.iotdb.db.mpp.plan.statement.internal.InternalCreateTimeSeriesStatement; @@ -356,6 +357,39 @@ return analysis; } + @Override + public Analysis visitSimpleAggregationQuery( + SimpleAggregationQueryStatement queryStatement, MPPQueryContext context) { + Analysis analysis = new Analysis(); + analysis.setStatement(queryStatement); + + // check for semantic errors + queryStatement.semanticCheck(); + + // concat path and construct path pattern tree + PathPatternTree patternTree = new PathPatternTree(); + List<PartialPath> sourcePaths = queryStatement.getSourcePaths(); + sourcePaths.forEach(patternTree::appendPathPattern); + + // request schema fetch API + logger.debug("[StartFetchSchema]"); + long startTime = System.nanoTime(); + ISchemaTree schemaTree = schemaFetcher.fetchSchema(patternTree, context); + QueryMetricsManager.getInstance().recordPlanCost(SCHEMA_FETCHER, System.nanoTime() - startTime); + logger.debug("[EndFetchSchema]"); + + // If there is no leaf node in the schema tree, the query should be completed immediately + if (schemaTree.isEmpty()) { + analysis.setFinishQueryAfterAnalyze(true); + return analysis; + } + + // extract global time filter from query filter and determine if there is a value filter + analyzeGlobalTimeFilter(analysis, queryStatement); + + return analysis; + } + private Analysis finishQuery(QueryStatement queryStatement, Analysis analysis) { if (queryStatement.isSelectInto()) { analysis.setRespDatasetHeader(