This is an automated email from the ASF dual-hosted git repository. hui pushed a commit to branch lmh/fixLimitOffsetPushdown in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 6a1b8df05a2b77a24cf463583852bfac6e6d0a95 Author: Minghui Liu <[email protected]> AuthorDate: Sun Jun 9 23:36:38 2024 +0800 fix --- .../plan/planner/OperatorTreeGenerator.java | 103 ++++++++++++++++----- 1 file changed, 78 insertions(+), 25 deletions(-) diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/OperatorTreeGenerator.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/OperatorTreeGenerator.java index 26a7ab2aa27..e97e28bcc12 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/OperatorTreeGenerator.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/OperatorTreeGenerator.java @@ -343,8 +343,6 @@ public class OperatorTreeGenerator extends PlanVisitor<Operator, LocalExecutionP SeriesScanOptions.Builder scanOptionsBuilder = getSeriesScanOptionsBuilder(context); scanOptionsBuilder.withAllSensors( context.getAllSensors(seriesPath.getDevice(), seriesPath.getMeasurement())); - scanOptionsBuilder.withPushDownLimit(node.getPushDownLimit()); - scanOptionsBuilder.withPushDownOffset(node.getPushDownOffset()); Expression pushDownPredicate = node.getPushDownPredicate(); boolean predicateCanPushIntoScan = canPushIntoScan(pushDownPredicate); @@ -356,6 +354,8 @@ public class OperatorTreeGenerator extends PlanVisitor<Operator, LocalExecutionP context.getTypeProvider().getTemplatedInfo() != null, context.getTypeProvider(), context.getZoneId())); + scanOptionsBuilder.withPushDownLimit(node.getPushDownLimit()); + scanOptionsBuilder.withPushDownOffset(node.getPushDownOffset()); } OperatorContext operatorContext = @@ -380,17 +380,43 @@ public class OperatorTreeGenerator extends PlanVisitor<Operator, LocalExecutionP if (!predicateCanPushIntoScan) { checkState(!context.isBuildPlanUseTemplate(), "Push down predicate is not supported yet"); - return constructFilterOperator( - pushDownPredicate, - seriesScanOperator, - Collections.singletonList(ExpressionFactory.timeSeries(node.getSeriesPath())) - .toArray(new Expression[0]), - Collections.singletonList(node.getSeriesPath().getSeriesType()), - makeLayout(Collections.singletonList(node)), - false, - node.getPlanNodeId(), - node.getScanOrder(), - context); + Operator rootOperator = + constructFilterOperator( + pushDownPredicate, + seriesScanOperator, + Collections.singletonList(ExpressionFactory.timeSeries(node.getSeriesPath())) + .toArray(new Expression[0]), + Collections.singletonList(node.getSeriesPath().getSeriesType()), + makeLayout(Collections.singletonList(node)), + false, + node.getPlanNodeId(), + node.getScanOrder(), + context); + if (node.getPushDownOffset() > 0) { + rootOperator = + new OffsetOperator( + context + .getDriverContext() + .addOperatorContext( + context.getNextOperatorId(), + node.getPlanNodeId(), + OffsetOperator.class.getSimpleName()), + node.getPushDownOffset(), + rootOperator); + } + if (node.getPushDownLimit() > 0) { + rootOperator = + new LimitOperator( + context + .getDriverContext() + .addOperatorContext( + context.getNextOperatorId(), + node.getPlanNodeId(), + LimitOperator.class.getSimpleName()), + node.getPushDownLimit(), + rootOperator); + } + return rootOperator; } return seriesScanOperator; } @@ -401,8 +427,6 @@ public class OperatorTreeGenerator extends PlanVisitor<Operator, LocalExecutionP AlignedPath seriesPath = node.getAlignedPath(); SeriesScanOptions.Builder scanOptionsBuilder = getSeriesScanOptionsBuilder(context); - scanOptionsBuilder.withPushDownLimit(node.getPushDownLimit()); - scanOptionsBuilder.withPushDownOffset(node.getPushDownOffset()); scanOptionsBuilder.withAllSensors( new HashSet<>( context.isBuildPlanUseTemplate() @@ -419,6 +443,8 @@ public class OperatorTreeGenerator extends PlanVisitor<Operator, LocalExecutionP context.getTypeProvider().getTemplatedInfo() != null, context.getTypeProvider(), context.getZoneId())); + scanOptionsBuilder.withPushDownLimit(node.getPushDownLimit()); + scanOptionsBuilder.withPushDownOffset(node.getPushDownOffset()); } OperatorContext operatorContext = @@ -477,16 +503,43 @@ public class OperatorTreeGenerator extends PlanVisitor<Operator, LocalExecutionP dataTypes.add(alignedPath.getSubMeasurementDataType(i)); } - return constructFilterOperator( - pushDownPredicate, - seriesScanOperator, - expressions.toArray(new Expression[0]), - dataTypes, - makeLayout(Collections.singletonList(node)), - false, - node.getPlanNodeId(), - node.getScanOrder(), - context); + Operator rootOperator = + constructFilterOperator( + pushDownPredicate, + seriesScanOperator, + expressions.toArray(new Expression[0]), + dataTypes, + makeLayout(Collections.singletonList(node)), + false, + node.getPlanNodeId(), + node.getScanOrder(), + context); + + if (node.getPushDownOffset() > 0) { + rootOperator = + new OffsetOperator( + context + .getDriverContext() + .addOperatorContext( + context.getNextOperatorId(), + node.getPlanNodeId(), + OffsetOperator.class.getSimpleName()), + node.getPushDownOffset(), + rootOperator); + } + if (node.getPushDownLimit() > 0) { + rootOperator = + new LimitOperator( + context + .getDriverContext() + .addOperatorContext( + context.getNextOperatorId(), + node.getPlanNodeId(), + LimitOperator.class.getSimpleName()), + node.getPushDownLimit(), + rootOperator); + } + return rootOperator; } return seriesScanOperator; }
