This is an automated email from the ASF dual-hosted git repository.

caogaofei pushed a commit to branch fix_attribute_filter
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 5729301f1981f560838f5aa22ec461d8c7a7f677
Author: Beyyes <[email protected]>
AuthorDate: Thu Aug 15 20:34:19 2024 +0800

    Fix the usage of idAndAttributeIndexMap in TableScanNode
---
 .../plan/relational/planner/RelationPlanner.java   |  4 +-
 .../relational/planner/node/TableScanNode.java     |  4 --
 .../optimizations/PushPredicateIntoTableScan.java  | 44 ++++++++++++----------
 3 files changed, 25 insertions(+), 27 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/RelationPlanner.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/RelationPlanner.java
index 9bc61233add..cdfb2023ae9 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/RelationPlanner.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/RelationPlanner.java
@@ -131,7 +131,7 @@ public class RelationPlanner extends 
AstVisitor<RelationPlan, Void> {
     // on the basis of that the order of fields is same with the column 
category order of segments
     // in DeviceEntry
     Map<Symbol, Integer> idAndAttributeIndexMap = new HashMap<>();
-    int idIndex = 0, attributeIndex = 0;
+    int idIndex = 0;
     for (Field field : fields) {
       Symbol symbol = symbolAllocator.newSymbol(field);
       outputSymbolsBuilder.add(symbol);
@@ -142,8 +142,6 @@ public class RelationPlanner extends 
AstVisitor<RelationPlan, Void> {
               field.getName().orElse(null), field.getType(), field.isHidden(), 
category));
       if (category == TsTableColumnCategory.ID) {
         idAndAttributeIndexMap.put(symbol, idIndex++);
-      } else if (category == TsTableColumnCategory.ATTRIBUTE) {
-        idAndAttributeIndexMap.put(symbol, attributeIndex++);
       }
     }
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/TableScanNode.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/TableScanNode.java
index 770ab775c05..0e575f5dbd5 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/TableScanNode.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/TableScanNode.java
@@ -371,10 +371,6 @@ public class TableScanNode extends SourceNode {
     this.outputSymbols = outputSymbols;
   }
 
-  public void setAssignments(Map<Symbol, ColumnSchema> assignments) {
-    this.assignments = assignments;
-  }
-
   public Map<Symbol, ColumnSchema> getAssignments() {
     return this.assignments;
   }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushPredicateIntoTableScan.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushPredicateIntoTableScan.java
index 0fc783013ce..c71a6db6048 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushPredicateIntoTableScan.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushPredicateIntoTableScan.java
@@ -30,6 +30,7 @@ import 
org.apache.iotdb.db.queryengine.plan.relational.analyzer.Analysis;
 import 
org.apache.iotdb.db.queryengine.plan.relational.analyzer.predicate.ConvertPredicateToTimeFilterVisitor;
 import 
org.apache.iotdb.db.queryengine.plan.relational.analyzer.predicate.PredicateCombineIntoTableScanChecker;
 import 
org.apache.iotdb.db.queryengine.plan.relational.analyzer.predicate.PredicatePushIntoMetadataChecker;
+import org.apache.iotdb.db.queryengine.plan.relational.metadata.ColumnSchema;
 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.planner.Symbol;
@@ -45,16 +46,17 @@ import org.apache.tsfile.utils.Pair;
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
-import java.util.Locale;
+import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
 
 import static java.util.Objects.requireNonNull;
 import static 
org.apache.iotdb.commons.schema.table.column.TsTableColumnCategory.ATTRIBUTE;
 import static 
org.apache.iotdb.commons.schema.table.column.TsTableColumnCategory.MEASUREMENT;
+import static 
org.apache.iotdb.commons.schema.table.column.TsTableColumnCategory.TIME;
 import static 
org.apache.iotdb.db.queryengine.plan.analyze.AnalyzeVisitor.getTimePartitionSlotList;
-import static 
org.apache.iotdb.db.queryengine.plan.expression.leaf.TimestampOperand.TIMESTAMP_EXPRESSION_STRING;
 import static 
org.apache.iotdb.db.queryengine.plan.relational.planner.ir.GlobalTimePredicateExtractVisitor.extractGlobalTimeFilter;
 
 /**
@@ -199,18 +201,18 @@ public class PushPredicateIntoTableScan implements 
PlanOptimizer {
     }
 
     private SplitExpression splitPredicate(TableScanNode node) {
-
-      Set<String> idOrAttributeColumnNames =
-          node.getIdAndAttributeIndexMap().keySet().stream()
-              .map(Symbol::getName)
-              .collect(Collectors.toSet());
-
-      Set<String> measurementColumnNames =
-          node.getAssignments().entrySet().stream()
-              .filter(e -> 
MEASUREMENT.equals(e.getValue().getColumnCategory()))
-              .map(e -> e.getKey().getName())
-              .collect(Collectors.toSet());
-      
measurementColumnNames.add(TIMESTAMP_EXPRESSION_STRING.toLowerCase(Locale.ENGLISH));
+      Set<String> idOrAttributeColumnNames = new HashSet<>();
+      Set<String> measurementColumnNames = new HashSet<>();
+      for (Map.Entry<Symbol, ColumnSchema> entry : 
node.getAssignments().entrySet()) {
+        Symbol columnSymbol = entry.getKey();
+        ColumnSchema columnSchema = entry.getValue();
+        if (MEASUREMENT.equals(columnSchema.getColumnCategory())
+            || TIME.equals(columnSchema.getColumnCategory())) {
+          measurementColumnNames.add(columnSymbol.getName());
+        } else {
+          idOrAttributeColumnNames.add(columnSymbol.getName());
+        }
+      }
 
       List<Expression> metadataExpressions = new ArrayList<>();
       List<Expression> expressionsCanPushDown = new ArrayList<>();
@@ -264,12 +266,14 @@ public class PushPredicateIntoTableScan implements 
PlanOptimizer {
 
     /** Get deviceEntries and DataPartition used in TableScan. */
     private void tableMetadataIndexScan(TableScanNode node, List<Expression> 
metadataExpressions) {
-      List<String> attributeColumns =
-          node.getOutputSymbols().stream()
-              .filter(
-                  symbol -> 
ATTRIBUTE.equals(node.getAssignments().get(symbol).getColumnCategory()))
-              .map(Symbol::getName)
-              .collect(Collectors.toList());
+      List<String> attributeColumns = new ArrayList<>();
+      int attributeIndex = 0;
+      for (Symbol columnName : node.getAssignments().keySet()) {
+        if 
(ATTRIBUTE.equals(node.getAssignments().get(columnName).getColumnCategory())) {
+          attributeColumns.add(columnName.getName());
+          node.getIdAndAttributeIndexMap().put(columnName, attributeIndex++);
+        }
+      }
       List<DeviceEntry> deviceEntries =
           metadata.indexScan(
               node.getQualifiedObjectName(), metadataExpressions, 
attributeColumns, queryContext);

Reply via email to