in vector/src/main/java/org/apache/arrow/vector/util/VectorAppender.java [607:684]
public ValueVector visit(DenseUnionVector deltaVector, Void value) {
// we only make sure that both vectors are union vectors.
Preconditions.checkArgument(
targetVector.getMinorType() == deltaVector.getMinorType(),
"The vector to append must have the same type as the targetVector being appended");
if (deltaVector.getValueCount() == 0) {
return targetVector; // optimization, nothing to append, return
}
DenseUnionVector targetDenseUnionVector = (DenseUnionVector) targetVector;
int newValueCount = targetVector.getValueCount() + deltaVector.getValueCount();
// make sure there is enough capacity
while (targetDenseUnionVector.getValueCapacity() < newValueCount) {
targetDenseUnionVector.reAlloc();
}
// append type buffers
MemoryUtil.copyMemory(
deltaVector.getTypeBuffer().memoryAddress(),
targetDenseUnionVector.getTypeBuffer().memoryAddress() + targetVector.getValueCount(),
deltaVector.getValueCount());
// append offset buffers
for (int i = 0; i < deltaVector.getValueCount(); i++) {
byte typeId = deltaVector.getTypeId(i);
ValueVector targetChildVector = targetDenseUnionVector.getVectorByType(typeId);
int offsetBase = targetChildVector == null ? 0 : targetChildVector.getValueCount();
int deltaOffset = deltaVector.getOffset(i);
long index = (long) (targetVector.getValueCount() + i) * DenseUnionVector.OFFSET_WIDTH;
targetVector.getOffsetBuffer().setInt(index, offsetBase + deltaOffset);
}
// append child vectors
for (int i = 0; i <= Byte.MAX_VALUE; i++) {
ValueVector targetChildVector = targetDenseUnionVector.getVectorByType((byte) i);
ValueVector deltaChildVector = deltaVector.getVectorByType((byte) i);
if (targetChildVector == null && deltaChildVector == null) {
// the type id is not registered in either vector, we are done.
continue;
} else if (targetChildVector == null && deltaChildVector != null) {
// first register a new child in the target vector
targetDenseUnionVector.registerNewTypeId(deltaChildVector.getField());
targetChildVector =
targetDenseUnionVector.addVector(
(byte) i,
deltaChildVector.getField().createVector(targetDenseUnionVector.getAllocator()));
// now we have both child vectors not null, we can append them.
VectorAppender childAppender = new VectorAppender(targetChildVector);
deltaChildVector.accept(childAppender, null);
} else if (targetChildVector != null && deltaChildVector == null) {
// the value only exists in the target vector, so we are done
continue;
} else {
// both child vectors are non-null
// first check vector types
TypeEqualsVisitor childTypeVisitor =
new TypeEqualsVisitor(
targetChildVector, /* check name */ false, /* check meta data*/ false);
if (!childTypeVisitor.equals(deltaChildVector)) {
throw new IllegalArgumentException(
"dense union vectors have different child vector types with type id " + i);
}
// append child vectors
VectorAppender childAppender = new VectorAppender(targetChildVector);
deltaChildVector.accept(childAppender, null);
}
}
targetVector.setValueCount(newValueCount);
return targetVector;
}