This is an automated email from the ASF dual-hosted git repository. Wei-hao-Li pushed a commit to branch mvTableScanNode in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 003ed8ff39880087b278f5dd0f9aa8ccfb0bad01 Author: Weihao Li <[email protected]> AuthorDate: Sat May 9 16:06:41 2026 +0800 fix Signed-off-by: Weihao Li <[email protected]> --- .../plan/relational/metadata/QualifiedObjectName.java | 18 ++++++++++++------ .../plan/relational/planner/node/TableScanNode.java | 18 +++--------------- .../optimizations/PushAggregationIntoTableScan.java | 16 +++++++++++++++- 3 files changed, 30 insertions(+), 22 deletions(-) diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/QualifiedObjectName.java b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/QualifiedObjectName.java similarity index 88% rename from iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/QualifiedObjectName.java rename to iotdb-core/calc-commons/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/QualifiedObjectName.java index 76446cdf648..8082d759eff 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/QualifiedObjectName.java +++ b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/QualifiedObjectName.java @@ -21,13 +21,13 @@ package org.apache.iotdb.db.queryengine.plan.relational.metadata; import com.google.errorprone.annotations.Immutable; +import java.util.Locale; import java.util.Objects; import java.util.regex.Matcher; import java.util.regex.Pattern; import static com.google.common.base.Preconditions.checkArgument; import static java.util.Objects.requireNonNull; -import static org.apache.iotdb.db.queryengine.plan.relational.metadata.MetadataUtil.checkObjectName; @Immutable public class QualifiedObjectName { @@ -50,7 +50,8 @@ public class QualifiedObjectName { private final String objectName; public QualifiedObjectName(String dbName, String objectName) { - checkObjectName(dbName, objectName); + checkLowerCase(dbName, "dbName"); + checkLowerCase(objectName, "objectName"); this.dbName = dbName; this.objectName = objectName; } @@ -63,10 +64,6 @@ public class QualifiedObjectName { return objectName; } - public QualifiedTablePrefix asQualifiedTablePrefix() { - return new QualifiedTablePrefix(dbName, objectName); - } - @Override public boolean equals(Object obj) { if (obj == this) { @@ -103,4 +100,13 @@ public class QualifiedObjectName { } return "\"" + name.replace("\"", "\"\"") + "\""; } + + private static String checkLowerCase(String value, String name) { + if (value == null) { + throw new NullPointerException(String.format("%s is null", name)); + } + checkArgument( + value.equals(value.toLowerCase(Locale.ENGLISH)), "%s is not lowercase: %s", name, value); + return value; + } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/TableScanNode.java b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/TableScanNode.java similarity index 93% rename from iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/TableScanNode.java rename to iotdb-core/calc-commons/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/TableScanNode.java index 79ed9dd09f7..c9ac4107de5 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/TableScanNode.java +++ b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/TableScanNode.java @@ -20,7 +20,7 @@ package org.apache.iotdb.db.queryengine.plan.relational.planner.node; import org.apache.iotdb.common.rpc.thrift.TRegionReplicaSet; -import org.apache.iotdb.commons.queryengine.common.SessionInfo; +import org.apache.iotdb.commons.queryengine.plan.planner.plan.node.ICoreQueryPlanVisitor; import org.apache.iotdb.commons.queryengine.plan.planner.plan.node.IPlanVisitor; import org.apache.iotdb.commons.queryengine.plan.planner.plan.node.PlanNode; import org.apache.iotdb.commons.queryengine.plan.planner.plan.node.PlanNodeId; @@ -28,9 +28,6 @@ import org.apache.iotdb.commons.queryengine.plan.planner.plan.node.source.Source import org.apache.iotdb.commons.queryengine.plan.relational.metadata.ColumnSchema; import org.apache.iotdb.commons.queryengine.plan.relational.planner.Symbol; import org.apache.iotdb.commons.queryengine.plan.relational.sql.ast.Expression; -import org.apache.iotdb.commons.schema.table.column.TsTableColumnCategory; -import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanVisitor; -import org.apache.iotdb.db.queryengine.plan.relational.metadata.Metadata; import org.apache.iotdb.db.queryengine.plan.relational.metadata.QualifiedObjectName; import com.google.common.collect.ImmutableList; @@ -107,8 +104,9 @@ public abstract class TableScanNode extends SourceNode { protected TableScanNode() {} @Override + @SuppressWarnings("unchecked") public <R, C> R accept(IPlanVisitor<R, C> visitor, C context) { - return ((PlanVisitor<R, C>) visitor).visitTableScan(this, context); + return ((ICoreQueryPlanVisitor<R, C>) visitor).visitSourceNode(this, context); } @Override @@ -129,16 +127,6 @@ public abstract class TableScanNode extends SourceNode { return outputSymbols.stream().map(Symbol::getName).collect(Collectors.toList()); } - public List<Symbol> getIdColumnsInTableStore(Metadata metadata, SessionInfo session) { - return Objects.requireNonNull( - metadata.getTableSchema(session, qualifiedObjectName).orElse(null)) - .getColumns() - .stream() - .filter(columnSchema -> columnSchema.getColumnCategory() == TsTableColumnCategory.TAG) - .map(columnSchema -> Symbol.of(columnSchema.getName())) - .collect(Collectors.toList()); - } - public boolean isMeasurementOrTimeColumn(Symbol symbol) { ColumnSchema columnSchema = assignments.get(symbol); return columnSchema != null diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushAggregationIntoTableScan.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushAggregationIntoTableScan.java index 99a3aca6c5a..1f0ae3363f5 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushAggregationIntoTableScan.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushAggregationIntoTableScan.java @@ -42,7 +42,10 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; +import static org.apache.iotdb.commons.schema.table.column.TsTableColumnCategory.TAG; import static org.apache.iotdb.db.queryengine.plan.relational.planner.node.AggregationTableScanNode.combineAggregationAndTableScan; import static org.apache.iotdb.db.queryengine.plan.relational.planner.optimizations.Util.split; @@ -190,7 +193,7 @@ public class PushAggregationIntoTableScan implements PlanOptimizer { return PushDownLevel.NOOP; } else if (singleDeviceEntry || ImmutableSet.copyOf(groupingKeys) - .containsAll(tableScanNode.getIdColumnsInTableStore(metadata, session))) { + .containsAll(getIdColumnsInTableStore(tableScanNode, metadata, session))) { // If all ID columns appear in groupingKeys and no Measurement column appears, we can push // down completely. return PushDownLevel.COMPLETE; @@ -199,6 +202,17 @@ public class PushAggregationIntoTableScan implements PlanOptimizer { } } + private List<Symbol> getIdColumnsInTableStore( + DeviceTableScanNode tableScanNode, Metadata metadata, SessionInfo session) { + return Objects.requireNonNull( + metadata.getTableSchema(session, tableScanNode.getQualifiedObjectName()).orElse(null)) + .getColumns() + .stream() + .filter(columnSchema -> columnSchema.getColumnCategory() == TAG) + .map(columnSchema -> Symbol.of(columnSchema.getName())) + .collect(Collectors.toList()); + } + private boolean isDateBinFunctionOfTime( Expression expression, List<FunctionCall> dateBinFunctionsOfTime,
