private void writeList(ListVector arrowVector, ListColumnVector hiveVector, ListTypeInfo typeInfo, int size, VectorizedRowBatch vectorizedRowBatch, boolean isNative) { final int OFFSET_WIDTH = 4; final TypeInfo elementTypeInfo = typeInfo.getListElementTypeInfo(); final ColumnVector hiveElementVector = hiveVector.child; final FieldVector arrowElementVector = (FieldVector) arrowVector.addOrGetVector(toFieldType(elementTypeInfo)).getVector(); arrowElementVector.setInitialCapacity(hiveVector.childCount); arrowElementVector.allocateNew(); write(arrowElementVector, hiveElementVector, elementTypeInfo, hiveVector.childCount, vectorizedRowBatch, isNative); final ArrowBuf offsetBuffer = arrowVector.getOffsetBuffer(); int nextOffset = 0; for (int rowIndex = 0; rowIndex < size; rowIndex++) { if (hiveVector.isNull[rowIndex]) { offsetBuffer.setInt(rowIndex * OFFSET_WIDTH, nextOffset); } else { offsetBuffer.setInt(rowIndex * OFFSET_WIDTH, nextOffset); nextOffset += (int) hiveVector.lengths[rowIndex]; arrowVector.setNotNull(rowIndex); } } offsetBuffer.setInt(size * OFFSET_WIDTH, nextOffset); }
@Override public void initializeChildrenFromFields(List<Field> children) { if (children.size() != 1) { throw new IllegalArgumentException("Lists have only one child. Found: " + children); } Field field = children.get(0); AddOrGetResult<FieldVector> addOrGetVector = addOrGetVector(field.getFieldType()); if (!addOrGetVector.isCreated()) { throw new IllegalArgumentException("Child vector already existed: " + addOrGetVector.getVector()); } addOrGetVector.getVector().initializeChildrenFromFields(field.getChildren()); }
@Override @SuppressWarnings("unchecked") public <T extends ValueVector> AddOrGetResult<T> addOrGetVector(FieldType type) { boolean created = false; if (vector == ZeroVector.INSTANCE) { vector = type.createNewSingleVector(DATA_VECTOR_NAME, allocator, null); this.reader = new UnionFixedSizeListReader(this); created = true; } // returned vector must have the same field if (!Objects.equals(vector.getField().getType(), type.getType())) { final String msg = String.format("Inner vector type mismatch. Requested type: [%s], actual type: [%s]", type.getType(), vector.getField().getType()); throw new SchemaChangeRuntimeException(msg); } return new AddOrGetResult<>((T) vector, created); }
@Override public void initializeChildrenFromFields(List<Field> children) { if (children.size() != 1) { throw new IllegalArgumentException("Lists have only one child. Found: " + children); } Field field = children.get(0); AddOrGetResult<FieldVector> addOrGetVector = addOrGetVector(field.getFieldType()); if (!addOrGetVector.isCreated()) { throw new IllegalArgumentException("Child vector already existed: " + addOrGetVector.getVector()); } addOrGetVector.getVector().initializeChildrenFromFields(field.getChildren()); }
public <T extends ValueVector> AddOrGetResult<T> addOrGetVector(FieldType fieldType) { boolean created = false; if (vector instanceof ZeroVector) { vector = fieldType.createNewSingleVector(DATA_VECTOR_NAME, allocator, callBack); // returned vector must have the same field created = true; if (callBack != null && // not a schema change if changing from ZeroVector to ZeroVector (fieldType.getType().getTypeID() != ArrowTypeID.Null)) { callBack.doWork(); } } if (vector.getField().getType().getTypeID() != fieldType.getType().getTypeID()) { final String msg = String.format("Inner vector type mismatch. Requested type: [%s], actual type: [%s]", fieldType.getType().getTypeID(), vector.getField().getType().getTypeID()); throw new SchemaChangeRuntimeException(msg); } return new AddOrGetResult<>((T) vector, created); }
public void materialize(Field field) { if (field.getChildren().size() == 0) { return; } Field innerField = field.getChildren().get(0); ValueVector innerVector = listVector.addOrGetVector(innerField.getFieldType()).getVector(); ComplexTypeHelper.materialize(innerVector, innerField); }
private ValueVector addChild(ValueVector vector, MinorType child) { return ((ListVector)vector).addOrGetVector(nullable(child.getType())).getVector(); }
protected FieldWriter getWriter(MinorType type, ArrowType arrowType) { if (state == State.UNION) { ((UnionWriter) writer).getWriter(type); } else if (state == State.UNTYPED) { if (type == null) { // ??? return null; } if (arrowType == null) { arrowType = type.getType(); } ValueVector v = listVector.addOrGetVector(FieldType.nullable(arrowType)).getVector(); v.allocateNew(); setWriter(v, arrowType); writer.setPosition(position); } else if (type != this.type) { promoteToUnion(); ((UnionWriter) writer).getWriter(type); } return writer; }