This is an automated email from the ASF dual-hosted git repository.
caogaofei pushed a commit to branch rc/1.3.2
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/rc/1.3.2 by this push:
new ef3738bf392 CP commit 273d483 to rc/1.3.2 (#13195)
ef3738bf392 is described below
commit ef3738bf392120d9805eb34cebb365902668974c
Author: Beyyes <[email protected]>
AuthorDate: Fri Aug 16 14:08:03 2024 +0800
CP commit 273d483 to rc/1.3.2 (#13195)
---
.../db/it/aligned/IoTDBPredicatePushDownIT.java | 27 ++++++
.../plan/planner/OperatorTreeGenerator.java | 107 ++++++++++++++++-----
2 files changed, 109 insertions(+), 25 deletions(-)
diff --git
a/integration-test/src/test/java/org/apache/iotdb/db/it/aligned/IoTDBPredicatePushDownIT.java
b/integration-test/src/test/java/org/apache/iotdb/db/it/aligned/IoTDBPredicatePushDownIT.java
index 4d3ff5120df..1a65682fc5b 100644
---
a/integration-test/src/test/java/org/apache/iotdb/db/it/aligned/IoTDBPredicatePushDownIT.java
+++
b/integration-test/src/test/java/org/apache/iotdb/db/it/aligned/IoTDBPredicatePushDownIT.java
@@ -91,6 +91,13 @@ public class IoTDBPredicatePushDownIT {
};
resultSetEqualTest(
"select s2 from root.sg1.d1 where s2 - 1 >= 9 and s2 < 30",
expectedHeader3, retArray3);
+
+ String expectedHeader4 = "Time,root.sg1.d1.s2,";
+ String[] retArray4 = new String[] {"14,14,", "15,15,"};
+ resultSetEqualTest(
+ "select s2 from root.sg1.d1 where s2 - 1 >= 9 and s2 < 30 offset 3
limit 2",
+ expectedHeader4,
+ retArray4);
}
@Test
@@ -164,6 +171,11 @@ public class IoTDBPredicatePushDownIT {
"30,30,",
};
resultSetEqualTest("select s3 from root.sg1.d1 where s3 + 1 > 16",
expectedHeader3, retArray3);
+
+ String expectedHeader4 = "Time,root.sg1.d1.s3,";
+ String[] retArray4 = new String[] {"3,30000,", "13,130000,", "16,16,"};
+ resultSetEqualTest(
+ "select s3 from root.sg1.d1 where s3 + 1 > 16 limit 3",
expectedHeader4, retArray4);
}
@Test
@@ -203,6 +215,13 @@ public class IoTDBPredicatePushDownIT {
};
resultSetEqualTest(
"select s2 from root.sg1.d2 where s2 - 1 >= 9 and s2 < 30",
expectedHeader3, retArray3);
+
+ String expectedHeader4 = "Time,root.sg1.d2.s2,";
+ String[] retArray4 = new String[] {"12,12,", "13,13,", "14,14,"};
+ resultSetEqualTest(
+ "select s2 from root.sg1.d2 where s2 - 1 >= 9 and s2 < 30 limit 3
offset 2",
+ expectedHeader4,
+ retArray4);
}
@Test
@@ -257,6 +276,14 @@ public class IoTDBPredicatePushDownIT {
"25,25,", "26,26,", "27,27,", "28,28,", "29,29,", "30,30,",
};
resultSetEqualTest("select s3 from root.sg1.d2 where s3 + 1 > 16",
expectedHeader3, retArray3);
+
+ String expectedHeader4 = "Time,root.sg1.d2.s3,";
+ String[] retArray4 =
+ new String[] {
+ "26,26,", "27,27,", "28,28,", "29,29,", "30,30,",
+ };
+ resultSetEqualTest(
+ "select s3 from root.sg1.d2 where s3 + 1 > 16 offset 10",
expectedHeader4, retArray4);
}
@Test
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 a6d043f5ad2..d9867603bdb 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
@@ -328,8 +328,6 @@ public class OperatorTreeGenerator extends
PlanVisitor<Operator, LocalExecutionP
SeriesScanOptions.Builder scanOptionsBuilder =
getSeriesScanOptionsBuilder(node, 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);
@@ -341,6 +339,10 @@ public class OperatorTreeGenerator extends
PlanVisitor<Operator, LocalExecutionP
context.getTypeProvider().getTemplatedInfo() != null,
context.getTypeProvider()));
}
+ if (pushDownPredicate == null || predicateCanPushIntoScan) {
+ scanOptionsBuilder.withPushDownLimit(node.getPushDownLimit());
+ scanOptionsBuilder.withPushDownOffset(node.getPushDownOffset());
+ }
OperatorContext operatorContext =
context
@@ -364,17 +366,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;
}
@@ -385,8 +413,6 @@ public class OperatorTreeGenerator extends
PlanVisitor<Operator, LocalExecutionP
AlignedPath seriesPath = node.getAlignedPath();
SeriesScanOptions.Builder scanOptionsBuilder =
getSeriesScanOptionsBuilder(node, context);
- scanOptionsBuilder.withPushDownLimit(node.getPushDownLimit());
- scanOptionsBuilder.withPushDownOffset(node.getPushDownOffset());
scanOptionsBuilder.withAllSensors(
new HashSet<>(
context.isBuildPlanUseTemplate()
@@ -403,6 +429,10 @@ public class OperatorTreeGenerator extends
PlanVisitor<Operator, LocalExecutionP
context.getTypeProvider().getTemplatedInfo() != null,
context.getTypeProvider()));
}
+ if (pushDownPredicate == null || predicateCanPushIntoScan) {
+ scanOptionsBuilder.withPushDownLimit(node.getPushDownLimit());
+ scanOptionsBuilder.withPushDownOffset(node.getPushDownOffset());
+ }
OperatorContext operatorContext =
context
@@ -460,16 +490,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;
}