private ArrowBuf readViewBuffers()

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;
  }