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