private void writeFromVectorIntoJson()

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