blob: 85743457d5c60ad3be75496af54577d4705fd099 [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.rowSet;
import org.apache.drill.exec.memory.BufferAllocator;
import org.apache.drill.exec.physical.resultSet.model.MetadataProvider.MetadataRetrieval;
import org.apache.drill.exec.physical.resultSet.model.single.BaseWriterBuilder;
import org.apache.drill.exec.physical.resultSet.model.single.BuildVectorsFromMetadata;
import org.apache.drill.exec.physical.resultSet.model.single.DirectRowIndex;
import org.apache.drill.exec.physical.resultSet.model.single.SingleSchemaInference;
import org.apache.drill.exec.physical.resultSet.model.single.VectorAllocator;
import org.apache.drill.exec.record.BatchSchema;
import org.apache.drill.exec.record.BatchSchema.SelectionVectorMode;
import org.apache.drill.exec.record.metadata.MetadataUtils;
import org.apache.drill.exec.record.metadata.TupleMetadata;
import org.apache.drill.exec.record.VectorAccessible;
import org.apache.drill.exec.record.VectorContainer;
import org.apache.drill.exec.record.selection.SelectionVector2;
import org.apache.drill.exec.physical.rowSet.RowSet.ExtendableRowSet;
import org.apache.drill.exec.physical.rowSet.RowSetWriterImpl.WriterIndexImpl;
import java.util.Collections;
import java.util.Set;
/**
* Implementation of a single row set with no indirection (selection)
* vector.
*/
public class DirectRowSet extends AbstractSingleRowSet implements ExtendableRowSet {
/**
* Initial row count, used for preliminary memory allocation.
*/
public static final int INITIAL_ROW_COUNT = 10;
public static class RowSetWriterBuilder extends BaseWriterBuilder {
public RowSetWriter buildWriter(DirectRowSet rowSet) {
WriterIndexImpl index = new WriterIndexImpl();
TupleMetadata schema = rowSet.schema();
return new RowSetWriterImpl(rowSet, schema, index,
buildContainerChildren(rowSet.container(),
new MetadataRetrieval(schema)));
}
}
private DirectRowSet(VectorContainer container, TupleMetadata schema) {
super(container, schema);
}
public DirectRowSet(AbstractSingleRowSet from) {
super(from);
}
public static DirectRowSet fromSchema(BufferAllocator allocator, BatchSchema schema) {
return fromSchema(allocator, MetadataUtils.fromFields(schema));
}
public static DirectRowSet fromSchema(BufferAllocator allocator, TupleMetadata schema) {
BuildVectorsFromMetadata builder = new BuildVectorsFromMetadata(allocator);
return new DirectRowSet(builder.build(schema), schema);
}
public static DirectRowSet fromContainer(VectorContainer container) {
return new DirectRowSet(container, new SingleSchemaInference().infer(container));
}
public static DirectRowSet fromVectorAccessible(BufferAllocator allocator, VectorAccessible va) {
return fromContainer(toContainer(va, allocator));
}
private static VectorContainer toContainer(VectorAccessible va, BufferAllocator allocator) {
VectorContainer container = VectorContainer.getTransferClone(va, allocator);
container.buildSchema(SelectionVectorMode.NONE);
container.setRecordCount(va.getRecordCount());
return container;
}
@Override
public void allocate(int rowCount) {
new VectorAllocator(container()).allocate(rowCount, schema());
}
@Override
public RowSetWriter writer() {
return writer(INITIAL_ROW_COUNT);
}
@Override
public RowSetWriter writer(int initialRowCount) {
if (container().hasRecordCount()) {
throw new IllegalStateException("Row set already contains data");
}
allocate(initialRowCount);
return new RowSetWriterBuilder().buildWriter(this);
}
@Override
public RowSetReader reader() {
return buildReader(new DirectRowIndex(container));
}
@Override
public boolean isExtendable() { return true; }
@Override
public boolean isWritable() { return true; }
@Override
public SelectionVectorMode indirectionType() { return SelectionVectorMode.NONE; }
@Override
public SingleRowSet toIndirect() {
return new IndirectRowSet(this, Collections.emptySet());
}
@Override
public SingleRowSet toIndirect(Set<Integer> skipIndices) {
return new IndirectRowSet(this, skipIndices);
}
@Override
public SelectionVector2 getSv2() { return null; }
}