You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ca...@apache.org on 2024/06/03 04:02:31 UTC
(iotdb) 01/02: add globalTimeFilter logic in planFilter, but how does it use in FragmentInstanceContext
This is an automated email from the ASF dual-hosted git repository.
caogaofei pushed a commit to branch beyyes/TableModel
in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit d25299c153c78600bf325bb6ecc7f57a63bf82c4
Author: Beyyes <cg...@foxmail.com>
AuthorDate: Sun Jun 2 16:02:49 2024 +0800
add globalTimeFilter logic in planFilter, but how does it use in FragmentInstanceContext
---
.../db/queryengine/common/MPPQueryContext.java | 4 ++++
.../plan/relational/planner/QueryPlanner.java | 4 ++++
.../planner/optimizations/IndexScan.java | 27 ++++++++++++++-------
.../plan/relational/analyzer/AnalyzerTest.java | 28 +++++++++++++++-------
4 files changed, 46 insertions(+), 17 deletions(-)
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/MPPQueryContext.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/MPPQueryContext.java
index 3a42ee805b0..b348fee081c 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/MPPQueryContext.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/MPPQueryContext.java
@@ -223,6 +223,10 @@ public class MPPQueryContext {
PredicateUtils.convertPredicateToTimeFilter(analysis.getGlobalTimePredicate());
}
+ public void setGlobalTimeFilter(Filter globalTimeFilter) {
+ this.globalTimeFilter = globalTimeFilter;
+ }
+
public Filter getGlobalTimeFilter() {
// time filter may be stateful, so we need to copy it
return globalTimeFilter != null ? globalTimeFilter.copy() : null;
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/QueryPlanner.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/QueryPlanner.java
index a3e1dec9819..7dc67a7df05 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/QueryPlanner.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/QueryPlanner.java
@@ -19,6 +19,7 @@ import org.apache.iotdb.db.queryengine.common.SessionInfo;
import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNode;
import org.apache.iotdb.db.queryengine.plan.relational.analyzer.Analysis;
import org.apache.iotdb.db.queryengine.plan.relational.analyzer.NodeRef;
+import org.apache.iotdb.db.queryengine.plan.relational.analyzer.predicate.ConvertPredicateToTimeFilterVisitor;
import org.apache.iotdb.db.queryengine.plan.relational.planner.ir.ExpressionTranslateVisitor;
import org.apache.iotdb.db.queryengine.plan.relational.planner.node.FilterNode;
import org.apache.iotdb.db.queryengine.plan.relational.planner.node.LimitNode;
@@ -250,6 +251,9 @@ public class QueryPlanner {
if (resultPair.left != null) {
globalTimePredicate =
ExpressionTranslateVisitor.translateToSymbolReference(resultPair.left, planBuilder);
+
+ queryContext.setGlobalTimeFilter(
+ globalTimePredicate.accept(new ConvertPredicateToTimeFilterVisitor(), null));
}
analysis.setGlobalTableModelTimePredicate(globalTimePredicate);
boolean hasValueFilter = resultPair.right;
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 56eb8ea082d..5ef8c8d9620 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
@@ -58,8 +58,6 @@ public class IndexScan implements RelationalPlanOptimizer {
static final IoTDBConfig CONFIG = IoTDBDescriptor.getInstance().getConfig();
- private MPPQueryContext mppQueryContext;
-
@Override
public PlanNode optimize(
PlanNode planNode,
@@ -67,14 +65,15 @@ public class IndexScan implements RelationalPlanOptimizer {
Metadata metadata,
IPartitionFetcher partitionFetcher,
SessionInfo sessionInfo,
- MPPQueryContext context) {
+ MPPQueryContext queryContext) {
return planNode.accept(
new Rewriter(),
- new RewriterContext(null, metadata, sessionInfo, analysis, partitionFetcher));
+ new RewriterContext(null, metadata, sessionInfo, analysis, partitionFetcher, queryContext));
}
private static class Rewriter extends PlanVisitor<PlanNode, RewriterContext> {
+
@Override
public PlanNode visitPlan(PlanNode node, RewriterContext context) {
for (PlanNode child : node.getChildren()) {
@@ -109,9 +108,7 @@ public class IndexScan implements RelationalPlanOptimizer {
attributeColumns);
node.setDeviceEntries(deviceEntries);
- // TODO getDataPartition, Change globalTimeFilter to Filter
String treeDatabase = "root." + dbName;
- Filter globalTimeFilter = null;
Set<String> deviceSet = new HashSet<>();
for (DeviceEntry deviceEntry : deviceEntries) {
StringArrayDeviceID arrayDeviceID = (StringArrayDeviceID) deviceEntry.getDeviceID();
@@ -121,7 +118,10 @@ public class IndexScan implements RelationalPlanOptimizer {
DataPartition dataPartition =
fetchDataPartitionByDevices(
- deviceSet, treeDatabase, globalTimeFilter, context.partitionFetcher);
+ deviceSet,
+ treeDatabase,
+ context.getQueryContext().getGlobalTimeFilter(),
+ context.getPartitionFetcher());
context.getAnalysis().setDataPartition(dataPartition);
if (dataPartition.getDataPartitionMap().size() > 1) {
@@ -218,18 +218,21 @@ public class IndexScan implements RelationalPlanOptimizer {
private final SessionInfo sessionInfo;
private final Analysis analysis;
private final IPartitionFetcher partitionFetcher;
+ private final MPPQueryContext queryContext;
RewriterContext(
Expression predicate,
Metadata metadata,
SessionInfo sessionInfo,
Analysis analysis,
- IPartitionFetcher partitionFetcher) {
+ IPartitionFetcher partitionFetcher,
+ MPPQueryContext queryContext) {
this.predicate = predicate;
this.metadata = metadata;
this.sessionInfo = sessionInfo;
this.analysis = analysis;
this.partitionFetcher = partitionFetcher;
+ this.queryContext = queryContext;
}
public Expression getPredicate() {
@@ -255,5 +258,13 @@ public class IndexScan implements RelationalPlanOptimizer {
public Analysis getAnalysis() {
return this.analysis;
}
+
+ public IPartitionFetcher getPartitionFetcher() {
+ return partitionFetcher;
+ }
+
+ public MPPQueryContext getQueryContext() {
+ return queryContext;
+ }
}
}
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 104cdc9ed48..4eb9a17fb43 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
@@ -155,21 +155,29 @@ public class AnalyzerTest {
"db",
IClientSession.SqlDialect.TABLE);
Metadata metadata = new TestMatadata();
+ String sql;
+ Analysis actualAnalysis;
+ MPPQueryContext context;
+ LogicalPlanner logicalPlanner;
+ LogicalQueryPlan logicalQueryPlan;
+ PlanNode rootNode;
+ TableDistributionPlanner distributionPlanner;
+ DistributedQueryPlan distributedQueryPlan;
@Test
public void singleTableNoFilterTest() throws IoTDBException {
// 1. wildcard
- String sql = "SELECT * FROM table1";
- Analysis actualAnalysis = analyzeSQL(sql, metadata);
+ sql = "SELECT * FROM table1";
+ actualAnalysis = analyzeSQL(sql, metadata);
assertNotNull(actualAnalysis);
assertEquals(1, actualAnalysis.getTables().size());
- MPPQueryContext context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
- LogicalPlanner logicalPlanner =
+ context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
+ logicalPlanner =
new LogicalPlanner(
context, metadata, sessionInfo, getFakePartitionFetcher(), WarningCollector.NOOP);
- LogicalQueryPlan logicalQueryPlan = logicalPlanner.plan(actualAnalysis);
- PlanNode rootNode = logicalQueryPlan.getRootNode();
+ logicalQueryPlan = logicalPlanner.plan(actualAnalysis);
+ rootNode = logicalQueryPlan.getRootNode();
assertTrue(rootNode instanceof OutputNode);
assertTrue(((OutputNode) rootNode).getChild() instanceof TableScanNode);
TableScanNode tableScanNode = (TableScanNode) ((OutputNode) rootNode).getChild();
@@ -180,11 +188,13 @@ public class AnalyzerTest {
assertEquals(5, tableScanNode.getIdAndAttributeIndexMap().size());
assertEquals(ASC, tableScanNode.getScanOrder());
- TableDistributionPlanner distributionPlanner =
- new TableDistributionPlanner(actualAnalysis, logicalQueryPlan, context);
+ distributionPlanner = new TableDistributionPlanner(actualAnalysis, logicalQueryPlan, context);
DistributedQueryPlan distributedQueryPlan = distributionPlanner.plan();
assertEquals(4, distributedQueryPlan.getInstances().size());
+ }
+ @Test
+ public void singleTableWithTimeFilterTest() throws IoTDBException {
// 2. global time filter
sql = "SELECT * FROM table1 where time > 1";
actualAnalysis = analyzeSQL(sql, metadata);
@@ -199,7 +209,7 @@ public class AnalyzerTest {
rootNode = logicalQueryPlan.getRootNode();
assertTrue(rootNode instanceof OutputNode);
assertTrue(((OutputNode) rootNode).getChild() instanceof TableScanNode);
- tableScanNode = (TableScanNode) ((OutputNode) rootNode).getChild();
+ TableScanNode tableScanNode = (TableScanNode) ((OutputNode) rootNode).getChild();
assertEquals("table1", tableScanNode.getQualifiedTableName());
assertEquals(8, tableScanNode.getOutputSymbols().size());
assertEquals(8, tableScanNode.getAssignments().size());