This is an automated email from the ASF dual-hosted git repository. caogaofei pushed a commit to branch beyyes/debug-table in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 08b00158c9d554ceda1548a42bd851a7f401afcb Author: Beyyes <[email protected]> AuthorDate: Sun Apr 28 15:23:28 2024 +0800 add skipExecute judgement --- .../queryengine/plan/execution/QueryExecution.java | 13 +++++ .../plan/relational/analyzer/Analysis.java | 28 +++++++++- .../planner/optimizations/IndexScan.java | 60 ++++++++++++---------- 3 files changed, 72 insertions(+), 29 deletions(-) diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/QueryExecution.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/QueryExecution.java index ea8a3d9af1e..5a0b732107e 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/QueryExecution.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/QueryExecution.java @@ -166,6 +166,19 @@ public class QueryExecution implements IQueryExecution { // check timeout for query first checkTimeOutForQuery(); doLogicalPlan(); + + if (skipExecute()) { + // TODO move this judgement to analyze state? + LOGGER.debug("[SkipExecute After LogicalPlan]"); + if (context.getQueryType() == QueryType.WRITE && analysis.isFailed()) { + stateMachine.transitionToFailed(analysis.getFailStatus()); + } else { + constructResultForMemorySource(); + stateMachine.transitionToRunning(); + } + return; + } + doDistributedPlan(); // update timeout after finishing plan stage 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 015b3097324..ad131a30354 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 @@ -24,6 +24,7 @@ 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.analyze.IAnalysis; +import org.apache.iotdb.db.queryengine.plan.execution.memory.StatementMemorySource; import org.apache.iotdb.db.queryengine.plan.relational.metadata.QualifiedObjectName; import org.apache.iotdb.db.queryengine.plan.relational.metadata.TableSchema; import org.apache.iotdb.db.queryengine.plan.relational.security.AccessControl; @@ -82,6 +83,7 @@ import static java.util.Collections.unmodifiableList; import static java.util.Collections.unmodifiableMap; import static java.util.Collections.unmodifiableSet; import static java.util.Objects.requireNonNull; +import static org.apache.iotdb.db.queryengine.common.header.DatasetHeader.EMPTY_HEADER; public class Analysis implements IAnalysis { @@ -154,6 +156,8 @@ public class Analysis implements IAnalysis { private DatasetHeader respDatasetHeader; + private boolean finishQueryAfterAnalyze; + public Expression getGlobalTableModelTimePredicate() { return this.globalTableModelTimePredicate; } @@ -575,12 +579,32 @@ public class Analysis implements IAnalysis { @Override public boolean canSkipExecute(MPPQueryContext context) { - return false; + return isFinishQueryAfterAnalyze(); + } + + public void setFinishQueryAfterAnalyze() { + this.finishQueryAfterAnalyze = true; + } + + public boolean isFinishQueryAfterAnalyze() { + return finishQueryAfterAnalyze; + } + + private boolean hasDataSource() { + return (dataPartition != null && !dataPartition.isEmpty()); + // || (schemaPartition != null && !schemaPartition.isEmpty()) + // || statement instanceof ShowQueriesStatement + // || (statement instanceof QueryStatement + // && ((QueryStatement) statement).isAggregationQuery()); } @Override public TsBlock constructResultForMemorySource(MPPQueryContext context) { - return null; + StatementMemorySource source = + new StatementMemorySource( + new TsBlock(0), respDatasetHeader == null ? EMPTY_HEADER : respDatasetHeader); + setRespDatasetHeader(source.getDatasetHeader()); + return source.getTsBlock(); } @Override diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/IndexScan.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/IndexScan.java index 2e967f4f66d..70945da8185 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/IndexScan.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/IndexScan.java @@ -98,31 +98,7 @@ public class IndexScan implements RelationalPlanOptimizer { .map(e -> e.getKey().getName()) .collect(Collectors.toList()); - List<Expression> resultIndexExpressions = new ArrayList<>(); - Expression originalPredicate = context.getPredicate(); - if (originalPredicate != null) { - Set<String> idOrAttributeColumnNames = - node.getIdAndAttributeIndexMap().keySet().stream() - .map(Symbol::getName) - .collect(Collectors.toSet()); - if (originalPredicate instanceof LogicalExpression) { - for (Expression subExpression : ((LogicalExpression) originalPredicate).getTerms()) { - if (Boolean.TRUE.equals( - new PredicatePushIntoIndexScanChecker(idOrAttributeColumnNames) - .process(subExpression))) { - resultIndexExpressions.add(subExpression); - } - } - } else { - if (Boolean.FALSE.equals( - new PredicatePushIntoIndexScanChecker(idOrAttributeColumnNames) - .process(originalPredicate))) { - resultIndexExpressions = Collections.emptyList(); - } else { - resultIndexExpressions = Collections.singletonList(originalPredicate); - } - } - } + List<Expression> conjExpressions = getConjunctionExpressions(context.getPredicate(), node); List<DeviceEntry> deviceEntries = context @@ -131,7 +107,7 @@ public class IndexScan implements RelationalPlanOptimizer { new QualifiedObjectName( context.getSessionInfo().getDatabaseName().get(), node.getQualifiedTableName()), - resultIndexExpressions, + conjExpressions, attributeColumns); node.setDeviceEntries(deviceEntries); @@ -156,7 +132,7 @@ public class IndexScan implements RelationalPlanOptimizer { } if (dataPartition.getDataPartitionMap().isEmpty()) { - node.setRegionReplicaSet(new TRegionReplicaSet()); + context.getAnalysis().setFinishQueryAfterAnalyze(); } else { // TODO add the real impl TRegionReplicaSet regionReplicaSet = @@ -179,6 +155,36 @@ public class IndexScan implements RelationalPlanOptimizer { } } + private static List<Expression> getConjunctionExpressions( + Expression predicate, TableScanNode node) { + if (predicate != null) { + List<Expression> resultExpressions = new ArrayList<>(); + Set<String> idOrAttributeColumnNames = + node.getIdAndAttributeIndexMap().keySet().stream() + .map(Symbol::getName) + .collect(Collectors.toSet()); + if (predicate instanceof LogicalExpression) { + for (Expression subExpression : ((LogicalExpression) predicate).getTerms()) { + if (Boolean.TRUE.equals( + new PredicatePushIntoIndexScanChecker(idOrAttributeColumnNames) + .process(subExpression))) { + resultExpressions.add(subExpression); + } + } + } else { + if (Boolean.FALSE.equals( + new PredicatePushIntoIndexScanChecker(idOrAttributeColumnNames).process(predicate))) { + resultExpressions = Collections.emptyList(); + } else { + resultExpressions = Collections.singletonList(predicate); + } + } + return resultExpressions; + } else { + return Collections.emptyList(); + } + } + private static DataPartition fetchDataPartitionByDevices( Set<String> deviceSet, String database,
