This is an automated email from the ASF dual-hosted git repository.

jackietien pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/master by this push:
     new d0c0fd76473 Make last_by, first_by with time can push-down in 
TableModel
d0c0fd76473 is described below

commit d0c0fd76473626a05dc162ddf7d73118fd71cf02
Author: Weihao Li <[email protected]>
AuthorDate: Wed Sep 25 14:38:13 2024 +0800

    Make last_by, first_by with time can push-down in TableModel
---
 .../plan/relational/metadata/Metadata.java         |  3 ++-
 .../metadata/TableBuiltinAggregationFunction.java  |  3 ++-
 .../relational/metadata/TableMetadataImpl.java     |  4 ++--
 .../PushAggregationIntoTableScan.java              |  8 ++++++-
 .../plan/relational/analyzer/AggregationTest.java  | 25 ++++++++++++++++++++++
 .../plan/relational/analyzer/TSBSMetadata.java     |  4 ++--
 .../plan/relational/analyzer/TestMatadata.java     |  4 ++--
 7 files changed, 42 insertions(+), 9 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/Metadata.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/Metadata.java
index cfabb03c6aa..22e8acec47b 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/Metadata.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/Metadata.java
@@ -185,7 +185,8 @@ public interface Metadata {
       final String database, final List<DataPartitionQueryParam> 
sgNameToQueryParamsMap);
 
   /**
+   * @param withTime some function with time can also use Statistics, like 
first_by, last_by
    * @return if the Aggregation can use statistics to optimize
    */
-  boolean canUseStatistics(final String name);
+  boolean canUseStatistics(final String name, boolean withTime);
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TableBuiltinAggregationFunction.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TableBuiltinAggregationFunction.java
index 09da97cdfe9..e14df7ee408 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TableBuiltinAggregationFunction.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TableBuiltinAggregationFunction.java
@@ -76,7 +76,7 @@ public enum TableBuiltinAggregationFunction {
   /**
    * @return if the Aggregation can use statistics to optimize
    */
-  public static boolean canUseStatistics(String name) {
+  public static boolean canUseStatistics(String name, boolean withTime) {
     final String functionName = name.toLowerCase();
     switch (functionName) {
       case "sum":
@@ -90,6 +90,7 @@ public enum TableBuiltinAggregationFunction {
         return true;
       case "first_by":
       case "last_by":
+        return withTime;
       case "mode":
       case "max_by":
       case "min_by":
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TableMetadataImpl.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TableMetadataImpl.java
index 084d098d747..43040121845 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TableMetadataImpl.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TableMetadataImpl.java
@@ -705,8 +705,8 @@ public class TableMetadataImpl implements Metadata {
   }
 
   @Override
-  public boolean canUseStatistics(String functionName) {
-    return TableBuiltinAggregationFunction.canUseStatistics(functionName);
+  public boolean canUseStatistics(String functionName, boolean withTime) {
+    return TableBuiltinAggregationFunction.canUseStatistics(functionName, 
withTime);
   }
 
   public static boolean isTwoNumericType(List<? extends Type> argumentTypes) {
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 5b383d50ffc..771135627c9 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
@@ -139,7 +139,13 @@ public class PushAggregationIntoTableScan implements 
PlanOptimizer {
       for (AggregationNode.Aggregation aggregation : values) {
         // if the function cannot make use of Statistics, we don't push down
         if (!metadata.canUseStatistics(
-            aggregation.getResolvedFunction().getSignature().getName())) {
+            aggregation.getResolvedFunction().getSignature().getName(),
+            aggregation.getArguments().stream()
+                .anyMatch(
+                    v ->
+                        ((SymbolReference) v)
+                            .getName()
+                            
.equalsIgnoreCase(TimestampOperand.TIMESTAMP_EXPRESSION_STRING)))) {
           return PushDownLevel.NOOP;
         }
 
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AggregationTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AggregationTest.java
index 8ea55c73134..2aa5158060f 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AggregationTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AggregationTest.java
@@ -657,4 +657,29 @@ public class AggregationTest {
                         ImmutableList.of("time", "s1", "s2"),
                         ImmutableSet.of("s1", "s2", "time"))))));
   }
+
+  @Test
+  public void withTimePushDownLevelTest() {
+    PlanTester planTester = new PlanTester();
+
+    // first, last, first_by with time, last_by with time should be push-down
+    LogicalQueryPlan logicalQueryPlan =
+        planTester.createPlan(
+            "SELECT first(s1), last(s1), first_by(time,s1), last_by(time,s1) 
FROM table1 group by tag1, tag2, tag3");
+
+    // Output - Project - AggregationTableScan
+    assertPlan(
+        logicalQueryPlan,
+        output(
+            project(
+                aggregationTableScan(
+                    singleGroupingSet("tag1", "tag2", "tag3"),
+                    ImmutableList.of("tag1", "tag2", "tag3"), // Streamable
+                    Optional.empty(),
+                    SINGLE,
+                    "testdb.table1",
+                    ImmutableList.of(
+                        "tag1", "tag2", "tag3", "first", "last", "first_by", 
"last_by"),
+                    ImmutableSet.of("tag1", "tag2", "tag3", "s1", "time")))));
+  }
 }
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/TSBSMetadata.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/TSBSMetadata.java
index f01b4400cb3..244a1a8f496 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/TSBSMetadata.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/TSBSMetadata.java
@@ -365,8 +365,8 @@ public class TSBSMetadata implements Metadata {
   }
 
   @Override
-  public boolean canUseStatistics(String name) {
-    return TableBuiltinAggregationFunction.canUseStatistics(name);
+  public boolean canUseStatistics(String name, boolean withTime) {
+    return TableBuiltinAggregationFunction.canUseStatistics(name, withTime);
   }
 
   private static final DataPartition DATA_PARTITION =
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/TestMatadata.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/TestMatadata.java
index f6d2678a812..d6c7d1b15ba 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/TestMatadata.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/TestMatadata.java
@@ -312,8 +312,8 @@ public class TestMatadata implements Metadata {
   }
 
   @Override
-  public boolean canUseStatistics(String name) {
-    return TableBuiltinAggregationFunction.canUseStatistics(name);
+  public boolean canUseStatistics(String name, boolean withTime) {
+    return TableBuiltinAggregationFunction.canUseStatistics(name, withTime);
   }
 
   private static final DataPartition DATA_PARTITION =

Reply via email to