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

Reply via email to