This is an automated email from the ASF dual-hosted git repository. volodymyr pushed a commit to branch mongo in repository https://gitbox.apache.org/repos/asf/drill.git
commit 7ea77fd6e49cb2602566c836d885345319207e28 Author: Volodymyr Vysotskyi <[email protected]> AuthorDate: Thu Aug 5 19:56:54 2021 +0300 Rename and cleanup --- .../drill/exec/store/mongo/MongoStoragePlugin.java | 65 ++++--- .../drill/exec/store/PlannableStoragePlugin.java | 201 --------------------- .../exec/store/StoragePluginRulesSupplier.java | 167 +++++++++++++++++ 3 files changed, 209 insertions(+), 224 deletions(-) diff --git a/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoStoragePlugin.java b/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoStoragePlugin.java index df0588d..52531c0 100644 --- a/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoStoragePlugin.java +++ b/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoStoragePlugin.java @@ -21,26 +21,29 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.mongodb.ConnectionString; import com.mongodb.MongoClientSettings; +import com.mongodb.client.MongoClient; import com.mongodb.MongoCredential; import com.mongodb.ServerAddress; -import com.mongodb.client.MongoClient; import com.mongodb.client.MongoClients; import org.apache.calcite.plan.Convention; +import org.apache.calcite.plan.RelOptRule; import org.apache.calcite.schema.SchemaPlus; import org.apache.drill.common.JSONOptions; import org.apache.drill.common.exceptions.DrillRuntimeException; -import org.apache.drill.common.logical.security.CredentialsProvider; -import org.apache.drill.common.logical.security.PlainCredentialsProvider; +import org.apache.drill.exec.ops.OptimizerRulesContext; import org.apache.drill.exec.physical.base.AbstractGroupScan; +import org.apache.drill.exec.planner.PlannerPhase; import org.apache.drill.exec.server.DrillbitContext; -import org.apache.drill.exec.store.PlannableStoragePlugin; +import org.apache.drill.exec.store.AbstractStoragePlugin; +import org.apache.drill.exec.store.PluginRulesProviderImpl; import org.apache.drill.exec.store.SchemaConfig; -import org.apache.drill.exec.store.StoragePlugin; +import org.apache.drill.exec.store.StoragePluginRulesSupplier; import org.apache.drill.exec.store.mongo.plan.MongoPluginImplementor; -import org.apache.drill.exec.store.PluginRulesProviderImpl; import org.apache.drill.exec.store.mongo.schema.MongoSchemaFactory; +import org.apache.drill.common.logical.security.CredentialsProvider; import org.apache.drill.exec.store.plan.rel.PluginRel; import org.apache.drill.exec.store.security.HadoopCredentialsProvider; +import org.apache.drill.common.logical.security.PlainCredentialsProvider; import org.apache.drill.exec.store.security.UsernamePasswordCredentials; import org.apache.drill.shaded.guava.com.google.common.cache.Cache; import org.apache.drill.shaded.guava.com.google.common.cache.CacheBuilder; @@ -53,23 +56,26 @@ import org.slf4j.LoggerFactory; import java.io.IOException; import java.net.URLEncoder; +import java.util.Collections; import java.util.List; +import java.util.Set; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; -public class MongoStoragePlugin extends PlannableStoragePlugin implements StoragePlugin { +public class MongoStoragePlugin extends AbstractStoragePlugin { private static final Logger logger = LoggerFactory.getLogger(MongoStoragePlugin.class); private final MongoStoragePluginConfig mongoConfig; private final MongoSchemaFactory schemaFactory; private final Cache<MongoCnxnKey, MongoClient> addressClientMap; private final ConnectionString clientURI; + private final StoragePluginRulesSupplier storagePluginRulesSupplier; public MongoStoragePlugin( MongoStoragePluginConfig mongoConfig, DrillbitContext context, String name) { - super(mongoStoragePluginBuilder(name).context(context)); + super(context, name); this.mongoConfig = mongoConfig; String connection = addCredentialsFromCredentialsProvider(this.mongoConfig.getConnection(), name); this.clientURI = new ConnectionString(connection); @@ -78,20 +84,21 @@ public class MongoStoragePlugin extends PlannableStoragePlugin implements Storag .removalListener(new AddressCloser()) .build(); this.schemaFactory = new MongoSchemaFactory(this, name); + this.storagePluginRulesSupplier = storagePluginRulesSupplier(name); } - private static MongoStoragePluginConfigs mongoStoragePluginBuilder(String name) { + private static StoragePluginRulesSupplier storagePluginRulesSupplier(String name) { Convention convention = new Convention.Impl("MONGO." + name, PluginRel.class); - return new MongoStoragePluginConfigs() - .rulesProvider(new PluginRulesProviderImpl(convention, MongoPluginImplementor::new)) - .supportsProjectPushdown(true) - .supportsSortPushdown(true) - .supportsAggregatePushdown(true) - .supportsFilterPushdown(true) - .supportsLimitPushdown(true) - .supportsUnionPushdown(true) - .convention(convention) - .name(name); + return StoragePluginRulesSupplier.builder() + .rulesProvider(new PluginRulesProviderImpl(convention, MongoPluginImplementor::new)) + .supportsProjectPushdown(true) + .supportsSortPushdown(true) + .supportsAggregatePushdown(true) + .supportsFilterPushdown(true) + .supportsLimitPushdown(true) + .supportsUnionPushdown(true) + .convention(convention) + .build(); } private String addCredentialsFromCredentialsProvider(String connection, String name) { @@ -150,13 +157,25 @@ public class MongoStoragePlugin extends PlannableStoragePlugin implements Storag return new MongoGroupScan(userName, this, mongoScanSpec, null, false); } - private static class MongoStoragePluginConfigs extends PlannableStoragePluginConfigs<MongoStoragePluginConfigs> { - @Override - public MongoStoragePluginConfigs self() { - return this; + @Override + public Set<? extends RelOptRule> getOptimizerRules(OptimizerRulesContext optimizerContext, PlannerPhase phase) { + switch (phase) { + case PHYSICAL: + case LOGICAL: + return storagePluginRulesSupplier.getOptimizerRules(); + case LOGICAL_PRUNE_AND_JOIN: + case LOGICAL_PRUNE: + case PARTITION_PRUNING: + case JOIN_PLANNING: + default: + return Collections.emptySet(); } } + public Convention convention() { + return storagePluginRulesSupplier.convention(); + } + private static class AddressCloser implements RemovalListener<MongoCnxnKey, MongoClient> { @Override diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/PlannableStoragePlugin.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/PlannableStoragePlugin.java deleted file mode 100644 index 7219921..0000000 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/PlannableStoragePlugin.java +++ /dev/null @@ -1,201 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 org.apache.drill.exec.store; - -import org.apache.calcite.plan.Convention; -import org.apache.calcite.plan.RelOptRule; -import org.apache.drill.exec.ops.OptimizerRulesContext; -import org.apache.drill.exec.planner.PlannerPhase; -import org.apache.drill.exec.server.DrillbitContext; -import org.apache.drill.shaded.guava.com.google.common.collect.ImmutableSet; - -import java.util.Collections; -import java.util.Set; - -/** - * Abstract class for StorePlugin implementations. - * See StoragePlugin for description of the interface intent and its methods. - */ -public abstract class PlannableStoragePlugin extends AbstractStoragePlugin { - - private final PlannableStoragePluginConfigs<?> plannableStoragePluginConfigs; - - protected PlannableStoragePlugin(PlannableStoragePluginConfigs<? extends PlannableStoragePluginConfigs<?>> plannableStoragePluginConfigs) { - super(plannableStoragePluginConfigs.context(), plannableStoragePluginConfigs.name()); - this.plannableStoragePluginConfigs = plannableStoragePluginConfigs; - } - - @Override - public Set<? extends RelOptRule> getOptimizerRules(OptimizerRulesContext optimizerContext, PlannerPhase phase) { - switch (phase) { - case PHYSICAL: - case LOGICAL: - ImmutableSet.Builder<RelOptRule> builder = ImmutableSet.builder(); - PluginRulesProvider rulesProvider = plannableStoragePluginConfigs.rulesProvider; - if (plannableStoragePluginConfigs.supportsProjectPushdown) { - builder.addAll(rulesProvider.projectRules()); - } - if (plannableStoragePluginConfigs.supportsFilterPushdown) { - builder.addAll(rulesProvider.filterRules()); - } - if (plannableStoragePluginConfigs.supportsSortPushdown) { - builder.addAll(rulesProvider.sortRules()); - } - if (plannableStoragePluginConfigs.supportsUnionPushdown) { - builder.addAll(rulesProvider.unionRules()); - } - if (plannableStoragePluginConfigs.supportsJoinPushdown) { - builder.addAll(rulesProvider.joinRules()); - } - if (plannableStoragePluginConfigs.supportsAggregatePushdown) { - builder.addAll(rulesProvider.aggregateRules()); - } - if (plannableStoragePluginConfigs.supportsLimitPushdown) { - builder.addAll(rulesProvider.limitRules()); - } - builder.add(rulesProvider.vertexRule()); - builder.add(rulesProvider.prelConverterRule()); - return builder.build(); - case LOGICAL_PRUNE_AND_JOIN: - case LOGICAL_PRUNE: - case PARTITION_PRUNING: - case JOIN_PLANNING: - default: - return Collections.emptySet(); - } - } - - public Convention convention() { - return plannableStoragePluginConfigs.convention(); - } - - public static abstract class PlannableStoragePluginConfigs<T extends PlannableStoragePluginConfigs<?>> { - private DrillbitContext context; - private String name; - private boolean supportsProjectPushdown; - private boolean supportsFilterPushdown; - private boolean supportsAggregatePushdown; - private boolean supportsSortPushdown; - private boolean supportsUnionPushdown; - private boolean supportsJoinPushdown; - private boolean supportsLimitPushdown; - private PluginRulesProvider rulesProvider; - private Convention convention; - - public abstract T self(); - - public DrillbitContext context() { - return context; - } - - public T context(DrillbitContext inContext) { - this.context = inContext; - return self(); - } - - public String name() { - return name; - } - - public T name(String inName) { - this.name = inName; - return self(); - } - - public boolean supportsProjectPushdown() { - return supportsProjectPushdown; - } - - public T supportsProjectPushdown(boolean supportsProjectPushdown) { - this.supportsProjectPushdown = supportsProjectPushdown; - return self(); - } - - public boolean supportsFilterPushdown() { - return supportsFilterPushdown; - } - - public T supportsFilterPushdown(boolean supportsFilterPushdown) { - this.supportsFilterPushdown = supportsFilterPushdown; - return self(); - } - - public boolean supportsAggregatePushdown() { - return supportsAggregatePushdown; - } - - public T supportsAggregatePushdown(boolean supportsAggregatePushdown) { - this.supportsAggregatePushdown = supportsAggregatePushdown; - return self(); - } - - public boolean supportsSortPushdown() { - return supportsSortPushdown; - } - - public T supportsSortPushdown(boolean supportsSortPushdown) { - this.supportsSortPushdown = supportsSortPushdown; - return self(); - } - - public boolean supportsUnionPushdown() { - return supportsUnionPushdown; - } - - public T supportsUnionPushdown(boolean supportsUnionPushdown) { - this.supportsUnionPushdown = supportsUnionPushdown; - return self(); - } - - public boolean supportsJoinPushdown() { - return supportsJoinPushdown; - } - - public T supportsJoinPushdown(boolean supportsJoinPushdown) { - this.supportsJoinPushdown = supportsJoinPushdown; - return self(); - } - - public boolean supportsLimitPushdown() { - return supportsLimitPushdown; - } - - public PlannableStoragePluginConfigs<T> supportsLimitPushdown(boolean supportsLimitPushdown) { - this.supportsLimitPushdown = supportsLimitPushdown; - return this; - } - - public PluginRulesProvider rulesProvider() { - return rulesProvider; - } - - public T rulesProvider(PluginRulesProvider rulesProvider) { - this.rulesProvider = rulesProvider; - return self(); - } - - public Convention convention() { - return convention; - } - - public PlannableStoragePluginConfigs<T> convention(Convention convention) { - this.convention = convention; - return this; - } - } -} diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/StoragePluginRulesSupplier.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/StoragePluginRulesSupplier.java new file mode 100644 index 0000000..972a5a3 --- /dev/null +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/StoragePluginRulesSupplier.java @@ -0,0 +1,167 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.drill.exec.store; + +import org.apache.calcite.plan.Convention; +import org.apache.calcite.plan.RelOptRule; +import org.apache.drill.shaded.guava.com.google.common.collect.ImmutableSet; + +import java.util.Set; + +public class StoragePluginRulesSupplier { + + private final StoragePluginRulesSupplierBuilder storagePluginRulesSupplierBuilder; + + private StoragePluginRulesSupplier(StoragePluginRulesSupplierBuilder storagePluginRulesSupplierBuilder) { + this.storagePluginRulesSupplierBuilder = storagePluginRulesSupplierBuilder; + } + + public Set<? extends RelOptRule> getOptimizerRules() { + ImmutableSet.Builder<RelOptRule> builder = ImmutableSet.builder(); + PluginRulesProvider rulesProvider = storagePluginRulesSupplierBuilder.rulesProvider(); + if (storagePluginRulesSupplierBuilder.supportsProjectPushdown()) { + builder.addAll(rulesProvider.projectRules()); + } + if (storagePluginRulesSupplierBuilder.supportsFilterPushdown()) { + builder.addAll(rulesProvider.filterRules()); + } + if (storagePluginRulesSupplierBuilder.supportsSortPushdown()) { + builder.addAll(rulesProvider.sortRules()); + } + if (storagePluginRulesSupplierBuilder.supportsUnionPushdown()) { + builder.addAll(rulesProvider.unionRules()); + } + if (storagePluginRulesSupplierBuilder.supportsJoinPushdown()) { + builder.addAll(rulesProvider.joinRules()); + } + if (storagePluginRulesSupplierBuilder.supportsAggregatePushdown()) { + builder.addAll(rulesProvider.aggregateRules()); + } + if (storagePluginRulesSupplierBuilder.supportsLimitPushdown()) { + builder.addAll(rulesProvider.limitRules()); + } + builder.add(rulesProvider.vertexRule()); + builder.add(rulesProvider.prelConverterRule()); + return builder.build(); + } + + public Convention convention() { + return storagePluginRulesSupplierBuilder.convention(); + } + + public static StoragePluginRulesSupplierBuilder builder() { + return new StoragePluginRulesSupplierBuilder(); + } + + public static class StoragePluginRulesSupplierBuilder { + private boolean supportsProjectPushdown; + private boolean supportsFilterPushdown; + private boolean supportsAggregatePushdown; + private boolean supportsSortPushdown; + private boolean supportsUnionPushdown; + private boolean supportsJoinPushdown; + private boolean supportsLimitPushdown; + private PluginRulesProvider rulesProvider; + private Convention convention; + + public boolean supportsProjectPushdown() { + return supportsProjectPushdown; + } + + public StoragePluginRulesSupplierBuilder supportsProjectPushdown(boolean supportsProjectPushdown) { + this.supportsProjectPushdown = supportsProjectPushdown; + return this; + } + + public boolean supportsFilterPushdown() { + return supportsFilterPushdown; + } + + public StoragePluginRulesSupplierBuilder supportsFilterPushdown(boolean supportsFilterPushdown) { + this.supportsFilterPushdown = supportsFilterPushdown; + return this; + } + + public boolean supportsAggregatePushdown() { + return supportsAggregatePushdown; + } + + public StoragePluginRulesSupplierBuilder supportsAggregatePushdown(boolean supportsAggregatePushdown) { + this.supportsAggregatePushdown = supportsAggregatePushdown; + return this; + } + + public boolean supportsSortPushdown() { + return supportsSortPushdown; + } + + public StoragePluginRulesSupplierBuilder supportsSortPushdown(boolean supportsSortPushdown) { + this.supportsSortPushdown = supportsSortPushdown; + return this; + } + + public boolean supportsUnionPushdown() { + return supportsUnionPushdown; + } + + public StoragePluginRulesSupplierBuilder supportsUnionPushdown(boolean supportsUnionPushdown) { + this.supportsUnionPushdown = supportsUnionPushdown; + return this; + } + + public boolean supportsJoinPushdown() { + return supportsJoinPushdown; + } + + public StoragePluginRulesSupplierBuilder supportsJoinPushdown(boolean supportsJoinPushdown) { + this.supportsJoinPushdown = supportsJoinPushdown; + return this; + } + + public boolean supportsLimitPushdown() { + return supportsLimitPushdown; + } + + public StoragePluginRulesSupplierBuilder supportsLimitPushdown(boolean supportsLimitPushdown) { + this.supportsLimitPushdown = supportsLimitPushdown; + return this; + } + + public PluginRulesProvider rulesProvider() { + return rulesProvider; + } + + public StoragePluginRulesSupplierBuilder rulesProvider(PluginRulesProvider rulesProvider) { + this.rulesProvider = rulesProvider; + return this; + } + + public Convention convention() { + return convention; + } + + public StoragePluginRulesSupplierBuilder convention(Convention convention) { + this.convention = convention; + return this; + } + + public StoragePluginRulesSupplier build() { + return new StoragePluginRulesSupplier(this); + } + } +}
