blob: ee8e6b08cd782c78a15ec89d02cde1757dcfe134 [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.physical.impl.scan.v3.file;
import java.util.List;
import org.apache.drill.exec.physical.impl.scan.v3.file.ImplicitColumnResolver.ImplicitColumnOptions;
import org.apache.drill.exec.physical.impl.scan.v3.file.ImplicitColumnResolver.ParseResult;
import org.apache.drill.exec.physical.impl.scan.v3.lifecycle.StaticBatchBuilder;
import org.apache.drill.exec.physical.impl.scan.v3.lifecycle.StaticBatchBuilder.RepeatedBatchBuilder;
import org.apache.drill.exec.physical.impl.scan.v3.schema.ScanSchemaTracker;
import org.apache.drill.exec.physical.resultSet.ResultVectorCache;
import org.apache.drill.exec.server.options.OptionSet;
import org.apache.drill.exec.store.dfs.DrillFileSystem;
import org.apache.drill.exec.store.dfs.easy.FileWork;
import org.apache.hadoop.fs.Path;
/**
* Manages implicit columns for files and partition columns for
* directories. Splits the work into a schema-time implicit column
* resolver, and a run-time class to populate the resulting
* vectors.
* <p>
* Uses system/session options for the configured name of the
* implicit columns.
*/
public class ImplicitFileColumnsHandler {
private final DrillFileSystem dfs;
private final ImplicitColumnResolver parser;
private final ResultVectorCache vectorCache;
private final Path rootDir;
private final ParseResult parseResult;
private final boolean isCompressible;
public ImplicitFileColumnsHandler(DrillFileSystem dfs, OptionSet options,
FileScanLifecycleBuilder scanOptions,
ResultVectorCache vectorCache, ScanSchemaTracker schemaTracker) {
ImplicitColumnOptions implicitOptions = new ImplicitColumnOptions()
.optionSet(options)
.dfs(dfs)
.maxPartitionDepth(scanOptions.maxPartitionDepth())
.useLegacyWildcardExpansion(scanOptions.useLegacyWildcardExpansion());
this.dfs = dfs;
this.rootDir = scanOptions.rootDir();
this.parser = new ImplicitColumnResolver(implicitOptions, scanOptions.errorContext());
this.vectorCache = vectorCache;
this.parseResult = parser.parse(schemaTracker);
this.isCompressible = scanOptions.isCompressible();
}
public FileDescrip makeDescrip(FileWork fileWork) {
FileDescrip descrip = new FileDescrip(dfs, fileWork, rootDir);
descrip.setCompressible(isCompressible);
return descrip;
}
public StaticBatchBuilder forFile(FileDescrip fileInfo) {
List<ImplicitColumnMarker> columns = parseResult.columns();
if (columns.isEmpty()) {
return null;
}
Object values[] = new Object[columns.size()];
for (int i = 0; i < columns.size(); i++) {
values[i] = columns.get(i).resolve(fileInfo);
}
return new RepeatedBatchBuilder(vectorCache, parseResult.schema(), values);
}
public boolean isMetadataScan() { return parseResult.isMetadataScan(); }
}