This is an automated email from the ASF dual-hosted git repository. shuwenwei pushed a commit to branch table_disk_usage_statistics in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 687bc24d7403834847276e986d66805cf178032d Author: shuwenwei <[email protected]> AuthorDate: Fri Oct 31 16:42:45 2025 +0800 add pushdown limit offset --- .../InformationSchemaContentSupplierFactory.java | 25 ++++++++++++++++--- .../db/queryengine/plan/analyze/Analysis.java | 5 ++-- .../queryengine/plan/analyze/AnalyzeVisitor.java | 1 + .../queryengine/plan/execution/QueryExecution.java | 5 ++-- .../plan/planner/TableOperatorGenerator.java | 6 ++++- .../plan/AbstractFragmentParallelPlanner.java | 2 +- .../plan/relational/analyzer/Analyzer.java | 3 ++- .../plan/relational/planner/RelationPlanner.java | 28 ++++++++++++++-------- .../rule/PushDownOffsetIntoTableScan.java | 19 +++++++-------- .../PushLimitOffsetIntoTableScan.java | 10 ++++---- .../optimizations/PushPredicateIntoTableScan.java | 8 +------ .../plan/relational/sql/rewrite/ShowRewrite.java | 21 ++++++++++------ .../relational/sql/rewrite/StatementRewrite.java | 15 +++++++++--- .../commons/schema/table/InformationSchema.java | 14 ++++++++++- 14 files changed, 109 insertions(+), 53 deletions(-) diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/InformationSchemaContentSupplierFactory.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/InformationSchemaContentSupplierFactory.java index 34916639f40..d2a5cb21ca3 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/InformationSchemaContentSupplierFactory.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/InformationSchemaContentSupplierFactory.java @@ -94,6 +94,7 @@ import org.apache.tsfile.read.common.block.TsBlock; import org.apache.tsfile.read.common.block.TsBlockBuilder; import org.apache.tsfile.read.common.block.column.RunLengthEncodedColumn; import org.apache.tsfile.read.filter.basic.Filter; +import org.apache.tsfile.read.reader.series.PaginationController; import org.apache.tsfile.utils.Binary; import org.apache.tsfile.utils.BytesUtils; import org.apache.tsfile.utils.Pair; @@ -140,7 +141,8 @@ public class InformationSchemaContentSupplierFactory { final String tableName, final List<TSDataType> dataTypes, final UserEntity userEntity, - final Filter pushDownFilter) { + final Filter pushDownFilter, + final PaginationController paginationController) { try { switch (tableName) { case InformationSchema.QUERIES: @@ -178,7 +180,8 @@ public class InformationSchemaContentSupplierFactory { case InformationSchema.DATA_NODES: return new DataNodesSupplier(dataTypes, userEntity); case InformationSchema.TABLE_DISK_USAGE: - return new TableDiskUsageSupplier(dataTypes, userEntity, pushDownFilter); + return new TableDiskUsageSupplier( + dataTypes, userEntity, pushDownFilter, paginationController); default: throw new UnsupportedOperationException("Unknown table: " + tableName); } @@ -1242,6 +1245,7 @@ public class InformationSchemaContentSupplierFactory { private final List<TSDataType> dataTypes; private final Map<String, List<TTableInfo>> databaseTableInfoMap; private final Filter pushDownFilter; + private final PaginationController paginationController; private DataRegion currentDataRegion; private long currentTimePartition; @@ -1251,10 +1255,14 @@ public class InformationSchemaContentSupplierFactory { private final StorageEngineTimePartitionIterator timePartitionIterator; private TableDiskUsageSupplier( - final List<TSDataType> dataTypes, final UserEntity userEntity, Filter pushDownFilter) + final List<TSDataType> dataTypes, + final UserEntity userEntity, + Filter pushDownFilter, + PaginationController paginationController) throws TException, ClientManagerException { this.dataTypes = dataTypes; this.pushDownFilter = pushDownFilter; + this.paginationController = paginationController; AuthorityChecker.getAccessControl().checkUserGlobalSysPrivilege(userEntity); try (final ConfigNodeClient client = ConfigNodeClientManager.getInstance().borrowClient(ConfigNodeInfo.CONFIG_REGION_ID)) { @@ -1280,6 +1288,9 @@ public class InformationSchemaContentSupplierFactory { @Override public boolean hasNext() { + if (!paginationController.hasCurLimit()) { + return false; + } if (statisticUtil != null) { return true; } @@ -1347,6 +1358,13 @@ public class InformationSchemaContentSupplierFactory { long[] resultArr = statisticUtil.getResult(); for (int i = 0; i < currentTablesToScan.size(); i++) { + if (paginationController.hasCurOffset()) { + paginationController.consumeOffset(); + continue; + } + if (!paginationController.hasCurLimit()) { + break; + } builder.getTimeColumnBuilder().writeLong(0); ColumnBuilder[] columns = builder.getValueColumnBuilders(); @@ -1358,6 +1376,7 @@ public class InformationSchemaContentSupplierFactory { columns[4].writeLong(currentTimePartition); columns[5].writeLong(resultArr[i]); builder.declarePosition(); + paginationController.consumeLimit(); } closeStatisticUtil(); return builder.build(); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/Analysis.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/Analysis.java index 1aef8ca3982..72a7afdee3b 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/Analysis.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/Analysis.java @@ -509,8 +509,9 @@ public class Analysis implements IAnalysis { @Override public boolean needSetHighestPriority() { - // if is this Statement is ShowQueryStatement, set its instances to the highest priority, so - // that the sub-tasks of the ShowQueries instances could be executed first. + // if is this Statement is ShowQueryStatement or ShowDiskUsageStatement, set its instances to + // the highest priority, so + // that the sub-tasks of the instances could be executed first. return StatementType.SHOW_QUERIES.equals(statement.getType()) || StatementType.SHOW_DISK_USAGE.equals(statement.getType()); } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java index 4ec8fe588dc..47435364c2a 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java @@ -3790,6 +3790,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> @Override public Analysis visitShowDiskUsage( ShowDiskUsageStatement showDiskUsageStatement, MPPQueryContext context) { + context.setTimeOut(Long.MAX_VALUE); Analysis analysis = new Analysis(); analysis.setRealStatement(showDiskUsageStatement); analysis.setRespDatasetHeader(DatasetHeaderFactory.getShowDiskUsageHeader()); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/QueryExecution.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/QueryExecution.java index 2c1657e839e..e71b10b4416 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/QueryExecution.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/QueryExecution.java @@ -286,8 +286,9 @@ public class QueryExecution implements IQueryExecution { public void doDistributedPlan() { this.distributedPlan = planner.doDistributionPlan(analysis, logicalPlan, context); - // if is this Statement is ShowQueryStatement, set its instances to the highest priority, so - // that the sub-tasks of the ShowQueries instances could be executed first. + // if is this Statement is ShowQueryStatement or ShowDiskUsageStatement, set its instances to + // the highest priority, so + // that the sub-tasks of the instances could be executed first. if (analysis.needSetHighestPriority()) { distributedPlan.getInstances().forEach(instance -> instance.setHighestPriority(true)); } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TableOperatorGenerator.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TableOperatorGenerator.java index 1890d58d006..0db3dd3d557 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TableOperatorGenerator.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TableOperatorGenerator.java @@ -270,6 +270,7 @@ import org.apache.tsfile.read.common.type.BooleanType; import org.apache.tsfile.read.common.type.Type; import org.apache.tsfile.read.common.type.TypeFactory; import org.apache.tsfile.read.filter.basic.Filter; +import org.apache.tsfile.read.reader.series.PaginationController; import org.apache.tsfile.utils.Binary; import org.apache.tsfile.utils.Pair; import org.apache.tsfile.utils.TsPrimitiveType; @@ -1299,6 +1300,8 @@ public class TableOperatorGenerator extends PlanVisitor<Operator, LocalExecution context.getZoneId(), TimestampPrecisionUtils.currPrecision); } + PaginationController paginationController = + new PaginationController(node.getPushDownLimit(), node.getPushDownOffset()); final List<TSDataType> dataTypes = node.getOutputSymbols().stream() @@ -1316,7 +1319,8 @@ public class TableOperatorGenerator extends PlanVisitor<Operator, LocalExecution .getFragmentInstanceContext() .getSessionInfo() .getUserEntity(), - pushDownFilter)); + pushDownFilter, + paginationController)); } @Override diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/AbstractFragmentParallelPlanner.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/AbstractFragmentParallelPlanner.java index d7415320e04..0dcc7018fc6 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/AbstractFragmentParallelPlanner.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/AbstractFragmentParallelPlanner.java @@ -85,7 +85,7 @@ public abstract class AbstractFragmentParallelPlanner implements IFragmentParall if (regionReplicaSet == null || regionReplicaSet.getRegionId() == null) { TDataNodeLocation dataNodeLocation = fragment.getTargetLocation(); if (dataNodeLocation != null) { - // now only the case ShowQueries will enter here + // now only the case ShowQueries and ShowDiskUsage will enter here fragmentInstance.setExecutorAndHost(new QueryExecutor(dataNodeLocation)); } else { // no data region && no dataNodeLocation, we need to execute this FI on local diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/Analyzer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/Analyzer.java index 3f7c5322c8e..5b21d8ffecf 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/Analyzer.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/Analyzer.java @@ -77,7 +77,8 @@ public class Analyzer { statement, parameters, parameterLookup, - warningCollector); + warningCollector, + context); Analysis analysis = new Analysis(rewrittenStatement, parameterLookup); Statement innerStatement = 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 af823554b7b..af42677b565 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 @@ -19,6 +19,7 @@ package org.apache.iotdb.db.queryengine.plan.relational.planner; +import org.apache.iotdb.commons.schema.table.InformationSchema; import org.apache.iotdb.commons.schema.table.column.TsTableColumnCategory; import org.apache.iotdb.db.exception.sql.SemanticException; import org.apache.iotdb.db.queryengine.common.MPPQueryContext; @@ -311,16 +312,23 @@ public class RelationPlanner extends AstVisitor<RelationPlan, Void> { outerContext); } - TableScanNode tableScanNode = - qualifiedObjectName.getDatabaseName().equals(INFORMATION_DATABASE) - ? new InformationSchemaTableScanNode( - idAllocator.genPlanNodeId(), qualifiedObjectName, outputSymbols, tableColumnSchema) - : new DeviceTableScanNode( - idAllocator.genPlanNodeId(), - qualifiedObjectName, - outputSymbols, - tableColumnSchema, - tagAndAttributeIndexMap); + TableScanNode tableScanNode; + if (qualifiedObjectName.getDatabaseName().equals(INFORMATION_DATABASE)) { + tableScanNode = + new InformationSchemaTableScanNode( + idAllocator.genPlanNodeId(), qualifiedObjectName, outputSymbols, tableColumnSchema); + if (InformationSchema.hasUnlimitedQueryTimeOut(qualifiedObjectName.getObjectName())) { + queryContext.setTimeOut(Long.MAX_VALUE); + } + } else { + tableScanNode = + new DeviceTableScanNode( + idAllocator.genPlanNodeId(), + qualifiedObjectName, + outputSymbols, + tableColumnSchema, + tagAndAttributeIndexMap); + } return new RelationPlan(tableScanNode, scope, outputSymbols, outerContext); // Collection<Field> fields = analysis.getMaterializedViewStorageTableFields(node); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/iterative/rule/PushDownOffsetIntoTableScan.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/iterative/rule/PushDownOffsetIntoTableScan.java index d683dbe3fdb..03bdc9d94ba 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/iterative/rule/PushDownOffsetIntoTableScan.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/iterative/rule/PushDownOffsetIntoTableScan.java @@ -54,16 +54,15 @@ public class PushDownOffsetIntoTableScan implements Rule<OffsetNode> { public Result apply(OffsetNode parent, Captures captures, Context context) { TableScanNode tableScanNode = captures.get(CHILD); if (tableScanNode instanceof DeviceTableScanNode - && !((DeviceTableScanNode) tableScanNode).isPushLimitToEachDevice()) { - tableScanNode.setPushDownOffset(parent.getCount()); - // consider case that there is no limit - tableScanNode.setPushDownLimit( - tableScanNode.getPushDownLimit() == 0 - ? 0 - : tableScanNode.getPushDownLimit() - parent.getCount()); - return Result.ofPlanNode(tableScanNode); + && ((DeviceTableScanNode) tableScanNode).isPushLimitToEachDevice()) { + return Result.empty(); } - - return Result.empty(); + tableScanNode.setPushDownOffset(parent.getCount()); + // consider case that there is no limit + tableScanNode.setPushDownLimit( + tableScanNode.getPushDownLimit() == 0 + ? 0 + : tableScanNode.getPushDownLimit() - parent.getCount()); + return Result.ofPlanNode(tableScanNode); } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushLimitOffsetIntoTableScan.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushLimitOffsetIntoTableScan.java index b58ee1874ac..70daf444bf2 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushLimitOffsetIntoTableScan.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushLimitOffsetIntoTableScan.java @@ -186,6 +186,11 @@ public class PushLimitOffsetIntoTableScan implements PlanOptimizer { TableScanNode tableScanNode = subContext.tableScanNode; context.tableScanNode = tableScanNode; + + if (!(tableScanNode instanceof DeviceTableScanNode)) { + context.enablePushDown = false; + return node; + } OrderingScheme orderingScheme = node.getOrderingScheme(); Map<Symbol, ColumnSchema> tableColumnSchema = analysis.getTableColumnSchema(tableScanNode.getQualifiedObjectName()); @@ -205,11 +210,6 @@ public class PushLimitOffsetIntoTableScan implements PlanOptimizer { sortSymbols.add(orderBy); } - if (!(tableScanNode instanceof DeviceTableScanNode)) { - context.enablePushDown = false; - return node; - } - boolean pushLimitToEachDevice = false; for (Map.Entry<Symbol, ColumnSchema> entry : tableColumnSchema.entrySet()) { if (entry.getValue().getColumnCategory() == TsTableColumnCategory.TAG 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 39449a5a191..363d8f7da87 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 @@ -449,13 +449,7 @@ public class PushPredicateIntoTableScan implements PlanOptimizer { if (TRUE_LITERAL.equals(context.inheritedPredicate)) { return node; } - switch (node.getQualifiedObjectName().getObjectName()) { - // information tables that supports pushdown predicate - case InformationSchema.TABLE_DISK_USAGE: - return combineFilterAndScan(node, context.inheritedPredicate); - default: - return node; - } + return combineFilterAndScan(node, context.inheritedPredicate); } @Override diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/rewrite/ShowRewrite.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/rewrite/ShowRewrite.java index 3ab705341f6..f3235f2f304 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/rewrite/ShowRewrite.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/rewrite/ShowRewrite.java @@ -21,6 +21,7 @@ package org.apache.iotdb.db.queryengine.plan.relational.sql.rewrite; import org.apache.iotdb.commons.schema.column.ColumnHeaderConstant; import org.apache.iotdb.commons.udf.builtin.relational.TableBuiltinAggregationFunction; +import org.apache.iotdb.db.queryengine.common.MPPQueryContext; import org.apache.iotdb.db.queryengine.common.SessionInfo; import org.apache.iotdb.db.queryengine.execution.warnings.WarningCollector; import org.apache.iotdb.db.queryengine.plan.relational.analyzer.NodeRef; @@ -63,20 +64,24 @@ public final class ShowRewrite implements StatementRewrite.Rewrite { final Statement node, final List<Expression> parameters, final Map<NodeRef<Parameter>, Expression> parameterLookup, - final WarningCollector warningCollector) { + final WarningCollector warningCollector, + final MPPQueryContext queryContext) { final Visitor visitor = new Visitor(); return (Statement) visitor.process(node, null); } - private static class Visitor extends AstVisitor<Node, Void> { + private static class Visitor extends AstVisitor<Node, MPPQueryContext> { @Override - protected Node visitShowQueriesStatement(ShowQueriesStatement node, Void context) { + protected Node visitShowQueriesStatement(ShowQueriesStatement node, MPPQueryContext context) { return visitShowStatement(node, context); } @Override - protected Node visitShowDiskUsageOfTable(ShowDiskUsageOfTable node, Void context) { + protected Node visitShowDiskUsageOfTable(ShowDiskUsageOfTable node, MPPQueryContext context) { + if (context != null) { + context.setTimeOut(Long.MAX_VALUE); + } return simpleQuery( selectList( new SingleColumn(new Identifier(ColumnHeaderConstant.NODE_ID_TABLE_MODEL)), @@ -103,7 +108,8 @@ public final class ShowRewrite implements StatementRewrite.Rewrite { } @Override - protected Node visitShowStatement(final ShowStatement showStatement, final Void context) { + protected Node visitShowStatement( + final ShowStatement showStatement, final MPPQueryContext context) { return simpleQuery( selectList(new AllColumns()), from(INFORMATION_DATABASE, showStatement.getTableName()), @@ -117,7 +123,8 @@ public final class ShowRewrite implements StatementRewrite.Rewrite { } @Override - protected Node visitCountStatement(final CountStatement countStatement, final Void context) { + protected Node visitCountStatement( + final CountStatement countStatement, final MPPQueryContext context) { return simpleQuery( new Select( false, @@ -142,7 +149,7 @@ public final class ShowRewrite implements StatementRewrite.Rewrite { } @Override - protected Node visitNode(final Node node, final Void context) { + protected Node visitNode(final Node node, final MPPQueryContext context) { return node; } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/rewrite/StatementRewrite.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/rewrite/StatementRewrite.java index 66bcd5f4ef1..000341fb6cb 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/rewrite/StatementRewrite.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/rewrite/StatementRewrite.java @@ -19,6 +19,7 @@ package org.apache.iotdb.db.queryengine.plan.relational.sql.rewrite; +import org.apache.iotdb.db.queryengine.common.MPPQueryContext; import org.apache.iotdb.db.queryengine.common.SessionInfo; import org.apache.iotdb.db.queryengine.execution.warnings.WarningCollector; import org.apache.iotdb.db.queryengine.plan.relational.analyzer.NodeRef; @@ -48,12 +49,19 @@ public final class StatementRewrite { Statement node, List<Expression> parameters, Map<NodeRef<Parameter>, Expression> parameterLookup, - WarningCollector warningCollector) { + WarningCollector warningCollector, + MPPQueryContext queryContext) { for (Rewrite rewrite : rewrites) { node = requireNonNull( rewrite.rewrite( - analyzerFactory, session, node, parameters, parameterLookup, warningCollector), + analyzerFactory, + session, + node, + parameters, + parameterLookup, + warningCollector, + queryContext), "Statement rewrite returned null"); } return node; @@ -66,7 +74,8 @@ public final class StatementRewrite { Statement node, List<Expression> parameters, Map<NodeRef<Parameter>, Expression> parameterLookup, - WarningCollector warningCollector); + WarningCollector warningCollector, + MPPQueryContext queryContext); } public static final StatementRewrite NOOP = new StatementRewrite(ImmutableSet.of()); diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/table/InformationSchema.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/table/InformationSchema.java index a237b7c6dd5..4a1200c33d7 100644 --- a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/table/InformationSchema.java +++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/table/InformationSchema.java @@ -24,11 +24,12 @@ import org.apache.iotdb.commons.schema.table.column.AttributeColumnSchema; import org.apache.iotdb.commons.schema.table.column.FieldColumnSchema; import org.apache.iotdb.commons.schema.table.column.TagColumnSchema; -import org.apache.ratis.thirdparty.com.google.common.collect.ImmutableSet; +import com.google.common.collect.ImmutableSet; import org.apache.tsfile.enums.TSDataType; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.Locale; import java.util.Map; import java.util.Set; @@ -38,6 +39,7 @@ public class InformationSchema { private static final Map<String, TsTable> schemaTables = new HashMap<>(); private static final Map<String, Set<String>> columnsThatSupportPushDownPredicate = new HashMap<>(); + private static final Set<String> tablesThatSupportPushDownLimitOffset = new HashSet<>(); public static final String QUERIES = "queries"; public static final String DATABASES = "databases"; @@ -396,6 +398,8 @@ public class InformationSchema { ColumnHeaderConstant.NODE_ID_TABLE_MODEL, ColumnHeaderConstant.REGION_ID_TABLE_MODEL, ColumnHeaderConstant.TIME_PARTITION_TABLE_MODEL)); + + tablesThatSupportPushDownLimitOffset.add(TABLE_DISK_USAGE); } public static Map<String, TsTable> getSchemaTables() { @@ -406,6 +410,14 @@ public class InformationSchema { return columnsThatSupportPushDownPredicate.getOrDefault(tableName, Collections.emptySet()); } + public static boolean supportsPushDownLimitOffset(String tableName) { + return columnsThatSupportPushDownPredicate.containsKey(tableName); + } + + public static boolean hasUnlimitedQueryTimeOut(String tableName) { + return tableName.equals(TABLE_DISK_USAGE); + } + private InformationSchema() { // Utils }
