in vector/src/main/java/org/apache/arrow/vector/ipc/JsonFileWriter.java [204:314]
private void writeFromVectorIntoJson(Field field, FieldVector vector) throws IOException {
TypeLayout typeLayout = TypeLayout.getTypeLayout(field.getType());
List<BufferType> vectorTypes = typeLayout.getBufferTypes();
List<ArrowBuf> vectorBuffers = vector.getFieldBuffers();
if (typeLayout.isFixedBufferCount()) {
if (vectorTypes.size() != vectorBuffers.size()) {
throw new IllegalArgumentException(
"vector types and inner vector buffers are not the same size: "
+ vectorTypes.size()
+ " != "
+ vectorBuffers.size());
}
} else {
vectorTypes.add(VARIADIC_DATA_BUFFERS);
}
generator.writeStartObject();
{
generator.writeObjectField("name", field.getName());
int valueCount = vector.getValueCount();
generator.writeObjectField("count", valueCount);
for (int v = 0; v < vectorTypes.size(); v++) {
BufferType bufferType = vectorTypes.get(v);
ArrowBuf vectorBuffer = vectorBuffers.get(v);
// Note that in JSON format we cannot have VARIADIC_DATA_BUFFERS repeated,
// thus the values are only written to a single entity.
generator.writeArrayFieldStart(bufferType.getName());
final int bufferValueCount =
(bufferType.equals(OFFSET)
&& vector.getMinorType() != MinorType.DENSEUNION
&& vector.getMinorType() != MinorType.LISTVIEW
&& vector.getMinorType() != MinorType.LARGELISTVIEW)
? valueCount + 1
: valueCount;
for (int i = 0; i < bufferValueCount; i++) {
if (bufferType.equals(DATA)
&& (vector.getMinorType() == MinorType.VARCHAR
|| vector.getMinorType() == MinorType.VARBINARY)) {
writeValueToGenerator(bufferType, vectorBuffer, vectorBuffers.get(v - 1), vector, i);
} else if (bufferType.equals(VIEWS)
&& (vector.getMinorType() == MinorType.VIEWVARCHAR
|| vector.getMinorType() == MinorType.VIEWVARBINARY)) {
// writing views
ArrowBuf viewBuffer = vectorBuffers.get(1);
List<ArrowBuf> dataBuffers = vectorBuffers.subList(v + 1, vectorBuffers.size());
writeValueToViewGenerator(bufferType, viewBuffer, dataBuffers, vector, i);
} else if (bufferType.equals(VARIADIC_DATA_BUFFERS)
&& (vector.getMinorType() == MinorType.VIEWVARCHAR
|| vector.getMinorType() == MinorType.VIEWVARBINARY)) {
ArrowBuf viewBuffer = vectorBuffers.get(1); // check if this is v-1
List<ArrowBuf> dataBuffers = vectorBuffers.subList(v, vectorBuffers.size());
if (!dataBuffers.isEmpty()) {
writeValueToDataBufferGenerator(bufferType, viewBuffer, dataBuffers, vector);
// The variadic buffers are written at once and doesn't require iterating for
// each index.
// So, break the loop.
break;
}
} else if (bufferType.equals(OFFSET)
&& vector.getValueCount() == 0
&& (vector.getMinorType() == MinorType.LIST
|| vector.getMinorType() == MinorType.LISTVIEW
|| vector.getMinorType() == MinorType.MAP
|| vector.getMinorType() == MinorType.VARBINARY
|| vector.getMinorType() == MinorType.VARCHAR)) {
// Empty vectors may not have allocated an offsets buffer
try (ArrowBuf vectorBufferTmp = vector.getAllocator().buffer(4)) {
vectorBufferTmp.setInt(0, 0);
writeValueToGenerator(bufferType, vectorBufferTmp, null, vector, i);
}
} else if (bufferType.equals(OFFSET)
&& vector.getValueCount() == 0
&& (vector.getMinorType() == MinorType.LARGELIST
|| vector.getMinorType() == MinorType.LARGELISTVIEW
|| vector.getMinorType() == MinorType.LARGEVARBINARY
|| vector.getMinorType() == MinorType.LARGEVARCHAR)) {
// Empty vectors may not have allocated an offsets buffer
try (ArrowBuf vectorBufferTmp = vector.getAllocator().buffer(8)) {
vectorBufferTmp.setLong(0, 0);
writeValueToGenerator(bufferType, vectorBufferTmp, null, vector, i);
}
} else {
writeValueToGenerator(bufferType, vectorBuffer, null, vector, i);
}
}
generator.writeEndArray();
}
List<Field> fields = field.getChildren();
List<FieldVector> children = vector.getChildrenFromFields();
if (fields.size() != children.size()) {
throw new IllegalArgumentException(
"fields and children are not the same size: "
+ fields.size()
+ " != "
+ children.size());
}
if (fields.size() > 0) {
generator.writeArrayFieldStart("children");
for (int i = 0; i < fields.size(); i++) {
Field childField = fields.get(i);
FieldVector childVector = children.get(i);
writeFromVectorIntoJson(childField, childVector);
}
generator.writeEndArray();
}
}
generator.writeEndObject();
}