http://git-wip-us.apache.org/repos/asf/drill/blob/40de8ca4/exec/vector/src/main/codegen/templates/RepeatedValueVectors.java ---------------------------------------------------------------------- diff --git a/exec/vector/src/main/codegen/templates/RepeatedValueVectors.java b/exec/vector/src/main/codegen/templates/RepeatedValueVectors.java index 4da3d9e..c20ee89 100644 --- a/exec/vector/src/main/codegen/templates/RepeatedValueVectors.java +++ b/exec/vector/src/main/codegen/templates/RepeatedValueVectors.java @@ -18,6 +18,9 @@ import java.lang.Override; +import org.apache.drill.common.types.DataMode; +import org.apache.drill.common.types.TypeProtos.MajorType; +import org.apache.drill.exec.record.MaterializedField; import org.apache.drill.exec.record.TransferPair; import org.apache.drill.exec.vector.complex.BaseRepeatedValueVector; import org.mortbay.jetty.servlet.Holder; @@ -55,7 +58,10 @@ public final class Repeated${minor.class}Vector extends BaseRepeatedValueVector public Repeated${minor.class}Vector(MaterializedField field, BufferAllocator allocator) { super(field, allocator); - addOrGetVector(VectorDescriptor.create(Types.required(field.getType().getMinorType()))); + MajorType majorType = field.getType(); + addOrGetVector(VectorDescriptor.create(Types.withScaleAndPrecision( + majorType.getMinorType(), DataMode.REQUIRED, + majorType.getScale(), majorType.getPrecision()))); } @Override @@ -341,25 +347,12 @@ public final class Repeated${minor.class}Vector extends BaseRepeatedValueVector addSafe(index, bytes, 0, bytes.length); } - public void addEntry(int index, byte[] bytes) throws VectorOverflowException { - addEntry(index, bytes, 0, bytes.length); - } - public void addSafe(int index, byte[] bytes, int start, int length) { final int nextOffset = offsets.getAccessor().get(index+1); values.getMutator().setSafe(nextOffset, bytes, start, length); offsets.getMutator().setSafe(index+1, nextOffset+1); } - public void addEntry(int index, byte[] bytes, int start, int length) throws VectorOverflowException { - if (index >= MAX_ROW_COUNT) { - throw new VectorOverflowException(); - } - final int nextOffset = offsets.getAccessor().get(index+1); - values.getMutator().setArrayItem(nextOffset, bytes, start, length); - offsets.getMutator().setSafe(index+1, nextOffset+1); - } - <#else> public void addSafe(int index, ${minor.javaType!type.javaType} srcValue) { final int nextOffset = offsets.getAccessor().get(index+1); @@ -367,15 +360,6 @@ public final class Repeated${minor.class}Vector extends BaseRepeatedValueVector offsets.getMutator().setSafe(index+1, nextOffset+1); } - public void addEntry(int index, ${minor.javaType!type.javaType} srcValue) throws VectorOverflowException { - if (index >= MAX_ROW_COUNT) { - throw new VectorOverflowException(); - } - final int nextOffset = offsets.getAccessor().get(index+1); - values.getMutator().setArrayItem(nextOffset, srcValue); - offsets.getMutator().setSafe(index+1, nextOffset+1); - } - </#if> public void setSafe(int index, Repeated${minor.class}Holder h) { final ${minor.class}Holder ih = new ${minor.class}Holder(); @@ -393,14 +377,6 @@ public final class Repeated${minor.class}Vector extends BaseRepeatedValueVector offsets.getMutator().setSafe(index+1, nextOffset+1); } - public void addEntry(int index, ${minor.class}Holder holder) throws VectorOverflowException { - if (index >= MAX_ROW_COUNT) { - throw new VectorOverflowException(); - } - final int nextOffset = offsets.getAccessor().get(index+1); - values.getMutator().setArrayItem(nextOffset, holder); - offsets.getMutator().setSafe(index+1, nextOffset+1); - } public void addSafe(int index, Nullable${minor.class}Holder holder) { final int nextOffset = offsets.getAccessor().get(index+1); @@ -408,15 +384,6 @@ public final class Repeated${minor.class}Vector extends BaseRepeatedValueVector offsets.getMutator().setSafe(index+1, nextOffset+1); } - public void addEntry(int index, Nullable${minor.class}Holder holder) throws VectorOverflowException { - if (index >= MAX_ROW_COUNT) { - throw new VectorOverflowException(); - } - final int nextOffset = offsets.getAccessor().get(index+1); - values.getMutator().setArrayItem(nextOffset, holder); - offsets.getMutator().setSafe(index+1, nextOffset+1); - } - /** * Backfill missing offsets from the given last written position to the * given current write position. Used by the "new" size-safe column @@ -427,11 +394,7 @@ public final class Repeated${minor.class}Vector extends BaseRepeatedValueVector * @param index the current write position to be initialized */ - public void fillEmptiesBounded(int lastWrite, int index) - throws VectorOverflowException { - if (index >= UInt4Vector.MAX_ROW_COUNT) { - throw new VectorOverflowException(); - } + public void fillEmpties(int lastWrite, int index) { // If last write was 2, offsets are [0, 3, 6] // If next write is 4, offsets must be: [0, 3, 6, 6, 6] // Remember the offsets are one more than row count. @@ -449,15 +412,6 @@ public final class Repeated${minor.class}Vector extends BaseRepeatedValueVector offsets.getMutator().setSafe(rowIndex+1, nextOffset+1); } - public void addEntry(int rowIndex, <#list fields as field>${field.type} ${field.name}<#if field_has_next>, </#if></#list>) throws VectorOverflowException { - if (rowIndex >= MAX_ROW_COUNT) { - throw new VectorOverflowException(); - } - final int nextOffset = offsets.getAccessor().get(rowIndex+1); - values.getMutator().setArrayItem(nextOffset, <#list fields as field>${field.name}<#if field_has_next>, </#if></#list>); - offsets.getMutator().setSafe(rowIndex+1, nextOffset+1); - } - </#if> <#if minor.class == "Decimal28Sparse" || minor.class == "Decimal38Sparse"> public void addSafe(int index, BigDecimal value) { @@ -466,15 +420,6 @@ public final class Repeated${minor.class}Vector extends BaseRepeatedValueVector offsets.getMutator().setSafe(index+1, nextOffset+1); } - public void addEntry(int index, BigDecimal value) throws VectorOverflowException { - if (index >= MAX_ROW_COUNT) { - throw new VectorOverflowException(); - } - final int nextOffset = offsets.getAccessor().get(index+1); - values.getMutator().setArrayItem(nextOffset, value); - offsets.getMutator().setSafe(index+1, nextOffset+1); - } - </#if> protected void add(int index, ${minor.class}Holder holder) { final int nextOffset = offsets.getAccessor().get(index+1);
http://git-wip-us.apache.org/repos/asf/drill/blob/40de8ca4/exec/vector/src/main/codegen/templates/UnionVector.java ---------------------------------------------------------------------- diff --git a/exec/vector/src/main/codegen/templates/UnionVector.java b/exec/vector/src/main/codegen/templates/UnionVector.java index c198544..a46779d 100644 --- a/exec/vector/src/main/codegen/templates/UnionVector.java +++ b/exec/vector/src/main/codegen/templates/UnionVector.java @@ -116,7 +116,6 @@ public class UnionVector implements ValueVector { } return mapVector; } - <#list vv.types as type><#list type.minor as minor><#assign name = minor.class?cap_first /> <#assign fields = minor.fields!type.fields /> <#assign uncappedName = name?uncap_first/> @@ -136,9 +135,7 @@ public class UnionVector implements ValueVector { } return ${uncappedName}Vector; } - </#if> - </#list></#list> private static final MajorType LIST_TYPE = Types.optional(MinorType.LIST); @@ -183,8 +180,7 @@ public class UnionVector implements ValueVector { } @Override - public void setInitialCapacity(int numRecords) { - } + public void setInitialCapacity(int numRecords) { } @Override public int getValueCapacity() { @@ -192,8 +188,7 @@ public class UnionVector implements ValueVector { } @Override - public void close() { - } + public void close() { } @Override public void clear() { @@ -201,9 +196,7 @@ public class UnionVector implements ValueVector { } @Override - public MaterializedField getField() { - return field; - } + public MaterializedField getField() { return field; } @Override public void collectLedgers(Set<BufferLedger> ledgers) { @@ -290,9 +283,7 @@ public class UnionVector implements ValueVector { } @Override - public void splitAndTransfer(int startIndex, int length) { - - } + public void splitAndTransfer(int startIndex, int length) { } @Override public ValueVector getTo() { @@ -306,14 +297,10 @@ public class UnionVector implements ValueVector { } @Override - public Accessor getAccessor() { - return accessor; - } + public Accessor getAccessor() { return accessor; } @Override - public Mutator getMutator() { - return mutator; - } + public Mutator getMutator() { return mutator; } @Override public FieldReader getReader() { @@ -347,6 +334,11 @@ public class UnionVector implements ValueVector { } @Override + public int getAllocatedSize() { + return internalMap.getAllocatedSize(); + } + + @Override public int getBufferSizeFor(final int valueCount) { if (valueCount == 0) { return 0; @@ -381,7 +373,6 @@ public class UnionVector implements ValueVector { public class Accessor extends BaseValueVector.BaseAccessor { - @Override public Object getObject(int index) { int type = typeVector.getAccessor().get(index); @@ -406,12 +397,9 @@ public class UnionVector implements ValueVector { } } - public byte[] get(int index) { - return null; - } + public byte[] get(int index) { return null; } - public void get(int index, ComplexHolder holder) { - } + public void get(int index, ComplexHolder holder) { } public void get(int index, UnionHolder holder) { FieldReader reader = new UnionReader(UnionVector.this); @@ -420,9 +408,7 @@ public class UnionVector implements ValueVector { } @Override - public int getValueCount() { - return valueCount; - } + public int getValueCount() { return valueCount; } @Override public boolean isNull(int index) { @@ -436,7 +422,7 @@ public class UnionVector implements ValueVector { public class Mutator extends BaseValueVector.BaseMutator { - UnionWriter writer; + protected UnionWriter writer; @Override public void setValueCount(int valueCount) { http://git-wip-us.apache.org/repos/asf/drill/blob/40de8ca4/exec/vector/src/main/codegen/templates/VariableLengthVectors.java ---------------------------------------------------------------------- diff --git a/exec/vector/src/main/codegen/templates/VariableLengthVectors.java b/exec/vector/src/main/codegen/templates/VariableLengthVectors.java index e5432da..a29194a 100644 --- a/exec/vector/src/main/codegen/templates/VariableLengthVectors.java +++ b/exec/vector/src/main/codegen/templates/VariableLengthVectors.java @@ -54,7 +54,6 @@ package org.apache.drill.exec.vector; */ public final class ${minor.class}Vector extends BaseDataValueVector implements VariableWidthVector { - private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(${minor.class}Vector.class); private static final int DEFAULT_RECORD_BYTE_COUNT = 8; private static final int INITIAL_BYTE_COUNT = Math.min(INITIAL_VALUE_ALLOCATION * DEFAULT_RECORD_BYTE_COUNT, MAX_BUFFER_SIZE); @@ -68,20 +67,17 @@ public final class ${minor.class}Vector extends BaseDataValueVector implements V private final Accessor accessor; private final Mutator mutator; - private final UInt${type.width}Vector.Accessor oAccessor; - private int allocationSizeInBytes = INITIAL_BYTE_COUNT; private int allocationMonitor = 0; public ${minor.class}Vector(MaterializedField field, BufferAllocator allocator) { super(field, allocator); - this.oAccessor = offsetVector.getAccessor(); this.accessor = new Accessor(); this.mutator = new Mutator(); } @Override - public FieldReader getReader(){ + public FieldReader getReader() { return reader; } @@ -94,6 +90,11 @@ public final class ${minor.class}Vector extends BaseDataValueVector implements V } @Override + public int getAllocatedSize() { + return offsetVector.getAllocatedSize() + data.capacity(); + } + + @Override public int getBufferSizeFor(final int valueCount) { if (valueCount == 0) { return 0; @@ -104,12 +105,12 @@ public final class ${minor.class}Vector extends BaseDataValueVector implements V } @Override - public int getValueCapacity(){ + public int getValueCapacity() { return Math.max(offsetVector.getValueCapacity() - 1, 0); } @Override - public int getByteCapacity(){ + public int getByteCapacity() { return data.capacity(); } @@ -124,7 +125,7 @@ public final class ${minor.class}Vector extends BaseDataValueVector implements V */ public int getVarByteLength(){ final int valueCount = getAccessor().getValueCount(); - if(valueCount == 0) { + if (valueCount == 0) { return 0; } return offsetVector.getAccessor().get(valueCount); @@ -132,10 +133,10 @@ public final class ${minor.class}Vector extends BaseDataValueVector implements V @Override public SerializedField getMetadata() { - return getMetadataBuilder() // + return getMetadataBuilder() .addChild(offsetVector.getMetadata()) - .setValueCount(getAccessor().getValueCount()) // - .setBufferLength(getBufferSize()) // + .setValueCount(getAccessor().getValueCount()) + .setBufferLength(getBufferSize()) .build(); } @@ -170,21 +171,21 @@ public final class ${minor.class}Vector extends BaseDataValueVector implements V return buffers; } - public long getOffsetAddr(){ + public long getOffsetAddr() { return offsetVector.getBuffer().memoryAddress(); } - public UInt${type.width}Vector getOffsetVector(){ + public UInt${type.width}Vector getOffsetVector() { return offsetVector; } @Override - public TransferPair getTransferPair(BufferAllocator allocator){ + public TransferPair getTransferPair(BufferAllocator allocator) { return new TransferImpl(getField(), allocator); } @Override - public TransferPair getTransferPair(String ref, BufferAllocator allocator){ + public TransferPair getTransferPair(String ref, BufferAllocator allocator) { return new TransferImpl(getField().withPath(ref), allocator); } @@ -193,7 +194,7 @@ public final class ${minor.class}Vector extends BaseDataValueVector implements V return new TransferImpl((${minor.class}Vector) to); } - public void transferTo(${minor.class}Vector target){ + public void transferTo(${minor.class}Vector target) { target.clear(); this.offsetVector.transferTo(target.offsetVector); target.data = data.transferOwnership(target.allocator).buffer; @@ -272,23 +273,23 @@ public final class ${minor.class}Vector extends BaseDataValueVector implements V } private class TransferImpl implements TransferPair{ - ${minor.class}Vector to; + private final ${minor.class}Vector to; public TransferImpl(MaterializedField field, BufferAllocator allocator){ to = new ${minor.class}Vector(field, allocator); } - public TransferImpl(${minor.class}Vector to){ + public TransferImpl(${minor.class}Vector to) { this.to = to; } @Override - public ${minor.class}Vector getTo(){ + public ${minor.class}Vector getTo() { return to; } @Override - public void transfer(){ + public void transfer() { transferTo(to); } @@ -309,7 +310,7 @@ public final class ${minor.class}Vector extends BaseDataValueVector implements V if (size > MAX_ALLOCATION_SIZE) { throw new OversizedAllocationException("Requested amount of memory is more than max allowed allocation size"); } - allocationSizeInBytes = (int) size; + allocationSizeInBytes = (int)size; offsetVector.setInitialCapacity(valueCount + 1); } @@ -386,12 +387,17 @@ public final class ${minor.class}Vector extends BaseDataValueVector implements V throw new OversizedAllocationException("Unable to expand the buffer. Max allowed buffer size is reached."); } - logger.trace("Reallocating VarChar, new size {}", newAllocationSize); - final DrillBuf newBuf = allocator.buffer((int)newAllocationSize); + reallocRaw((int) newAllocationSize); + } + + @Override + public DrillBuf reallocRaw(int newAllocationSize) { + final DrillBuf newBuf = allocator.buffer(newAllocationSize); newBuf.setBytes(0, data, 0, data.capacity()); data.release(); data = newBuf; - allocationSizeInBytes = (int)newAllocationSize; + allocationSizeInBytes = newAllocationSize; + return data; } public void decrementAllocationMonitor() { @@ -430,6 +436,7 @@ public final class ${minor.class}Vector extends BaseDataValueVector implements V public final class Accessor extends BaseValueVector.BaseAccessor implements VariableWidthAccessor { final UInt${type.width}Vector.Accessor oAccessor = offsetVector.getAccessor(); + public long getStartEnd(int index){ return oAccessor.getTwoAsLong(index); } @@ -463,7 +470,6 @@ public final class ${minor.class}Vector extends BaseDataValueVector implements V holder.buffer = data; } - <#switch minor.class> <#case "VarChar"> @Override @@ -541,10 +547,6 @@ public final class ${minor.class}Vector extends BaseDataValueVector implements V } } - public void setScalar(int index, byte[] bytes) throws VectorOverflowException { - setScalar(index, bytes, 0, bytes.length); - } - /** * Set the variable length element at the specified index to the supplied byte array. * @@ -575,23 +577,6 @@ public final class ${minor.class}Vector extends BaseDataValueVector implements V } } - public void setScalar(int index, DrillBuf bytes, int start, int length) throws VectorOverflowException { - assert index >= 0; - - if (index >= MAX_ROW_COUNT) { - throw new VectorOverflowException(); - } - int currentOffset = offsetVector.getAccessor().get(index); - final int newSize = currentOffset + length; - if (newSize > MAX_BUFFER_SIZE) { - throw new VectorOverflowException(); - } - while (! data.setBytesBounded(currentOffset, bytes, start, length)) { - reAlloc(); - } - offsetVector.getMutator().setSafe(index + 1, newSize); - } - public void setSafe(int index, byte[] bytes, int start, int length) { assert index >= 0; @@ -608,28 +593,6 @@ public final class ${minor.class}Vector extends BaseDataValueVector implements V } } - public void setScalar(int index, byte[] bytes, int start, int length) throws VectorOverflowException { - if (index >= MAX_ROW_COUNT) { - throw new VectorOverflowException(); - } - setArrayItem(index, bytes, start, length); - } - - public void setArrayItem(int index, byte[] bytes, int start, int length) throws VectorOverflowException { - assert index >= 0; - - final int currentOffset = offsetVector.getAccessor().get(index); - final int newSize = currentOffset + length; - if (newSize > MAX_BUFFER_SIZE) { - throw new VectorOverflowException(); - } - - while (! data.setBytesBounded(currentOffset, bytes, start, length)) { - reAlloc(); - } - offsetVector.getMutator().setSafe(index + 1, newSize); - } - @Override public void setValueLengthSafe(int index, int length) { final int offset = offsetVector.getAccessor().get(index); @@ -654,32 +617,6 @@ public final class ${minor.class}Vector extends BaseDataValueVector implements V } } - public void setScalar(int index, int start, int end, DrillBuf buffer) throws VectorOverflowException { - if (index >= MAX_ROW_COUNT) { - throw new VectorOverflowException(); - } - setArrayItem(index, start, end, buffer); - } - - public void setArrayItem(int index, int start, int end, DrillBuf buffer) throws VectorOverflowException { - final int len = end - start; - final int outputStart = offsetVector.data.get${(minor.javaType!type.javaType)?cap_first}(index * ${type.width}); - final int newSize = outputStart + len; - if (newSize > MAX_BUFFER_SIZE) { - throw new VectorOverflowException(); - } - - offsetVector.getMutator().setSafe(index+1, newSize); - try{ - buffer.getBytes(start, data, outputStart, len); - } catch (IndexOutOfBoundsException e) { - while (data.capacity() < newSize) { - reAlloc(); - } - buffer.getBytes(start, data, outputStart, len); - } - } - public void setSafe(int index, Nullable${minor.class}Holder holder) { assert holder.isSet == 1; @@ -700,37 +637,6 @@ public final class ${minor.class}Vector extends BaseDataValueVector implements V offsetVector.getMutator().setSafe(index+1, outputStart + len); } - public void setScalar(int index, Nullable${minor.class}Holder holder) throws VectorOverflowException { - if (index >= MAX_ROW_COUNT) { - throw new VectorOverflowException(); - } - setArrayItem(index, holder); - } - - public void setArrayItem(int index, Nullable${minor.class}Holder holder) throws VectorOverflowException { - assert holder.isSet == 1; - - final int start = holder.start; - final int end = holder.end; - final int len = end - start; - - final int outputStart = offsetVector.data.get${(minor.javaType!type.javaType)?cap_first}(index * ${type.width}); - final int newSize = outputStart + len; - if (newSize > MAX_BUFFER_SIZE) { - throw new VectorOverflowException(); - } - - try { - holder.buffer.getBytes(start, data, outputStart, len); - } catch (IndexOutOfBoundsException e) { - while (data.capacity() < newSize) { - reAlloc(); - } - holder.buffer.getBytes(start, data, outputStart, len); - } - offsetVector.getMutator().setSafe(index+1, newSize); - } - public void setSafe(int index, ${minor.class}Holder holder) { final int start = holder.start; final int end = holder.end; @@ -748,34 +654,6 @@ public final class ${minor.class}Vector extends BaseDataValueVector implements V offsetVector.getMutator().setSafe( index+1, outputStart + len); } - public void setScalar(int index, ${minor.class}Holder holder) throws VectorOverflowException { - if (index >= MAX_ROW_COUNT) { - throw new VectorOverflowException(); - } - setArrayItem(index, holder); - } - - public void setArrayItem(int index, ${minor.class}Holder holder) throws VectorOverflowException { - final int start = holder.start; - final int end = holder.end; - final int len = end - start; - final int outputStart = offsetVector.data.get${(minor.javaType!type.javaType)?cap_first}(index * ${type.width}); - final int newSize = outputStart + len; - if (newSize > MAX_BUFFER_SIZE) { - throw new VectorOverflowException(); - } - - try { - holder.buffer.getBytes(start, data, outputStart, len); - } catch (IndexOutOfBoundsException e) { - while(data.capacity() < newSize) { - reAlloc(); - } - holder.buffer.getBytes(start, data, outputStart, len); - } - offsetVector.getMutator().setSafe( index+1, newSize); - } - /** * Backfill missing offsets from the given last written position to the * given current write position. Used by the "new" size-safe column @@ -785,20 +663,9 @@ public final class ${minor.class}Vector extends BaseDataValueVector implements V * to be copied forward * @param index the current write position filling occurs up to, * but not including, this position - * @throws VectorOverflowException if the item was written, false if the index would - * overfill the vector */ - public void fillEmptiesBounded(int lastWrite, int index) - throws VectorOverflowException { - - // Index is the next write index, which might be "virtual", - // that is, past the last row at EOF. This check only protects - // the actual data written here, which is up to index-1. - - if (index > UInt4Vector.MAX_ROW_COUNT) { - throw new VectorOverflowException(); - } + public void fillEmpties(int lastWrite, int index) { // If last write was 2, offsets are [0, 3, 6] // If next write is 4, offsets must be: [0, 3, 6, 6, 6] // Remember the offsets are one more than row count. @@ -810,7 +677,7 @@ public final class ${minor.class}Vector extends BaseDataValueVector implements V } } - protected void set(int index, int start, int length, DrillBuf buffer){ + protected void set(int index, int start, int length, DrillBuf buffer) { assert index >= 0; final int currentOffset = offsetVector.getAccessor().get(index); offsetVector.getMutator().set(index + 1, currentOffset + length); @@ -818,33 +685,20 @@ public final class ${minor.class}Vector extends BaseDataValueVector implements V data.setBytes(currentOffset, bb); } - protected void set(int index, Nullable${minor.class}Holder holder){ + protected void set(int index, Nullable${minor.class}Holder holder) { final int length = holder.end - holder.start; final int currentOffset = offsetVector.getAccessor().get(index); offsetVector.getMutator().set(index + 1, currentOffset + length); data.setBytes(currentOffset, holder.buffer, holder.start, length); } - protected void set(int index, ${minor.class}Holder holder){ + protected void set(int index, ${minor.class}Holder holder) { final int length = holder.end - holder.start; final int currentOffset = offsetVector.getAccessor().get(index); offsetVector.getMutator().set(index + 1, currentOffset + length); data.setBytes(currentOffset, holder.buffer, holder.start, length); } - <#if (minor.class == "VarChar")> - public void setScalar(int index, String value) throws VectorOverflowException { - if (index >= MAX_ROW_COUNT) { - throw new VectorOverflowException(); - } - // Treat a null string as an empty string. - if (value != null) { - byte encoded[] = value.getBytes(Charsets.UTF_8); - setScalar(index, encoded, 0, encoded.length); - } - } - - </#if> @Override public void setValueCount(int valueCount) { final int currentByteCapacity = getByteCapacity(); http://git-wip-us.apache.org/repos/asf/drill/blob/40de8ca4/exec/vector/src/main/java/org/apache/drill/exec/record/ColumnMetadata.java ---------------------------------------------------------------------- diff --git a/exec/vector/src/main/java/org/apache/drill/exec/record/ColumnMetadata.java b/exec/vector/src/main/java/org/apache/drill/exec/record/ColumnMetadata.java new file mode 100644 index 0000000..558aab8 --- /dev/null +++ b/exec/vector/src/main/java/org/apache/drill/exec/record/ColumnMetadata.java @@ -0,0 +1,114 @@ +/* + * 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.record; + +import org.apache.drill.common.types.TypeProtos.DataMode; +import org.apache.drill.common.types.TypeProtos.MajorType; +import org.apache.drill.common.types.TypeProtos.MinorType; + +/** + * Metadata description of a column including names, types and structure + * information. + */ + +public interface ColumnMetadata { + enum StructureType { + PRIMITIVE, LIST, TUPLE + } + + public static final int DEFAULT_ARRAY_SIZE = 10; + + ColumnMetadata.StructureType structureType(); + TupleMetadata mapSchema(); + MaterializedField schema(); + String name(); + MajorType majorType(); + MinorType type(); + DataMode mode(); + boolean isNullable(); + boolean isArray(); + boolean isVariableWidth(); + boolean isMap(); + boolean isList(); + + /** + * Report whether one column is equivalent to another. Columns are equivalent + * if they have the same name, type and structure (ignoring internal structure + * such as offset vectors.) + */ + + boolean isEquivalent(ColumnMetadata other); + + /** + * For variable-width columns, specify the expected column width to be used + * when allocating a new vector. Does nothing for fixed-width columns. + * + * @param width the expected column width + */ + + void setExpectedWidth(int width); + + /** + * Get the expected width for a column. This is the actual width for fixed- + * width columns, the specified width (defaulting to 50) for variable-width + * columns. + * @return the expected column width of the each data value. Does not include + * "overhead" space such as for the null-value vector or offset vector + */ + + int expectedWidth(); + + /** + * For an array column, specify the expected average array cardinality. + * Ignored for non-array columns. Used when allocating new vectors. + * + * @param childCount the expected average array cardinality. Defaults to + * 1 for non-array columns, 10 for array columns + */ + + void setExpectedElementCount(int childCount); + + /** + * Returns the expected array cardinality for array columns, or 1 for + * non-array columns. + * + * @return the expected value cardinality per value (per-row for top-level + * columns, per array element for arrays within lists) + */ + + int expectedElementCount(); + + /** + * Create an empty version of this column. If the column is a scalar, + * produces a simple copy. If a map, produces a clone without child + * columns. + * + * @return empty clone of this column + */ + + ColumnMetadata cloneEmpty(); + + /** + * Reports whether, in this context, the column is projected outside + * of the context. (That is, whether the column is backed by an actual + * value vector.) + */ + + boolean isProjected(); + void setProjected(boolean projected); +} http://git-wip-us.apache.org/repos/asf/drill/blob/40de8ca4/exec/vector/src/main/java/org/apache/drill/exec/record/MaterializedField.java ---------------------------------------------------------------------- diff --git a/exec/vector/src/main/java/org/apache/drill/exec/record/MaterializedField.java b/exec/vector/src/main/java/org/apache/drill/exec/record/MaterializedField.java index 4d29d55..b4b23c7 100644 --- a/exec/vector/src/main/java/org/apache/drill/exec/record/MaterializedField.java +++ b/exec/vector/src/main/java/org/apache/drill/exec/record/MaterializedField.java @@ -92,6 +92,10 @@ public class MaterializedField { return withPathAndType(name, getType()); } + public MaterializedField cloneEmpty() { + return create(name, type); + } + public MaterializedField withType(MajorType type) { return withPathAndType(name, type); } @@ -170,7 +174,37 @@ public class MaterializedField { Objects.equals(this.type, other.type); } + /** + * Determine if one column is logically equivalent to another. This is + * a tricky issue. The rules here: + * <ul> + * <li>The other schema is assumed to be non-null (unlike + * <tt>equals()</tt>).</li> + * <li>Names must be identical, ignoring case. (Drill, like SQL, is + * case insensitive.) + * <li>Type, mode, precision and scale must be identical.</li> + * <li>Child columns are ignored unless the type is a map. That is, the + * hidden "$bits" and "$offsets" vector columns are not compared, as + * one schema may be an "original" (without these hidden columns) while + * the other may come from a vector (which has the hidden columns added. + * The standard <tt>equals()</tt> comparison does consider hidden + * columns.</li> + * <li>For maps, the child columns are compared recursively. This version + * requires that the two sets of columns appear in the same order. (It + * assumes it is being used in a context where column indexes make + * sense.) Operators that want to reconcile two maps that differ only in + * column order need a different comparison.</li> + * </ul> + * + * @param other another field + * @return <tt>true</tt> if the columns are identical according to the + * above rules, <tt>false</tt> if they differ + */ + public boolean isEquivalent(MaterializedField other) { + if (this == other) { + return true; + } if (! name.equalsIgnoreCase(other.name)) { return false; } @@ -199,7 +233,7 @@ public class MaterializedField { return true; } - if (children == null || other.children == null) { + if (children == null || other.children == null) { return children == other.children; } if (children.size() != other.children.size()) { @@ -226,11 +260,12 @@ public class MaterializedField { * Includes field name, its type with precision and scale if any and data mode. * Nested fields if any are included. Number of nested fields to include is limited to 10.</p> * - * <b>FIELD_NAME(TYPE(PRECISION,SCALE):DATA_MODE)[NESTED_FIELD_1, NESTED_FIELD_2]</b> + * <b>FIELD_NAME(TYPE(PRECISION,SCALE):DATA_MODE)[NESTED_FIELD_1, NESTED_FIELD_2]</b><br> * <p>Example: ok(BIT:REQUIRED), col(VARCHAR(3):OPTIONAL), emp_id(DECIMAL28SPARSE(6,0):REQUIRED)</p> * * @return materialized field string representation */ + @Override public String toString() { final int maxLen = 10; @@ -258,7 +293,7 @@ public class MaterializedField { .append(childString); return builder.toString(); -} + } /** * Return true if two fields have identical MinorType and Mode. http://git-wip-us.apache.org/repos/asf/drill/blob/40de8ca4/exec/vector/src/main/java/org/apache/drill/exec/record/TupleMetadata.java ---------------------------------------------------------------------- diff --git a/exec/vector/src/main/java/org/apache/drill/exec/record/TupleMetadata.java b/exec/vector/src/main/java/org/apache/drill/exec/record/TupleMetadata.java new file mode 100644 index 0000000..8f597be --- /dev/null +++ b/exec/vector/src/main/java/org/apache/drill/exec/record/TupleMetadata.java @@ -0,0 +1,88 @@ +/* + * 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.record; + +import java.util.List; + +/** + * Metadata description of the schema of a row or a map. + * In Drill, both rows and maps are + * tuples: both are an ordered collection of values, defined by a + * schema. Each tuple has a schema that defines the column ordering + * for indexed access. Each tuple also provides methods to get column + * accessors by name or index. + * <p> + * Models the physical schema of a row set showing the logical hierarchy of fields + * with map fields as first-class fields. Map members appear as children + * under the map, much as they appear in the physical value-vector + * implementation. + * <ul> + * <li>Provides fast lookup by name or index.</li> + * <li>Provides a nested schema, in this same form, for maps.</li> + * </ul> + * This form is useful when performing semantic analysis and when + * working with vectors. + * <p> + * In the future, this structure will also gather metadata useful + * for vector processing such as expected widths and so on. + */ + +public interface TupleMetadata extends Iterable<ColumnMetadata> { + + /** + * Add a new column to the schema. + * + * @param columnSchema + * @return the index of the new column + */ + ColumnMetadata add(MaterializedField field); + int addColumn(ColumnMetadata column); + + int size(); + boolean isEmpty(); + int index(String name); + ColumnMetadata metadata(int index); + ColumnMetadata metadata(String name); + MaterializedField column(int index); + MaterializedField column(String name); + boolean isEquivalent(TupleMetadata other); + ColumnMetadata parent(); + + /** + * Return the schema as a list of <tt>MaterializedField</tt> objects + * which can be used to create other schemas. Not valid for a + * flattened schema. + * + * @return a list of the top-level fields. Maps contain their child + * fields + */ + + List<MaterializedField> toFieldList(); + + /** + * Full name of the column. Note: this name cannot be used to look up + * the column because of ambiguity. The name "a.b.c" may mean a single + * column with that name, or may mean maps "a", and "b" with column "c", + * etc. + * + * @return full, dotted, column name + */ + + String fullName(ColumnMetadata column); + String fullName(int index); +} http://git-wip-us.apache.org/repos/asf/drill/blob/40de8ca4/exec/vector/src/main/java/org/apache/drill/exec/record/TupleNameSpace.java ---------------------------------------------------------------------- diff --git a/exec/vector/src/main/java/org/apache/drill/exec/record/TupleNameSpace.java b/exec/vector/src/main/java/org/apache/drill/exec/record/TupleNameSpace.java new file mode 100644 index 0000000..5853c93 --- /dev/null +++ b/exec/vector/src/main/java/org/apache/drill/exec/record/TupleNameSpace.java @@ -0,0 +1,89 @@ +/* + * 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.record; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.apache.drill.common.map.CaseInsensitiveMap; + +import com.google.common.collect.ImmutableList; + +/** + * Implementation of a tuple name space. Tuples allow both indexed and + * named access to their members. + * + * @param <T> the type of object representing each column + */ + +public class TupleNameSpace<T> implements Iterable<T> { + private final Map<String,Integer> nameSpace = CaseInsensitiveMap.newHashMap(); + private final List<T> entries = new ArrayList<>(); + + public int add(String key, T value) { + if (indexOf(key) != -1) { + throw new IllegalArgumentException("Duplicate entry: " + key); + } + int index = entries.size(); + nameSpace.put(key, index); + entries.add(value); + return index; + } + + public T get(int index) { + return entries.get(index); + } + + public T get(String key) { + int index = indexOf(key); + if (index == -1) { + return null; + } + return get(index); + } + + public int indexOf(String key) { + Integer index = nameSpace.get(key); + if (index == null) { + return -1; + } + return index; + } + + public int count() { return entries.size(); } + + @Override + public Iterator<T> iterator() { + return entries.iterator(); + } + + public boolean isEmpty() { + return entries.isEmpty(); + } + + public List<T> entries() { + return ImmutableList.copyOf(entries); + } + + @Override + public String toString() { + return entries.toString(); + } +} http://git-wip-us.apache.org/repos/asf/drill/blob/40de8ca4/exec/vector/src/main/java/org/apache/drill/exec/vector/AllocationHelper.java ---------------------------------------------------------------------- diff --git a/exec/vector/src/main/java/org/apache/drill/exec/vector/AllocationHelper.java b/exec/vector/src/main/java/org/apache/drill/exec/vector/AllocationHelper.java index 100997e..4fd0cbd 100644 --- a/exec/vector/src/main/java/org/apache/drill/exec/vector/AllocationHelper.java +++ b/exec/vector/src/main/java/org/apache/drill/exec/vector/AllocationHelper.java @@ -39,7 +39,7 @@ public class AllocationHelper { ((VariableWidthVector) vector).allocateNew(valueCount * bytesPerValue, valueCount); } else if (vector instanceof RepeatedFixedWidthVectorLike) { ((RepeatedFixedWidthVectorLike) vector).allocateNew(valueCount, childValCount); - } else if (vector instanceof RepeatedVariableWidthVectorLike && childValCount > 0 && bytesPerValue > 0) { + } else if (vector instanceof RepeatedVariableWidthVectorLike) { // Assertion thrown if byte count is zero in the full allocateNew, // so use default version instead. ((RepeatedVariableWidthVectorLike) vector).allocateNew(childValCount * bytesPerValue, valueCount, childValCount); http://git-wip-us.apache.org/repos/asf/drill/blob/40de8ca4/exec/vector/src/main/java/org/apache/drill/exec/vector/BaseDataValueVector.java ---------------------------------------------------------------------- diff --git a/exec/vector/src/main/java/org/apache/drill/exec/vector/BaseDataValueVector.java b/exec/vector/src/main/java/org/apache/drill/exec/vector/BaseDataValueVector.java index e98a417..4391e8c 100644 --- a/exec/vector/src/main/java/org/apache/drill/exec/vector/BaseDataValueVector.java +++ b/exec/vector/src/main/java/org/apache/drill/exec/vector/BaseDataValueVector.java @@ -37,6 +37,16 @@ public abstract class BaseDataValueVector extends BaseValueVector { data = allocator.getEmpty(); } + /** + * Core of vector allocation. Given a new size (which must be a power of two), allocate + * the new buffer, copy the current values, and leave the unused parts garbage-filled. + * + * @param newAllocationSize new buffer size as a power of two + * @return the new buffer + */ + + public abstract DrillBuf reallocRaw(int newAllocationSize); + @Override public void clear() { if (data != null) { @@ -82,6 +92,11 @@ public abstract class BaseDataValueVector extends BaseValueVector { return data.writerIndex(); } + @Override + public int getAllocatedSize() { + return data.capacity(); + } + public DrillBuf getBuffer() { return data; } /** @@ -101,6 +116,7 @@ public abstract class BaseDataValueVector extends BaseValueVector { // No state in an Accessor to reset } + @Override public void collectLedgers(Set<BufferLedger> ledgers) { BufferLedger ledger = data.getLedger(); if (ledger != null) { http://git-wip-us.apache.org/repos/asf/drill/blob/40de8ca4/exec/vector/src/main/java/org/apache/drill/exec/vector/BitVector.java ---------------------------------------------------------------------- diff --git a/exec/vector/src/main/java/org/apache/drill/exec/vector/BitVector.java b/exec/vector/src/main/java/org/apache/drill/exec/vector/BitVector.java index f879fc4..219db12 100644 --- a/exec/vector/src/main/java/org/apache/drill/exec/vector/BitVector.java +++ b/exec/vector/src/main/java/org/apache/drill/exec/vector/BitVector.java @@ -193,6 +193,16 @@ public final class BitVector extends BaseDataValueVector implements FixedWidthVe allocationSizeInBytes = curSize; } + // This version uses the base version because this vector appears to not be + // used, so not worth the effort to avoid zero-fill. + + public DrillBuf reallocRaw(int newAllocationSize) { + while (allocationSizeInBytes < newAllocationSize) { + reAlloc(); + } + return data; + } + /** * {@inheritDoc} */ @@ -438,20 +448,6 @@ public final class BitVector extends BaseDataValueVector implements FixedWidthVe set(index, value); } - public void setScalar(int index, int value) throws VectorOverflowException { - if (index >= MAX_COUNT) { - throw new VectorOverflowException(); - } - setSafe(index, value); - } - - public void setArrayItem(int index, int value) throws VectorOverflowException { - if (index >= MAX_CAPACITY) { - throw new VectorOverflowException(); - } - setSafe(index, value); - } - public void setSafe(int index, BitHolder holder) { while(index >= getValueCapacity()) { reAlloc(); @@ -459,20 +455,6 @@ public final class BitVector extends BaseDataValueVector implements FixedWidthVe set(index, holder.value); } - public void setScalar(int index, BitHolder holder) throws VectorOverflowException { - if (index >= MAX_COUNT) { - throw new VectorOverflowException(); - } - setSafe(index, holder); - } - - public void setArrayItem(int index, BitHolder holder) throws VectorOverflowException { - if (index >= MAX_CAPACITY) { - throw new VectorOverflowException(); - } - setSafe(index, holder); - } - public void setSafe(int index, NullableBitHolder holder) { while(index >= getValueCapacity()) { reAlloc(); @@ -480,20 +462,6 @@ public final class BitVector extends BaseDataValueVector implements FixedWidthVe set(index, holder.value); } - public void setScalar(int index, NullableBitHolder holder) throws VectorOverflowException { - if (index >= MAX_COUNT) { - throw new VectorOverflowException(); - } - setSafe(index, holder); - } - - public void setArrayItem(int index, NullableBitHolder holder) throws VectorOverflowException { - if (index >= MAX_CAPACITY) { - throw new VectorOverflowException(); - } - setSafe(index, holder); - } - @Override public final void setValueCount(int valueCount) { int currentValueCapacity = getValueCapacity(); http://git-wip-us.apache.org/repos/asf/drill/blob/40de8ca4/exec/vector/src/main/java/org/apache/drill/exec/vector/FixedWidthVector.java ---------------------------------------------------------------------- diff --git a/exec/vector/src/main/java/org/apache/drill/exec/vector/FixedWidthVector.java b/exec/vector/src/main/java/org/apache/drill/exec/vector/FixedWidthVector.java index a9a1631..09bcdd8 100644 --- a/exec/vector/src/main/java/org/apache/drill/exec/vector/FixedWidthVector.java +++ b/exec/vector/src/main/java/org/apache/drill/exec/vector/FixedWidthVector.java @@ -17,7 +17,6 @@ */ package org.apache.drill.exec.vector; - public interface FixedWidthVector extends ValueVector { /** @@ -27,8 +26,8 @@ public interface FixedWidthVector extends ValueVector { */ void allocateNew(int valueCount); -/** - * Zero out the underlying buffer backing this vector. - */ + /** + * Zero out the underlying buffer backing this vector. + */ void zeroVector(); } http://git-wip-us.apache.org/repos/asf/drill/blob/40de8ca4/exec/vector/src/main/java/org/apache/drill/exec/vector/ObjectVector.java ---------------------------------------------------------------------- diff --git a/exec/vector/src/main/java/org/apache/drill/exec/vector/ObjectVector.java b/exec/vector/src/main/java/org/apache/drill/exec/vector/ObjectVector.java index c9edeb0..8d515d8 100644 --- a/exec/vector/src/main/java/org/apache/drill/exec/vector/ObjectVector.java +++ b/exec/vector/src/main/java/org/apache/drill/exec/vector/ObjectVector.java @@ -95,8 +95,7 @@ public class ObjectVector extends BaseValueVector { } @Override - public void generateTestData(int values) { - } + public void generateTestData(int values) { } @Override public void exchange(ValueVector.Mutator other) { } @@ -130,6 +129,9 @@ public class ObjectVector extends BaseValueVector { } @Override + public int getAllocatedSize() { return 0; } + + @Override public int getBufferSizeFor(final int valueCount) { throw new UnsupportedOperationException("ObjectVector does not support this"); } @@ -147,9 +149,7 @@ public class ObjectVector extends BaseValueVector { } @Override - public MaterializedField getField() { - return field; - } + public MaterializedField getField() { return field; } @Override public TransferPair getTransferPair(BufferAllocator allocator) { @@ -172,14 +172,10 @@ public class ObjectVector extends BaseValueVector { } @Override - public int getValueCapacity() { - return maxCount; - } + public int getValueCapacity() { return maxCount; } @Override - public Accessor getAccessor() { - return accessor; - } + public Accessor getAccessor() { return accessor; } @Override public DrillBuf[] getBuffers(boolean clear) { @@ -197,9 +193,7 @@ public class ObjectVector extends BaseValueVector { } @Override - public Mutator getMutator() { - return mutator; - } + public Mutator getMutator() { return mutator; } @Override public Iterator<ValueVector> iterator() { @@ -222,9 +216,7 @@ public class ObjectVector extends BaseValueVector { } @Override - public int getValueCount() { - return count; - } + public int getValueCount() { return count; } public Object get(int index) { return getObject(index); http://git-wip-us.apache.org/repos/asf/drill/blob/40de8ca4/exec/vector/src/main/java/org/apache/drill/exec/vector/UntypedNullVector.java ---------------------------------------------------------------------- diff --git a/exec/vector/src/main/java/org/apache/drill/exec/vector/UntypedNullVector.java b/exec/vector/src/main/java/org/apache/drill/exec/vector/UntypedNullVector.java index 8288fe2..5565fa4 100644 --- a/exec/vector/src/main/java/org/apache/drill/exec/vector/UntypedNullVector.java +++ b/exec/vector/src/main/java/org/apache/drill/exec/vector/UntypedNullVector.java @@ -27,8 +27,6 @@ import org.apache.drill.exec.record.MaterializedField; import org.apache.drill.exec.record.TransferPair; import org.apache.drill.exec.vector.complex.reader.FieldReader; -import static org.apache.calcite.sql.parser.impl.SqlParserImplConstants.C; - /** UntypedNullVector is to represent a value vector with {@link org.apache.drill.common.types.MinorType#NULL} * All values in the vector represent two semantic implications: 1) the value is unknown, 2) the type is unknown. * Because of this, we only have to keep track of the number of values in value vector, @@ -37,7 +35,6 @@ import static org.apache.calcite.sql.parser.impl.SqlParserImplConstants.C; * */ public final class UntypedNullVector extends BaseDataValueVector implements FixedWidthVector { - private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(UntypedNullVector.class); /** * Width of each fixed-width value. @@ -57,14 +54,10 @@ public final class UntypedNullVector extends BaseDataValueVector implements Fixe public FieldReader getReader() { throw new UnsupportedOperationException(); } @Override - public int getBufferSizeFor(final int valueCount) { - return 0; - } + public int getBufferSizeFor(final int valueCount) { return 0; } @Override - public int getValueCapacity(){ - return ValueVector.MAX_ROW_COUNT; - } + public int getValueCapacity() { return ValueVector.MAX_ROW_COUNT; } @Override public Accessor getAccessor() { return accessor; } @@ -73,31 +66,29 @@ public final class UntypedNullVector extends BaseDataValueVector implements Fixe public Mutator getMutator() { return mutator; } @Override - public void setInitialCapacity(final int valueCount) { - } + public void setInitialCapacity(final int valueCount) { } @Override - public void allocateNew() { - } + public void allocateNew() { } @Override - public boolean allocateNewSafe() { - return true; - } + public boolean allocateNewSafe() { return true; } @Override - public void allocateNew(final int valueCount) { - } + public void allocateNew(final int valueCount) { } @Override - public void reset() { - } + public void reset() { } /** * {@inheritDoc} */ @Override - public void zeroVector() { + public void zeroVector() { } + + @Override + public DrillBuf reallocRaw(int newAllocationSize) { + throw new UnsupportedOperationException(); } @Override @@ -127,19 +118,15 @@ public final class UntypedNullVector extends BaseDataValueVector implements Fixe return new TransferImpl((UntypedNullVector) to); } - public void transferTo(UntypedNullVector target){ - } + public void transferTo(UntypedNullVector target) { } - public void splitAndTransferTo(int startIndex, int length, UntypedNullVector target) { - } + public void splitAndTransferTo(int startIndex, int length, UntypedNullVector target) { } @Override - public int getPayloadByteCount(int valueCount) { - return 0; - } + public int getPayloadByteCount(int valueCount) { return 0; } private class TransferImpl implements TransferPair{ - private UntypedNullVector to; + private final UntypedNullVector to; public TransferImpl(MaterializedField field, BufferAllocator allocator){ to = new UntypedNullVector(field, allocator); @@ -150,9 +137,7 @@ public final class UntypedNullVector extends BaseDataValueVector implements Fixe } @Override - public UntypedNullVector getTo(){ - return to; - } + public UntypedNullVector getTo() { return to; } @Override public void transfer(){ @@ -173,11 +158,9 @@ public final class UntypedNullVector extends BaseDataValueVector implements Fixe } } - public void copyFrom(int fromIndex, int thisIndex, UntypedNullVector from){ - } + public void copyFrom(int fromIndex, int thisIndex, UntypedNullVector from) { } - public void copyFromSafe(int fromIndex, int thisIndex, UntypedNullVector from){ - } + public void copyFromSafe(int fromIndex, int thisIndex, UntypedNullVector from) { } private void checkBounds(int index) { if (index < 0 || index >= valueCount) { @@ -216,7 +199,6 @@ public final class UntypedNullVector extends BaseDataValueVector implements Fixe public void get(int index, UntypedNullHolder holder) { checkBounds(index); } - } /** @@ -224,7 +206,7 @@ public final class UntypedNullVector extends BaseDataValueVector implements Fixe * value counts. * */ - public final class Mutator extends BaseMutator { + public final class Mutator extends BaseMutator { private Mutator() {} @@ -266,5 +248,4 @@ public final class UntypedNullVector extends BaseDataValueVector implements Fixe UntypedNullVector.this.valueCount = valueCount; } } - } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/drill/blob/40de8ca4/exec/vector/src/main/java/org/apache/drill/exec/vector/ValueVector.java ---------------------------------------------------------------------- diff --git a/exec/vector/src/main/java/org/apache/drill/exec/vector/ValueVector.java b/exec/vector/src/main/java/org/apache/drill/exec/vector/ValueVector.java index a090cad..bc06803 100644 --- a/exec/vector/src/main/java/org/apache/drill/exec/vector/ValueVector.java +++ b/exec/vector/src/main/java/org/apache/drill/exec/vector/ValueVector.java @@ -25,6 +25,7 @@ import io.netty.buffer.DrillBuf; import org.apache.drill.exec.exception.OutOfMemoryException; import org.apache.drill.exec.memory.AllocationManager.BufferLedger; +import org.apache.drill.exec.memory.AllocationManager; import org.apache.drill.exec.memory.BufferAllocator; import org.apache.drill.exec.proto.UserBitShared.SerializedField; import org.apache.drill.exec.record.MaterializedField; @@ -32,12 +33,15 @@ import org.apache.drill.exec.record.TransferPair; import org.apache.drill.exec.vector.complex.reader.FieldReader; /** - * An abstraction that is used to store a sequence of values in an individual column. + * An abstraction that is used to store a sequence of values in an individual + * column. * - * A {@link ValueVector value vector} stores underlying data in-memory in a columnar fashion that is compact and - * efficient. The column whose data is stored, is referred by {@link #getField()}. + * A {@link ValueVector value vector} stores underlying data in-memory in a + * columnar fashion that is compact and efficient. The column whose data is + * stored, is referred by {@link #getField()}. * - * A vector when instantiated, relies on a {@link org.apache.drill.exec.record.DeadBuf dead buffer}. It is important + * A vector when instantiated, relies on a + * {@link org.apache.drill.exec.record.DeadBuf dead buffer}. It is important * that vector is allocated before attempting to read or write. * * There are a few "rules" around vectors: @@ -45,37 +49,34 @@ import org.apache.drill.exec.vector.complex.reader.FieldReader; * <ul> * <li>Values need to be written in order (e.g. index 0, 1, 2, 5).</li> * <li>Null vectors start with all values as null before writing anything.</li> - * <li>For variable width types, the offset vector should be all zeros before writing.</li> + * <li>For variable width types, the offset vector should be all zeros before + * writing.</li> * <li>You must call setValueCount before a vector can be read.</li> * <li>You should never write to a vector once it has been read.</li> - * <li>Vectors may not grow larger than the number of bytes specified - * in {@link #MAX_BUFFER_SIZE} to prevent memory fragmentation. Use the + * <li>Vectors may not grow larger than the number of bytes specified in + * {@link #MAX_BUFFER_SIZE} to prevent memory fragmentation. Use the * <tt>setBounded()</tt> methods in the mutator to enforce this rule.</li> * </ul> * - * Please note that the current implementation doesn't enforce those rules, hence we may find few places that - * deviate from these rules (e.g. offset vectors in Variable Length and Repeated vector) + * Please note that the current implementation doesn't enforce those rules, + * hence we may find few places that deviate from these rules (e.g. offset + * vectors in Variable Length and Repeated vector) * * This interface "should" strive to guarantee this order of operation: * <blockquote> - * allocate > mutate > setvaluecount > access > clear (or allocate to start the process over). + * allocate > mutate > setvaluecount > access > clear (or allocate + * to start the process over). * </blockquote> */ + public interface ValueVector extends Closeable, Iterable<ValueVector> { /** * Maximum allowed size of the buffer backing a value vector. + * Set to the Netty chunk size to prevent memory fragmentation. */ - int MAX_BUFFER_SIZE = VectorUtils.maxSize(); - - /** - * Debug-time system option that artificially limits vector lengths - * for testing. Must be set prior to the first reference to this - * class. (Made deliberately difficult to prevent misuse...) - */ - - String MAX_BUFFER_SIZE_KEY = "drill.max_vector"; + int MAX_BUFFER_SIZE = AllocationManager.chunkSize(); /** * Maximum allowed row count in a vector. Repeated vectors @@ -167,10 +168,24 @@ public interface ValueVector extends Closeable, Iterable<ValueVector> { /** * Returns the number of bytes that is used by this vector instance. + * This is a bit of a misnomer. Returns the number of bytes used by + * data in this instance. */ int getBufferSize(); /** + * Returns the total size of buffers allocated by this vector. Has + * meaning only when vectors are directly allocated and each vector + * has its own buffer. Does not have meaning for vectors deserialized + * from the network or disk in which multiple vectors share the + * same vector. + * + * @return allocated buffer size, in bytes + */ + + int getAllocatedSize(); + + /** * Returns the number of bytes that is used by this vector if it holds the given number * of values. The result will be the same as if Mutator.setValueCount() were called, followed * by calling getBufferSize(), but without any of the closing side-effects that setValueCount() http://git-wip-us.apache.org/repos/asf/drill/blob/40de8ca4/exec/vector/src/main/java/org/apache/drill/exec/vector/VariableWidthVector.java ---------------------------------------------------------------------- diff --git a/exec/vector/src/main/java/org/apache/drill/exec/vector/VariableWidthVector.java b/exec/vector/src/main/java/org/apache/drill/exec/vector/VariableWidthVector.java index d04234c..f5373d0 100644 --- a/exec/vector/src/main/java/org/apache/drill/exec/vector/VariableWidthVector.java +++ b/exec/vector/src/main/java/org/apache/drill/exec/vector/VariableWidthVector.java @@ -1,4 +1,4 @@ -/** +/* * 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 @@ -33,8 +33,10 @@ public interface VariableWidthVector extends ValueVector { */ int getByteCapacity(); + @Override VariableWidthMutator getMutator(); + @Override VariableWidthAccessor getAccessor(); interface VariableWidthAccessor extends Accessor { http://git-wip-us.apache.org/repos/asf/drill/blob/40de8ca4/exec/vector/src/main/java/org/apache/drill/exec/vector/VectorUtils.java ---------------------------------------------------------------------- diff --git a/exec/vector/src/main/java/org/apache/drill/exec/vector/VectorUtils.java b/exec/vector/src/main/java/org/apache/drill/exec/vector/VectorUtils.java deleted file mode 100644 index 6b29eb2..0000000 --- a/exec/vector/src/main/java/org/apache/drill/exec/vector/VectorUtils.java +++ /dev/null @@ -1,63 +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.vector; - -public class VectorUtils { - - /** - * Vectors cannot be any larger than the Netty memory allocation - * block size. - */ - - private static final int ABSOLUTE_MAX_SIZE = 16 * 1024 * 1024; - - /** - * Minimum size selected to prevent pathological performance if vectors - * are limited to an unusably small size. This limit is a judgment call, - * not based on any known limits. - */ - - private static final int ABSOLUTE_MIN_SIZE = 16 * 1024; - - private VectorUtils() { } - - /** - * Static function called once per run to compute the maximum - * vector size, in bytes. Normally uses the hard-coded limit, - * but allows setting a system property to override the limit - * for testing. The configured value must be within reasonable - * bounds. - * @return the maximum vector size, in bytes - */ - - static int maxSize() { - String prop = System.getProperty( ValueVector.MAX_BUFFER_SIZE_KEY ); - int value = ABSOLUTE_MAX_SIZE; - if (prop != null) { - try { - value = Integer.parseInt(prop); - value = Math.max(value, ABSOLUTE_MIN_SIZE); - value = Math.min(value, ABSOLUTE_MAX_SIZE); - } catch (NumberFormatException e) { - // Ignore - } - } - return value; - } - -} http://git-wip-us.apache.org/repos/asf/drill/blob/40de8ca4/exec/vector/src/main/java/org/apache/drill/exec/vector/ZeroVector.java ---------------------------------------------------------------------- diff --git a/exec/vector/src/main/java/org/apache/drill/exec/vector/ZeroVector.java b/exec/vector/src/main/java/org/apache/drill/exec/vector/ZeroVector.java index e6f0544..fc89d71 100644 --- a/exec/vector/src/main/java/org/apache/drill/exec/vector/ZeroVector.java +++ b/exec/vector/src/main/java/org/apache/drill/exec/vector/ZeroVector.java @@ -17,6 +17,7 @@ */ package org.apache.drill.exec.vector; +import java.util.Collections; import java.util.Iterator; import java.util.Set; @@ -105,13 +106,16 @@ public class ZeroVector implements ValueVector { @Override public Iterator<ValueVector> iterator() { - return Iterators.emptyIterator(); + return Collections.emptyIterator(); } @Override public int getBufferSize() { return 0; } @Override + public int getAllocatedSize() { return 0; } + + @Override public int getBufferSizeFor(final int valueCount) { return 0; } @Override http://git-wip-us.apache.org/repos/asf/drill/blob/40de8ca4/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/AccessorUtilities.java ---------------------------------------------------------------------- diff --git a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/AccessorUtilities.java b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/AccessorUtilities.java deleted file mode 100644 index 708d0db..0000000 --- a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/AccessorUtilities.java +++ /dev/null @@ -1,125 +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.vector.accessor; - -import java.math.BigDecimal; - -import org.joda.time.Duration; -import org.joda.time.Period; - -public class AccessorUtilities { - - private AccessorUtilities() { } - - public static void setFromInt(ColumnWriter writer, int value) { - switch (writer.valueType()) { - case BYTES: - writer.setBytes(Integer.toHexString(value).getBytes()); - break; - case DOUBLE: - writer.setDouble(value); - break; - case INTEGER: - writer.setInt(value); - break; - case LONG: - writer.setLong(value); - break; - case STRING: - writer.setString(Integer.toString(value)); - break; - case DECIMAL: - writer.setDecimal(BigDecimal.valueOf(value)); - break; - case PERIOD: - writer.setPeriod(Duration.millis(value).toPeriod()); - break; - default: - throw new IllegalStateException("Unknown writer type: " + writer.valueType()); - } - } - - public static int sv4Batch(int sv4Index) { - return sv4Index >>> 16; - } - - public static int sv4Index(int sv4Index) { - return sv4Index & 0xFFFF; - } - - public static void setBooleanArray(ArrayWriter arrayWriter, boolean[] value) { - for (int i = 0; i < value.length; i++) { - arrayWriter.setInt(value[i] ? 1 : 0); - } - } - - public static void setByteArray(ArrayWriter arrayWriter, byte[] value) { - for (int i = 0; i < value.length; i++) { - arrayWriter.setInt(value[i]); - } - } - - public static void setShortArray(ArrayWriter arrayWriter, short[] value) { - for (int i = 0; i < value.length; i++) { - arrayWriter.setInt(value[i]); - } - } - - public static void setIntArray(ArrayWriter arrayWriter, int[] value) { - for (int i = 0; i < value.length; i++) { - arrayWriter.setInt(value[i]); - } - } - - public static void setLongArray(ArrayWriter arrayWriter, long[] value) { - for (int i = 0; i < value.length; i++) { - arrayWriter.setLong(value[i]); - } - } - - public static void setFloatArray(ArrayWriter arrayWriter, float[] value) { - for (int i = 0; i < value.length; i++) { - arrayWriter.setDouble(value[i]); - } - } - - public static void setDoubleArray(ArrayWriter arrayWriter, double[] value) { - for (int i = 0; i < value.length; i++) { - arrayWriter.setDouble(value[i]); - } - } - - public static void setStringArray(ArrayWriter arrayWriter, String[] value) { - for (int i = 0; i < value.length; i++) { - arrayWriter.setString(value[i]); - } - } - - public static void setPeriodArray(ArrayWriter arrayWriter, Period[] value) { - for (int i = 0; i < value.length; i++) { - arrayWriter.setPeriod(value[i]); - } - } - - public static void setBigDecimalArray(ArrayWriter arrayWriter, - BigDecimal[] value) { - for (int i = 0; i < value.length; i++) { - arrayWriter.setDecimal(value[i]); - } - } -} http://git-wip-us.apache.org/repos/asf/drill/blob/40de8ca4/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/ArrayReader.java ---------------------------------------------------------------------- diff --git a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/ArrayReader.java b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/ArrayReader.java index 040dcda..8f33f0e 100644 --- a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/ArrayReader.java +++ b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/ArrayReader.java @@ -17,36 +17,90 @@ */ package org.apache.drill.exec.vector.accessor; -import java.math.BigDecimal; - -import org.joda.time.Period; - /** - * Interface to access the values of an array column. In general, each - * vector implements just one of the get methods. Check the vector type - * to know which method to use. Though, generally, when writing test - * code, the type is known to the test writer. - * <p> - * Arrays allow random access to the values within the array. The index - * passed to each method is the index into the array for the current - * row and column. (This means that arrays are three dimensional: - * the usual (row, column) dimensions plus an array index dimension: - * (row, column, array index). - * <p> - * Note that the <tt>isNull()</tt> method is provided for completeness, - * but no Drill array allows null values at present. + * Generic array reader. An array is one of the following: + * <ul> + * <li>Array of scalars. Read the values using {@link #elements()}, which provides + * an array-like access to the scalars.</li> + * <li>A repeated map. Use {@link #tuple(int)} to get a tuple reader for a + * specific array element. Use {@link #size()} to learn the number of maps in + * the array.</li> + * <li>List of lists. Use the {@link #array(int)} method to get the nested list + * at a given index. Use {@link #size()} to learn the number of maps in + * the array.</li> + * </ul> + * {@see ArrayWriter} */ -public interface ArrayReader extends ColumnAccessor { +public interface ArrayReader { + + /** + * Number of elements in the array. + * @return the number of elements + */ + int size(); - boolean isNull(int index); - int getInt(int index); - long getLong(int index); - double getDouble(int index); - String getString(int index); - byte[] getBytes(int index); - BigDecimal getDecimal(int index); - Period getPeriod(int index); - TupleReader map(int index); + + /** + * The object type of the list entry. All entries have the same + * type. + * @return the object type of each entry + */ + + ObjectType entryType(); + + /** + * Return a reader for the elements of a scalar array. + * @return reader for scalar elements + */ + + ScalarElementReader elements(); + + /** + * Return a generic object reader for the array entry. Not available + * for scalar elements. Positions the reader to read the selected + * element. + * + * @param index array index + * @return generic object reader + */ + + ObjectReader entry(int index); + TupleReader tuple(int index); ArrayReader array(int index); + + /** + * Return the generic object reader for the array element. This + * version <i>does not</i> position the reader, the client must + * call {@link setPosn()} to set the position. This form allows + * up-front setup of the readers when convenient for the caller. + */ + + ObjectReader entry(); + TupleReader tuple(); + ArrayReader array(); + + /** + * Set the array reader to read a given array entry. Not used for + * scalars, only for maps and arrays when using the non-indexed + * methods {@link #entry()}, {@link #tuple()} and {@link #array()}. + */ + + void setPosn(int index); + + /** + * Return the entire array as an <tt>List</tt> of objects. + * Note, even if the array is scalar, the elements are still returned + * as a list. This method is primarily for testing. + * @return array as a <tt>List</tt> of objects + */ + + Object getObject(); + + /** + * Return the entire array as a string. Primarily for debugging. + * @return string representation of the array + */ + + String getAsString(); } http://git-wip-us.apache.org/repos/asf/drill/blob/40de8ca4/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/ArrayWriter.java ---------------------------------------------------------------------- diff --git a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/ArrayWriter.java b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/ArrayWriter.java index 16ff89e..49a1e77 100644 --- a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/ArrayWriter.java +++ b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/ArrayWriter.java @@ -18,25 +18,65 @@ package org.apache.drill.exec.vector.accessor; /** - * Writer for values into an array. Array writes are write-once, - * sequential: each call to a <tt>setFoo()</tt> method writes a - * value and advances the array index. + * Writer for values into an array. Array writes are write-once, sequential: + * each call to a <tt>setFoo()</tt> method writes a value and advances the array + * index. * <p> * {@see ArrayReader} */ -public interface ArrayWriter extends ColumnAccessor, ScalarWriter { +public interface ArrayWriter { + + /** + * Number of elements written thus far to the array. + * @return the number of elements + */ int size(); /** - * Determine if the next position is valid for writing. Will be invalid - * if the writer hits a size or other limit. + * The object type of the list entry. All entries have the same + * type. + * @return the object type of each entry + */ + + ObjectWriter entry(); + + /** + * Return a generic object writer for the array entry. + * + * @return generic object reader + */ + + ObjectType entryType(); + ScalarWriter scalar(); + TupleWriter tuple(); + ArrayWriter array(); + + /** + * When the array contains a tuple or an array, call <tt>save()</tt> + * after each array value. Not necessary when writing scalars; each + * set operation calls save automatically. + */ + + void save(); + + /** + * Write the values of an array from a list of arguments. + * @param values values for each array element + * @throws VectorOverflowException + */ + void set(Object ...values); + + /** + * Write the array given an array of values. The type of array must match + * the type of element in the array. That is, if the value is an <tt>int</tt>, + * provide an <tt>int[]</tt> array. * - * @return true if another item is available and the reader is positioned - * at that item, false if no more items are available and the reader - * is no longer valid + * @param array array of values to write + * @throws VectorOverflowException */ - boolean valid(); + void setObject(Object array); +// void setList(List<? extends Object> list); } http://git-wip-us.apache.org/repos/asf/drill/blob/40de8ca4/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/ColumnAccessor.java ---------------------------------------------------------------------- diff --git a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/ColumnAccessor.java b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/ColumnAccessor.java deleted file mode 100644 index 44cd48a..0000000 --- a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/ColumnAccessor.java +++ /dev/null @@ -1,40 +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.vector.accessor; - -/** - * Common base interface for columns readers and writers. Provides - * the access type for the column. Note that multiple Drill types and - * data modes map to the same access type. - */ - -public interface ColumnAccessor { - public enum ValueType { - INTEGER, LONG, DOUBLE, STRING, BYTES, DECIMAL, PERIOD, ARRAY, MAP - } - - /** - * Describe the type of the value. This is a compression of the - * value vector type: it describes which method will return the - * vector value. - * @return the value type which indicates which get method - * is valid for the column - */ - - ColumnAccessor.ValueType valueType(); -} http://git-wip-us.apache.org/repos/asf/drill/blob/40de8ca4/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/ColumnReader.java ---------------------------------------------------------------------- diff --git a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/ColumnReader.java b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/ColumnReader.java deleted file mode 100644 index 4932567..0000000 --- a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/ColumnReader.java +++ /dev/null @@ -1,64 +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.vector.accessor; - -import java.math.BigDecimal; - -import org.joda.time.Period; - -/** - * Defines a reader to obtain values from value vectors using - * a simple, uniform interface. Vector values are mapped to - * their "natural" representations: the representation closest - * to the actual vector value. For date and time values, this - * generally means a numeric value. Applications can then map - * this value to Java objects as desired. Decimal types all - * map to BigDecimal as that is the only way in Java to - * represent large decimal values. - * <p> - * In general, a column maps to just one value. However, derived - * classes may choose to provide type conversions if convenient. - * An exception is thrown if a call is made to a method that - * is not supported by the column type. - * <p> - * Values of scalars are provided directly, using the get method - * for the target type. Maps and arrays are structured types and - * require another level of reader abstraction to access each value - * in the structure. - */ - -public interface ColumnReader extends ColumnAccessor { - - /** - * Report if the column is null. Non-nullable columns always - * return <tt>false</tt>. - * @return true if the column value is null, false if the - * value is set - */ - boolean isNull(); - int getInt(); - long getLong(); - double getDouble(); - String getString(); - byte[] getBytes(); - BigDecimal getDecimal(); - Period getPeriod(); - Object getObject(); - TupleReader map(); - ArrayReader array(); -} http://git-wip-us.apache.org/repos/asf/drill/blob/40de8ca4/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/ColumnReaderIndex.java ---------------------------------------------------------------------- diff --git a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/ColumnReaderIndex.java b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/ColumnReaderIndex.java new file mode 100644 index 0000000..b40b705 --- /dev/null +++ b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/ColumnReaderIndex.java @@ -0,0 +1,28 @@ +/* + * 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.vector.accessor; + +/** + * Index into a vector batch, or an array, at read time. + * Supports direct, indirect and hyper-batches. + */ + +public interface ColumnReaderIndex { + int batchIndex(); + int vectorIndex(); +} http://git-wip-us.apache.org/repos/asf/drill/blob/40de8ca4/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/ColumnWriter.java ---------------------------------------------------------------------- diff --git a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/ColumnWriter.java b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/ColumnWriter.java deleted file mode 100644 index 0cc691c..0000000 --- a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/ColumnWriter.java +++ /dev/null @@ -1,45 +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.vector.accessor; - -/** - * Defines a writer to set values for value vectors using - * a simple, uniform interface. Vector values are mapped to - * their "natural" representations: the representation closest - * to the actual vector value. For date and time values, this - * generally means a numeric value. Applications can then map - * this value to Java objects as desired. Decimal types all - * map to BigDecimal as that is the only way in Java to - * represent large decimal values. - * <p> - * In general, a column maps to just one value. However, derived - * classes may choose to provide type conversions if convenient. - * An exception is thrown if a call is made to a method that - * is not supported by the column type. - * <p> - * Values of scalars are set directly, using the get method - * for the target type. Maps and arrays are structured types and - * require another level of writer abstraction to access each value - * in the structure. - */ - -public interface ColumnWriter extends ColumnAccessor, ScalarWriter { - void setNull(); - TupleWriter map(); - ArrayWriter array(); -}
