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);
