This is an automated email from the ASF dual-hosted git repository.
caogaofei pushed a commit to branch ty/TableModelGrammar
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/ty/TableModelGrammar by this
push:
new 88860e73d58 add PredicatePushIntoIndexScanChecker
88860e73d58 is described below
commit 88860e73d580965622646faaeffad55616fb5316
Author: Beyyes <[email protected]>
AuthorDate: Mon Apr 22 12:32:41 2024 +0800
add PredicatePushIntoIndexScanChecker
---
.../planner/optimizations/IndexScan.java | 34 ++++++++++++++++++++--
1 file changed, 32 insertions(+), 2 deletions(-)
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 c704b5e8000..102393d666d 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
@@ -20,6 +20,7 @@ import org.apache.iotdb.common.rpc.thrift.TRegionReplicaSet;
import org.apache.iotdb.common.rpc.thrift.TTimePartitionSlot;
import org.apache.iotdb.commons.partition.DataPartition;
import org.apache.iotdb.commons.partition.DataPartitionQueryParam;
+import org.apache.iotdb.commons.schema.table.column.TsTableColumnCategory;
import org.apache.iotdb.db.conf.IoTDBConfig;
import org.apache.iotdb.db.conf.IoTDBDescriptor;
import org.apache.iotdb.db.queryengine.common.MPPQueryContext;
@@ -29,12 +30,14 @@ import
org.apache.iotdb.db.queryengine.plan.analyze.IPartitionFetcher;
import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNode;
import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanVisitor;
import org.apache.iotdb.db.queryengine.plan.relational.analyzer.Analysis;
+import
org.apache.iotdb.db.queryengine.plan.relational.analyzer.predicate.PredicatePushIntoIndexScanChecker;
import org.apache.iotdb.db.queryengine.plan.relational.metadata.DeviceEntry;
import org.apache.iotdb.db.queryengine.plan.relational.metadata.Metadata;
import
org.apache.iotdb.db.queryengine.plan.relational.metadata.QualifiedObjectName;
import org.apache.iotdb.db.queryengine.plan.relational.planner.node.FilterNode;
import
org.apache.iotdb.db.queryengine.plan.relational.planner.node.TableScanNode;
import org.apache.iotdb.db.relational.sql.tree.Expression;
+import org.apache.iotdb.db.relational.sql.tree.LogicalExpression;
import org.apache.tsfile.file.metadata.StringArrayDeviceID;
import org.apache.tsfile.read.filter.basic.Filter;
@@ -95,7 +98,34 @@ public class IndexScan implements RelationalPlanOptimizer {
.map(e -> e.getKey().getName())
.collect(Collectors.toList());
- // TODO extract predicate to expression list
+ Expression indexExpression = context.getPredicate();
+ if (indexExpression != null) {
+ Set<String> idOrAttributeColumnNames =
+ node.getAssignments().entrySet().stream()
+ .filter(
+ e ->
+
TsTableColumnCategory.ID.equals(e.getValue().getColumnCategory())
+ ||
ATTRIBUTE.equals(e.getValue().getColumnCategory()))
+ .map(e -> e.getKey().getName())
+ .collect(Collectors.toSet());
+ if (indexExpression instanceof LogicalExpression) {
+ for (Expression subExpression : ((LogicalExpression)
indexExpression).getTerms()) {
+ if (Boolean.FALSE.equals(
+ new PredicatePushIntoIndexScanChecker(idOrAttributeColumnNames)
+ .process(subExpression))) {
+ indexExpression = null;
+ break;
+ }
+ }
+ } else {
+ if (Boolean.FALSE.equals(
+ new PredicatePushIntoIndexScanChecker(idOrAttributeColumnNames)
+ .process(indexExpression))) {
+ indexExpression = null;
+ }
+ }
+ }
+
List<DeviceEntry> deviceEntries =
context
.getMetadata()
@@ -103,7 +133,7 @@ public class IndexScan implements RelationalPlanOptimizer {
new QualifiedObjectName(
context.getSessionInfo().getDatabaseName().get(),
node.getQualifiedTableName()),
- Collections.singletonList(context.getPredicate()),
+ Collections.singletonList(indexExpression),
attributeColumns);
node.setDeviceEntries(deviceEntries);