in vector/src/main/java/org/apache/arrow/vector/ipc/JsonFileWriter.java [412:599]
private void writeValueToGenerator(
BufferType bufferType,
ArrowBuf buffer,
ArrowBuf offsetBuffer,
FieldVector vector,
final int index)
throws IOException {
if (bufferType.equals(TYPE)) {
generator.writeNumber(buffer.getByte(index * TinyIntVector.TYPE_WIDTH));
} else if (bufferType.equals(OFFSET)) {
switch (vector.getMinorType()) {
case VARCHAR:
case VARBINARY:
case LIST:
case MAP:
generator.writeNumber(buffer.getInt((long) index * BaseVariableWidthVector.OFFSET_WIDTH));
break;
case LISTVIEW:
generator.writeNumber(
buffer.getInt((long) index * BaseRepeatedValueViewVector.OFFSET_WIDTH));
break;
case LARGELISTVIEW:
generator.writeNumber(
buffer.getInt((long) index * BaseLargeRepeatedValueViewVector.OFFSET_WIDTH));
break;
case LARGELIST:
case LARGEVARBINARY:
case LARGEVARCHAR:
generator.writeNumber(
buffer.getLong((long) index * BaseLargeVariableWidthVector.OFFSET_WIDTH));
break;
default:
throw new IllegalArgumentException("Type has no offset buffer: " + vector.getField());
}
} else if (bufferType.equals(VALIDITY)) {
generator.writeNumber(vector.isNull(index) ? 0 : 1);
} else if (bufferType.equals(DATA)) {
switch (vector.getMinorType()) {
case TINYINT:
generator.writeNumber(TinyIntVector.get(buffer, index));
break;
case SMALLINT:
generator.writeNumber(SmallIntVector.get(buffer, index));
break;
case INT:
generator.writeNumber(IntVector.get(buffer, index));
break;
case BIGINT:
generator.writeString(String.valueOf(BigIntVector.get(buffer, index)));
break;
case UINT1:
generator.writeNumber(UInt1Vector.getNoOverflow(buffer, index));
break;
case UINT2:
generator.writeNumber(UInt2Vector.get(buffer, index));
break;
case UINT4:
generator.writeNumber(UInt4Vector.getNoOverflow(buffer, index));
break;
case UINT8:
generator.writeString(UInt8Vector.getNoOverflow(buffer, index).toString());
break;
case FLOAT4:
generator.writeNumber(Float4Vector.get(buffer, index));
break;
case FLOAT8:
generator.writeNumber(Float8Vector.get(buffer, index));
break;
case DATEDAY:
generator.writeNumber(DateDayVector.get(buffer, index));
break;
case DATEMILLI:
generator.writeNumber(DateMilliVector.get(buffer, index));
break;
case TIMESEC:
generator.writeNumber(TimeSecVector.get(buffer, index));
break;
case TIMEMILLI:
generator.writeNumber(TimeMilliVector.get(buffer, index));
break;
case TIMEMICRO:
generator.writeNumber(TimeMicroVector.get(buffer, index));
break;
case TIMENANO:
generator.writeNumber(TimeNanoVector.get(buffer, index));
break;
case TIMESTAMPSEC:
generator.writeNumber(TimeStampSecVector.get(buffer, index));
break;
case TIMESTAMPMILLI:
generator.writeNumber(TimeStampMilliVector.get(buffer, index));
break;
case TIMESTAMPMICRO:
generator.writeNumber(TimeStampMicroVector.get(buffer, index));
break;
case TIMESTAMPNANO:
generator.writeNumber(TimeStampNanoVector.get(buffer, index));
break;
case TIMESTAMPSECTZ:
generator.writeNumber(TimeStampSecTZVector.get(buffer, index));
break;
case TIMESTAMPMILLITZ:
generator.writeNumber(TimeStampMilliTZVector.get(buffer, index));
break;
case TIMESTAMPMICROTZ:
generator.writeNumber(TimeStampMicroTZVector.get(buffer, index));
break;
case TIMESTAMPNANOTZ:
generator.writeNumber(TimeStampNanoTZVector.get(buffer, index));
break;
case DURATION:
generator.writeNumber(DurationVector.get(buffer, index));
break;
case INTERVALYEAR:
generator.writeNumber(IntervalYearVector.getTotalMonths(buffer, index));
break;
case INTERVALDAY:
generator.writeStartObject();
generator.writeObjectField("days", IntervalDayVector.getDays(buffer, index));
generator.writeObjectField(
"milliseconds", IntervalDayVector.getMilliseconds(buffer, index));
generator.writeEndObject();
break;
case INTERVALMONTHDAYNANO:
generator.writeStartObject();
generator.writeObjectField("months", IntervalMonthDayNanoVector.getMonths(buffer, index));
generator.writeObjectField("days", IntervalMonthDayNanoVector.getDays(buffer, index));
generator.writeObjectField(
"nanoseconds", IntervalMonthDayNanoVector.getNanoseconds(buffer, index));
generator.writeEndObject();
break;
case BIT:
generator.writeNumber(BitVectorHelper.get(buffer, index));
break;
case VARBINARY:
{
Preconditions.checkNotNull(offsetBuffer);
String hexString =
Hex.encodeHexString(BaseVariableWidthVector.get(buffer, offsetBuffer, index));
generator.writeObject(hexString);
break;
}
case FIXEDSIZEBINARY:
int byteWidth = ((FixedSizeBinaryVector) vector).getByteWidth();
String fixedSizeHexString =
Hex.encodeHexString(FixedSizeBinaryVector.get(buffer, index, byteWidth));
generator.writeObject(fixedSizeHexString);
break;
case VARCHAR:
{
Preconditions.checkNotNull(offsetBuffer);
byte[] b = (BaseVariableWidthVector.get(buffer, offsetBuffer, index));
generator.writeString(new String(b, "UTF-8"));
break;
}
case DECIMAL:
{
int scale = ((DecimalVector) vector).getScale();
BigDecimal decimalValue =
DecimalUtility.getBigDecimalFromArrowBuf(
buffer, index, scale, DecimalVector.TYPE_WIDTH);
// We write the unscaled value, because the scale is stored in the type metadata.
generator.writeString(decimalValue.unscaledValue().toString());
break;
}
case DECIMAL256:
{
int scale = ((Decimal256Vector) vector).getScale();
BigDecimal decimalValue =
DecimalUtility.getBigDecimalFromArrowBuf(
buffer, index, scale, Decimal256Vector.TYPE_WIDTH);
// We write the unscaled value, because the scale is stored in the type metadata.
generator.writeString(decimalValue.unscaledValue().toString());
break;
}
default:
throw new UnsupportedOperationException("minor type: " + vector.getMinorType());
}
} else if (bufferType.equals(SIZE)) {
if (vector.getMinorType() == MinorType.LISTVIEW) {
generator.writeNumber(buffer.getInt((long) index * BaseRepeatedValueViewVector.SIZE_WIDTH));
} else {
generator.writeNumber(
buffer.getInt((long) index * BaseLargeRepeatedValueViewVector.SIZE_WIDTH));
}
}
}