blob: edecc199c0e43066ad39efc73a4ffb97f850111f [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.dfs;
import static java.util.Collections.unmodifiableList;
import static java.util.Collections.unmodifiableMap;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.drill.common.config.LogicalPlanPersistence;
import org.apache.drill.common.exceptions.UserException;
import org.apache.drill.common.logical.FormatPluginConfig;
import org.apache.drill.common.scanner.persistence.ScanResult;
import org.apache.drill.exec.store.dfs.WorkspaceSchemaFactory.TableInstance;
import org.apache.drill.exec.store.table.function.TableParamDef;
import org.apache.drill.exec.store.table.function.TableSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.drill.shaded.guava.com.google.common.annotations.VisibleForTesting;
/**
* Manages format plugins options to define table macros.
*/
final class FormatPluginOptionExtractor {
private static final Logger logger = LoggerFactory.getLogger(FormatPluginOptionExtractor.class);
private final Map<String, FormatPluginOptionsDescriptor> optionsByTypeName;
/**
* Extracts the format plugin options based on the scanned implementations of
* {@link FormatPluginConfig}.
*
* @param scanResult scan result of the classpath
*/
FormatPluginOptionExtractor(ScanResult scanResult) {
Map<String, FormatPluginOptionsDescriptor> result = new HashMap<>();
Set<Class<? extends FormatPluginConfig>> pluginConfigClasses =
LogicalPlanPersistence.getSubTypes(scanResult, FormatPluginConfig.class);
for (Class<? extends FormatPluginConfig> pluginConfigClass : pluginConfigClasses) {
FormatPluginOptionsDescriptor optionsDescriptor = new FormatPluginOptionsDescriptor(pluginConfigClass);
result.put(optionsDescriptor.getTypeName().toLowerCase(), optionsDescriptor);
}
this.optionsByTypeName = unmodifiableMap(result);
}
/**
* @return the extracted options
*/
@VisibleForTesting
Collection<FormatPluginOptionsDescriptor> getOptions() {
return optionsByTypeName.values();
}
/**
* Give a table name, returns function signatures to configure the FormatPlugin.
*
* @param tableName the name of the table (or table function in this context)
* @param tableParameters common table parameters to be included
* @return the available signatures
*/
List<TableSignature> getTableSignatures(String tableName, List<TableParamDef> tableParameters) {
List<TableSignature> result = new ArrayList<>();
for (FormatPluginOptionsDescriptor optionsDescriptor : optionsByTypeName.values()) {
TableSignature sig = optionsDescriptor.getTableSignature(tableName, tableParameters);
result.add(sig);
}
return unmodifiableList(result);
}
/**
* Given a table function signature and the corresponding parameters return
* the corresponding formatPlugin configuration.
*
* @param t
* the signature and parameters (it should be one of the signatures
* returned by
* {@link FormatPluginOptionExtractor#getTableSignatures(String, List)})
* @param mapper
* @return the config
*/
FormatPluginConfig createConfigForTable(TableInstance t, ObjectMapper mapper, FormatPluginConfig baseConfig) {
if (!t.sig.getSpecificParams().get(0).getName().equals("type")) {
throw UserException.parseError()
.message("unknown first param for %s", t.sig)
.addContext("table", t.sig.getName())
.build(logger);
}
String type = (String) t.params.get(0);
if (type == null) {
throw UserException.parseError()
.message("type param must be present but was missing")
.addContext("table", t.sig.getName())
.build(logger);
}
FormatPluginOptionsDescriptor optionsDescriptor = optionsByTypeName.get(type.toLowerCase());
if (optionsDescriptor == null) {
throw UserException.parseError()
.message(
"unknown type %s, expected one of %s",
type, optionsByTypeName.keySet())
.addContext("table", t.sig.getName())
.build(logger);
}
return optionsDescriptor.createConfigForTable(t, mapper, baseConfig);
}
}