in vector/src/main/java/org/apache/arrow/vector/ipc/JsonFileReader.java [311:376]
private ArrowBuf readViewBuffers(
BufferAllocator allocator, int count, List<Integer> variadicBufferIndices, MinorType type)
throws IOException {
readToken(START_ARRAY);
ArrayList<byte[]> values = new ArrayList<>(count);
long bufferSize = 0L;
for (int i = 0; i < count; i++) {
readToken(START_OBJECT);
final int length = readNextField("SIZE", Integer.class);
byte[] value;
if (length > BaseVariableWidthViewVector.INLINE_SIZE) {
// PREFIX_HEX
final byte[] prefix = decodeHexSafe(readNextField("PREFIX_HEX", String.class));
// BUFFER_INDEX
final int bufferIndex = readNextField("BUFFER_INDEX", Integer.class);
if (variadicBufferIndices.isEmpty()) {
variadicBufferIndices.add(bufferIndex);
} else {
int lastBufferIndex = variadicBufferIndices.get(variadicBufferIndices.size() - 1);
if (lastBufferIndex != bufferIndex) {
variadicBufferIndices.add(bufferIndex);
}
}
// OFFSET
final int offset = readNextField("OFFSET", Integer.class);
ByteBuffer buffer =
ByteBuffer.allocate(BaseVariableWidthViewVector.ELEMENT_SIZE)
.order(ByteOrder.LITTLE_ENDIAN); // Allocate a ByteBuffer of size 16 bytes
buffer.putInt(length); // Write 'length' to bytes 0-3
buffer.put(prefix); // Write 'prefix' to bytes 4-7
buffer.putInt(bufferIndex); // Write 'bufferIndex' to bytes 8-11
buffer.putInt(offset); // Write 'offset' to bytes 12-15
value = buffer.array(); // Convert the ByteBuffer to a byte array
} else {
// in-line
ByteBuffer buffer =
ByteBuffer.allocate(BaseVariableWidthViewVector.ELEMENT_SIZE)
.order(ByteOrder.LITTLE_ENDIAN); // Allocate a ByteBuffer of size 16 bytes
buffer.putInt(length); // Write 'length' to bytes 0-3
// INLINE
if (type == MinorType.VIEWVARCHAR) {
buffer.put(readNextField("INLINED", String.class).getBytes(StandardCharsets.UTF_8));
} else {
String inlined = readNextField("INLINED", String.class);
if (inlined == null) {
buffer.put(new byte[length]);
} else {
buffer.put(decodeHexSafe(inlined));
}
}
value = buffer.array(); // Convert the ByteBuffer to a byte array
}
values.add(value);
bufferSize += value.length;
readToken(END_OBJECT);
}
ArrowBuf buf = allocator.buffer(bufferSize);
for (byte[] value : values) {
buf.writeBytes(value);
}
readToken(END_ARRAY);
return buf;
}