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

lzljs3620320 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-paimon-presto.git


The following commit(s) were added to refs/heads/main by this push:
     new efdcb56  Add feature-add-pushdown-config (#24)
efdcb56 is described below

commit efdcb5690efd8f705ab3f2603b8e85d67a6ed0c7
Author: chendapao <[email protected]>
AuthorDate: Mon Nov 27 14:40:54 2023 +0800

    Add feature-add-pushdown-config (#24)
---
 .../org/apache/paimon/presto/PaimonConfig.java     | 13 +++++
 .../paimon/presto/PrestoComputePushdown.java       | 10 +++-
 .../paimon/presto/PrestoPlanOptimizerProvider.java |  8 ++-
 .../paimon/presto/TestPrestoComputePushdown.java   | 64 +++++++++++++++++++++-
 4 files changed, 89 insertions(+), 6 deletions(-)

diff --git 
a/paimon-presto-common/src/main/java/org/apache/paimon/presto/PaimonConfig.java 
b/paimon-presto-common/src/main/java/org/apache/paimon/presto/PaimonConfig.java
index 977d542..d8d98b3 100644
--- 
a/paimon-presto-common/src/main/java/org/apache/paimon/presto/PaimonConfig.java
+++ 
b/paimon-presto-common/src/main/java/org/apache/paimon/presto/PaimonConfig.java
@@ -19,6 +19,7 @@
 package org.apache.paimon.presto;
 
 import com.facebook.airlift.configuration.Config;
+import com.facebook.airlift.configuration.ConfigDescription;
 
 /** Used for configuration item inspection and management. */
 public class PaimonConfig {
@@ -26,6 +27,7 @@ public class PaimonConfig {
     private String warehouse;
     private String metastore;
     private String uri;
+    private boolean paimonPushdownEnabled = true;
 
     public String getWarehouse() {
         return warehouse;
@@ -56,4 +58,15 @@ public class PaimonConfig {
         this.uri = uri;
         return this;
     }
+
+    public boolean isPaimonPushdownEnabled() {
+        return paimonPushdownEnabled;
+    }
+
+    @Config("paimon.query-pushdown-enabled")
+    @ConfigDescription("Enable paimon query pushdown")
+    public PaimonConfig setPaimonPushdownEnabled(boolean 
paimonPushdownEnabled) {
+        this.paimonPushdownEnabled = paimonPushdownEnabled;
+        return this;
+    }
 }
diff --git 
a/paimon-presto-common/src/main/java/org/apache/paimon/presto/PrestoComputePushdown.java
 
b/paimon-presto-common/src/main/java/org/apache/paimon/presto/PrestoComputePushdown.java
index a2da50c..64c77a5 100644
--- 
a/paimon-presto-common/src/main/java/org/apache/paimon/presto/PrestoComputePushdown.java
+++ 
b/paimon-presto-common/src/main/java/org/apache/paimon/presto/PrestoComputePushdown.java
@@ -53,14 +53,17 @@ public class PrestoComputePushdown implements 
ConnectorPlanOptimizer {
 
     private final StandardFunctionResolution functionResolution;
     private final RowExpressionService rowExpressionService;
+    private final PaimonConfig config;
 
     public PrestoComputePushdown(
             StandardFunctionResolution functionResolution,
-            RowExpressionService rowExpressionService) {
+            RowExpressionService rowExpressionService,
+            PaimonConfig config) {
 
         this.functionResolution = requireNonNull(functionResolution, 
"functionResolution is null");
         this.rowExpressionService =
                 requireNonNull(rowExpressionService, "rowExpressionService is 
null");
+        this.config = requireNonNull(config, "config is null");
     }
 
     @Override
@@ -70,7 +73,10 @@ public class PrestoComputePushdown implements 
ConnectorPlanOptimizer {
             VariableAllocator variableAllocator,
             PlanNodeIdAllocator idAllocator) {
 
-        return maxSubplan.accept(new Visitor(session, idAllocator), null);
+        if (config.isPaimonPushdownEnabled()) {
+            return maxSubplan.accept(new Visitor(session, idAllocator), null);
+        }
+        return maxSubplan;
     }
 
     private class Visitor extends PlanVisitor<PlanNode, Void> {
diff --git 
a/paimon-presto-common/src/main/java/org/apache/paimon/presto/PrestoPlanOptimizerProvider.java
 
b/paimon-presto-common/src/main/java/org/apache/paimon/presto/PrestoPlanOptimizerProvider.java
index 7092753..950d59e 100644
--- 
a/paimon-presto-common/src/main/java/org/apache/paimon/presto/PrestoPlanOptimizerProvider.java
+++ 
b/paimon-presto-common/src/main/java/org/apache/paimon/presto/PrestoPlanOptimizerProvider.java
@@ -35,19 +35,23 @@ public class PrestoPlanOptimizerProvider implements 
ConnectorPlanOptimizerProvid
 
     private final StandardFunctionResolution functionResolution;
     private final RowExpressionService rowExpressionService;
+    private final PaimonConfig config;
 
     @Inject
     public PrestoPlanOptimizerProvider(
             StandardFunctionResolution functionResolution,
-            RowExpressionService rowExpressionService) {
+            RowExpressionService rowExpressionService,
+            PaimonConfig config) {
         this.functionResolution = requireNonNull(functionResolution, 
"functionResolution is null");
         this.rowExpressionService =
                 requireNonNull(rowExpressionService, "rowExpressionService is 
null");
+        this.config = requireNonNull(config, "config is null");
     }
 
     @Override
     public Set<ConnectorPlanOptimizer> getLogicalPlanOptimizers() {
-        return ImmutableSet.of(new PrestoComputePushdown(functionResolution, 
rowExpressionService));
+        return ImmutableSet.of(
+                new PrestoComputePushdown(functionResolution, 
rowExpressionService, config));
     }
 
     @Override
diff --git 
a/paimon-presto-common/src/test/java/org/apache/paimon/presto/TestPrestoComputePushdown.java
 
b/paimon-presto-common/src/test/java/org/apache/paimon/presto/TestPrestoComputePushdown.java
index 3151ce0..dc03c4a 100644
--- 
a/paimon-presto-common/src/test/java/org/apache/paimon/presto/TestPrestoComputePushdown.java
+++ 
b/paimon-presto-common/src/test/java/org/apache/paimon/presto/TestPrestoComputePushdown.java
@@ -52,7 +52,7 @@ import 
com.facebook.presto.sql.relational.RowExpressionOptimizer;
 import com.facebook.presto.testing.TestingConnectorSession;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
-import org.junit.jupiter.api.Test;
+import org.testng.annotations.Test;
 
 import java.util.List;
 import java.util.Map;
@@ -152,13 +152,22 @@ public class TestPrestoComputePushdown {
                 rowExpression);
     }
 
+    private PaimonConfig createPaimonConfig(boolean paimonPushdownEnabled) {
+        PaimonConfig paimonConfig = new PaimonConfig();
+        paimonConfig.setPaimonPushdownEnabled(paimonPushdownEnabled);
+
+        return paimonConfig;
+    }
+
     @Test
     public void testOptimizeFilter() {
         // Mock data.
         PrestoColumnHandle testData = new PrestoColumnHandle("id", "BIGINT", 
BIGINT);
 
+        PaimonConfig config = createPaimonConfig(true);
+
         PrestoComputePushdown prestoComputePushdown =
-                new PrestoComputePushdown(FUNCTION_RESOLUTION, 
ROW_EXPRESSION_SERVICE);
+                new PrestoComputePushdown(FUNCTION_RESOLUTION, 
ROW_EXPRESSION_SERVICE, config);
 
         PlanNode mockInputPlan = createFilterNode();
         ConnectorSession session = new 
TestingConnectorSession(ImmutableList.of());
@@ -197,4 +206,55 @@ public class TestPrestoComputePushdown {
                         assertThat(columns.stream().allMatch(testcase -> 
testcase.equals(testData)))
                                 .isEqualTo(true));
     }
+
+    @Test
+    public void testNotOptimizeFilter() {
+        // Mock data.
+        PaimonConfig config = createPaimonConfig(false);
+
+        PrestoComputePushdown prestoComputePushdown =
+                new PrestoComputePushdown(FUNCTION_RESOLUTION, 
ROW_EXPRESSION_SERVICE, config);
+
+        PlanNode mockInputPlan = createFilterNode();
+        ConnectorSession session = new 
TestingConnectorSession(ImmutableList.of());
+        PlanVariableAllocator variableAllocator = new PlanVariableAllocator();
+        PlanNodeIdAllocator idAllocator = new PlanNodeIdAllocator();
+
+        // Call optimize
+        PlanNode result =
+                prestoComputePushdown.optimize(
+                        mockInputPlan, session, variableAllocator, 
idAllocator);
+
+        // Optimize result convert.
+        TableScanNode source = (TableScanNode) ((FilterNode) 
result).getSource();
+        TableHandle table = source.getTable();
+        PrestoTableLayoutHandle prestoTableLayoutHandle =
+                (PrestoTableLayoutHandle)
+                        table.getLayout()
+                                .orElseThrow(
+                                        () -> new 
IllegalStateException("Layout is not present"));
+
+        // Assert not optimize
+        Optional<TupleDomain<PrestoColumnHandle>> optionalFilter =
+                
Optional.ofNullable(prestoTableLayoutHandle.getTableHandle().getFilter());
+        optionalFilter.ifPresent(
+                filter ->
+                        assertThat(
+                                        
filter.getDomains().get().keySet().stream()
+                                                .allMatch(
+                                                        testcase ->
+                                                                
testcase.equals(TupleDomain.all())))
+                                .isEqualTo(true));
+
+        Optional<List<ColumnHandle>> projectedColumns =
+                prestoTableLayoutHandle.getTableHandle().getProjectedColumns();
+        projectedColumns.ifPresent(
+                columns ->
+                        assertThat(
+                                        columns.stream()
+                                                .allMatch(
+                                                        testcase ->
+                                                                
testcase.equals(Optional.empty())))
+                                .isEqualTo(true));
+    }
 }

Reply via email to