diff --git a/presto-clp/src/main/java/com/facebook/presto/plugin/clp/ClpConfig.java b/presto-clp/src/main/java/com/facebook/presto/plugin/clp/ClpConfig.java
index 7ffa6545b8ca0..121eb0d5ff17b 100644
--- a/presto-clp/src/main/java/com/facebook/presto/plugin/clp/ClpConfig.java
+++ b/presto-clp/src/main/java/com/facebook/presto/plugin/clp/ClpConfig.java
@@ -29,11 +29,12 @@ public class ClpConfig
private String metadataDbName;
private String metadataDbUser;
private String metadataDbPassword;
- private String metadataFilterConfig;
private String metadataTablePrefix;
private long metadataRefreshInterval = 60;
private long metadataExpireInterval = 600;
+ private String splitFilterConfig;
+ private SplitFilterProviderType splitFilterProviderType = SplitFilterProviderType.MYSQL;
private SplitProviderType splitProviderType = SplitProviderType.MYSQL;
public boolean isPolymorphicTypeEnabled()
@@ -108,18 +109,6 @@ public ClpConfig setMetadataDbPassword(String metadataDbPassword)
return this;
}
- public String getMetadataFilterConfig()
- {
- return metadataFilterConfig;
- }
-
- @Config("clp.metadata-filter-config")
- public ClpConfig setMetadataFilterConfig(String metadataFilterConfig)
- {
- this.metadataFilterConfig = metadataFilterConfig;
- return this;
- }
-
public String getMetadataTablePrefix()
{
return metadataTablePrefix;
@@ -162,6 +151,30 @@ public ClpConfig setMetadataExpireInterval(long metadataExpireInterval)
return this;
}
+ public String getSplitFilterConfig()
+ {
+ return splitFilterConfig;
+ }
+
+ @Config("clp.split-filter-config")
+ public ClpConfig setSplitFilterConfig(String splitFilterConfig)
+ {
+ this.splitFilterConfig = splitFilterConfig;
+ return this;
+ }
+
+ public SplitFilterProviderType getSplitFilterProviderType()
+ {
+ return splitFilterProviderType;
+ }
+
+ @Config("clp.split-filter-provider-type")
+ public ClpConfig setSplitFilterProviderType(SplitFilterProviderType splitFilterProviderType)
+ {
+ this.splitFilterProviderType = splitFilterProviderType;
+ return this;
+ }
+
public SplitProviderType getSplitProviderType()
{
return splitProviderType;
@@ -179,6 +192,11 @@ public enum MetadataProviderType
MYSQL
}
+ public enum SplitFilterProviderType
+ {
+ MYSQL
+ }
+
public enum SplitProviderType
{
MYSQL
diff --git a/presto-clp/src/main/java/com/facebook/presto/plugin/clp/ClpConnector.java b/presto-clp/src/main/java/com/facebook/presto/plugin/clp/ClpConnector.java
index 50ba67c8d6200..7b24e7a650e3c 100644
--- a/presto-clp/src/main/java/com/facebook/presto/plugin/clp/ClpConnector.java
+++ b/presto-clp/src/main/java/com/facebook/presto/plugin/clp/ClpConnector.java
@@ -15,6 +15,7 @@
import com.facebook.airlift.bootstrap.LifeCycleManager;
import com.facebook.airlift.log.Logger;
+import com.facebook.presto.plugin.clp.split.filter.ClpSplitFilterProvider;
import com.facebook.presto.spi.connector.Connector;
import com.facebook.presto.spi.connector.ConnectorMetadata;
import com.facebook.presto.spi.connector.ConnectorPlanOptimizerProvider;
@@ -40,7 +41,7 @@ public class ClpConnector
private final ClpSplitManager splitManager;
private final FunctionMetadataManager functionManager;
private final StandardFunctionResolution functionResolution;
- private final ClpMetadataFilterProvider metadataFilterProvider;
+ private final ClpSplitFilterProvider splitFilterProvider;
@Inject
public ClpConnector(
@@ -50,7 +51,7 @@ public ClpConnector(
ClpSplitManager splitManager,
FunctionMetadataManager functionManager,
StandardFunctionResolution functionResolution,
- ClpMetadataFilterProvider metadataFilterProvider)
+ ClpSplitFilterProvider splitFilterProvider)
{
this.lifeCycleManager = requireNonNull(lifeCycleManager, "lifeCycleManager is null");
this.metadata = requireNonNull(metadata, "metadata is null");
@@ -58,13 +59,13 @@ public ClpConnector(
this.splitManager = requireNonNull(splitManager, "splitManager is null");
this.functionManager = requireNonNull(functionManager, "functionManager is null");
this.functionResolution = requireNonNull(functionResolution, "functionResolution is null");
- this.metadataFilterProvider = requireNonNull(metadataFilterProvider, "metadataFilterProvider is null");
+ this.splitFilterProvider = requireNonNull(splitFilterProvider, "splitFilterProvider is null");
}
@Override
public ConnectorPlanOptimizerProvider getConnectorPlanOptimizerProvider()
{
- return new ClpPlanOptimizerProvider(functionManager, functionResolution, metadataFilterProvider);
+ return new ClpPlanOptimizerProvider(functionManager, functionResolution, splitFilterProvider);
}
@Override
diff --git a/presto-clp/src/main/java/com/facebook/presto/plugin/clp/ClpErrorCode.java b/presto-clp/src/main/java/com/facebook/presto/plugin/clp/ClpErrorCode.java
index 94cc8bda560c4..2530c013455cc 100644
--- a/presto-clp/src/main/java/com/facebook/presto/plugin/clp/ClpErrorCode.java
+++ b/presto-clp/src/main/java/com/facebook/presto/plugin/clp/ClpErrorCode.java
@@ -29,8 +29,9 @@ public enum ClpErrorCode
CLP_UNSUPPORTED_TYPE(3, EXTERNAL),
CLP_UNSUPPORTED_CONFIG_OPTION(4, EXTERNAL),
- CLP_METADATA_FILTER_CONFIG_NOT_FOUND(10, USER_ERROR),
- CLP_MANDATORY_METADATA_FILTER_NOT_VALID(11, USER_ERROR);
+ CLP_SPLIT_FILTER_CONFIG_NOT_FOUND(10, USER_ERROR),
+ CLP_MANDATORY_SPLIT_FILTER_NOT_VALID(11, USER_ERROR),
+ CLP_UNSUPPORTED_SPLIT_FILTER_SOURCE(12, EXTERNAL);
private final ErrorCode errorCode;
diff --git a/presto-clp/src/main/java/com/facebook/presto/plugin/clp/ClpMetadataFilterProvider.java b/presto-clp/src/main/java/com/facebook/presto/plugin/clp/ClpMetadataFilterProvider.java
deleted file mode 100644
index d4de6a6f3bd78..0000000000000
--- a/presto-clp/src/main/java/com/facebook/presto/plugin/clp/ClpMetadataFilterProvider.java
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.facebook.presto.plugin.clp;
-
-import com.facebook.presto.spi.PrestoException;
-import com.facebook.presto.spi.SchemaTableName;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.inject.Inject;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-import java.util.function.Function;
-
-import static com.facebook.presto.plugin.clp.ClpConnectorFactory.CONNECTOR_NAME;
-import static com.facebook.presto.plugin.clp.ClpErrorCode.CLP_MANDATORY_METADATA_FILTER_NOT_VALID;
-import static com.facebook.presto.plugin.clp.ClpErrorCode.CLP_METADATA_FILTER_CONFIG_NOT_FOUND;
-import static com.google.common.collect.ImmutableMap.toImmutableMap;
-import static com.google.common.collect.ImmutableSet.toImmutableSet;
-import static java.lang.String.format;
-import static java.util.Objects.requireNonNull;
-
-/**
- * Loads and manages metadata filter configurations for the CLP connector.
- *
- * The configuration file is specified by the {@code clp.metadata-filter-config} property
- * and defines metadata filters used to optimize query execution through split pruning.
- *
- * Each filter config indicates how a data column--a column in the Presto table--should be mapped to
- * a metadata column--a column in CLP’s metadata database.
- *
- * Filter configs can be declared at either a catalog, schema, or table scope. Filter configs under
- * a particular scope will apply to all child scopes (e.g., schema-level filter configs will apply
- * to all tables within that schema).
- *
- * Each filter config includes the following fields:
- *
- * - {@code columnName}: the data column's name. Currently, only numeric-type columns can
- * be used as metadata filters.
- *
- * - {@code rangeMapping} (optional): an object with the following properties:
- *
- *
- * Note: This option is only valid if the column has a numeric type.
- *
- *
- * - {@code lowerBound}: The metadata column that represents the lower bound of values
- * in a split for the data column.
- * - {@code upperBound}: The metadata column that represents the upper bound of values
- * in a split for the data column.
- *
- *
- *
- * - {@code required} (optional, defaults to {@code false}): indicates whether the
- * filter must be present in the translated metadata filter SQL query. If a required filter
- * is missing or cannot be pushed down, the query will be rejected.
- *
- */
-public class ClpMetadataFilterProvider
-{
- private final Map> filterMap;
-
- @Inject
- public ClpMetadataFilterProvider(ClpConfig config)
- {
- requireNonNull(config, "config is null");
-
- if (null == config.getMetadataFilterConfig()) {
- filterMap = ImmutableMap.of();
- return;
- }
- ObjectMapper mapper = new ObjectMapper();
- try {
- filterMap = mapper.readValue(
- new File(config.getMetadataFilterConfig()),
- new TypeReference