blob: f80f1beadb77c385a472f95b477fb60fa207e42e [file] [log] [blame]
/*
* 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.mongo;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeName;
import com.mongodb.ConnectionString;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.drill.common.logical.CredentialedStoragePluginConfig;
import org.apache.drill.common.logical.security.CredentialsProvider;
import org.apache.drill.common.logical.security.PlainCredentialsProvider;
import java.util.List;
import java.util.Objects;
@JsonTypeName(MongoStoragePluginConfig.NAME)
public class MongoStoragePluginConfig extends CredentialedStoragePluginConfig {
public static final String NAME = "mongo";
private final String connection;
private final boolean allowDiskUse;
@JsonIgnore
private final ConnectionString clientURI;
private final MongoPluginOptimizations pluginOptimizations;
private final int batchSize;
@JsonCreator
public MongoStoragePluginConfig(@JsonProperty("connection") String connection,
@JsonProperty("pluginOptimizations") MongoPluginOptimizations pluginOptimizations,
@JsonProperty("batchSize") Integer batchSize,
@JsonProperty("allowDiskUse") boolean allowDiskUse,
@JsonProperty("credentialsProvider") CredentialsProvider credentialsProvider) {
super(getCredentialsProvider(credentialsProvider), credentialsProvider == null);
this.connection = connection;
this.clientURI = new ConnectionString(connection);
this.pluginOptimizations = ObjectUtils.defaultIfNull(pluginOptimizations, new MongoPluginOptimizations());
this.batchSize = batchSize != null ? batchSize : 100;
this.allowDiskUse = allowDiskUse;
}
private MongoStoragePluginConfig(MongoStoragePluginConfig that, CredentialsProvider credentialsProvider) {
super(getCredentialsProvider(credentialsProvider), credentialsProvider == null, that.authMode);
this.connection = that.connection;
this.clientURI = that.clientURI;
this.pluginOptimizations = that.pluginOptimizations;
this.batchSize = that.batchSize;
this.allowDiskUse = that.allowDiskUse;
}
public MongoPluginOptimizations getPluginOptimizations() {
return pluginOptimizations;
}
@JsonIgnore
public List<String> getHosts() {
return clientURI.getHosts();
}
public String getConnection() {
return connection;
}
public int getBatchSize() {
return batchSize;
}
@JsonProperty("allowDiskUse")
public boolean allowDiskUse() {
return allowDiskUse;
}
private static CredentialsProvider getCredentialsProvider(CredentialsProvider credentialsProvider) {
return credentialsProvider != null ? credentialsProvider : PlainCredentialsProvider.EMPTY_CREDENTIALS_PROVIDER;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
MongoStoragePluginConfig that = (MongoStoragePluginConfig) o;
return Objects.equals(connection, that.connection);
}
@Override
public int hashCode() {
return Objects.hash(connection);
}
@Override
public MongoStoragePluginConfig updateCredentialProvider(CredentialsProvider credentialsProvider) {
return new MongoStoragePluginConfig(this, credentialsProvider);
}
public static class MongoPluginOptimizations {
private boolean supportsProjectPushdown = true;
private boolean supportsFilterPushdown = true;
private boolean supportsAggregatePushdown = true;
private boolean supportsSortPushdown = true;
private boolean supportsUnionPushdown = true;
private boolean supportsLimitPushdown = true;
public boolean isSupportsProjectPushdown() {
return this.supportsProjectPushdown;
}
public boolean isSupportsFilterPushdown() {
return this.supportsFilterPushdown;
}
public boolean isSupportsAggregatePushdown() {
return this.supportsAggregatePushdown;
}
public boolean isSupportsSortPushdown() {
return this.supportsSortPushdown;
}
public boolean isSupportsUnionPushdown() {
return this.supportsUnionPushdown;
}
public boolean isSupportsLimitPushdown() {
return this.supportsLimitPushdown;
}
public void setSupportsProjectPushdown(boolean supportsProjectPushdown) {
this.supportsProjectPushdown = supportsProjectPushdown;
}
public void setSupportsFilterPushdown(boolean supportsFilterPushdown) {
this.supportsFilterPushdown = supportsFilterPushdown;
}
public void setSupportsAggregatePushdown(boolean supportsAggregatePushdown) {
this.supportsAggregatePushdown = supportsAggregatePushdown;
}
public void setSupportsSortPushdown(boolean supportsSortPushdown) {
this.supportsSortPushdown = supportsSortPushdown;
}
public void setSupportsUnionPushdown(boolean supportsUnionPushdown) {
this.supportsUnionPushdown = supportsUnionPushdown;
}
public void setSupportsLimitPushdown(boolean supportsLimitPushdown) {
this.supportsLimitPushdown = supportsLimitPushdown;
}
}
}