in core/src/main/java/org/apache/iceberg/variants/PrimitiveWrapper.java [127:240]
public int writeTo(ByteBuffer outBuffer, int offset) {
Preconditions.checkArgument(
outBuffer.order() == ByteOrder.LITTLE_ENDIAN, "Invalid byte order: big endian");
switch (type()) {
case NULL:
outBuffer.put(offset, NULL_HEADER);
return 1;
case BOOLEAN_TRUE:
outBuffer.put(offset, TRUE_HEADER);
return 1;
case BOOLEAN_FALSE:
outBuffer.put(offset, FALSE_HEADER);
return 1;
case INT8:
outBuffer.put(offset, INT8_HEADER);
outBuffer.put(offset + 1, (Byte) value);
return 2;
case INT16:
outBuffer.put(offset, INT16_HEADER);
outBuffer.putShort(offset + 1, (Short) value);
return 3;
case INT32:
outBuffer.put(offset, INT32_HEADER);
outBuffer.putInt(offset + 1, (Integer) value);
return 5;
case INT64:
outBuffer.put(offset, INT64_HEADER);
outBuffer.putLong(offset + 1, (Long) value);
return 9;
case FLOAT:
outBuffer.put(offset, FLOAT_HEADER);
outBuffer.putFloat(offset + 1, (Float) value);
return 5;
case DOUBLE:
outBuffer.put(offset, DOUBLE_HEADER);
outBuffer.putDouble(offset + 1, (Double) value);
return 9;
case DATE:
outBuffer.put(offset, DATE_HEADER);
outBuffer.putInt(offset + 1, (Integer) value);
return 5;
case TIMESTAMPTZ:
outBuffer.put(offset, TIMESTAMPTZ_HEADER);
outBuffer.putLong(offset + 1, (Long) value);
return 9;
case TIMESTAMPNTZ:
outBuffer.put(offset, TIMESTAMPNTZ_HEADER);
outBuffer.putLong(offset + 1, (Long) value);
return 9;
case DECIMAL4:
BigDecimal decimal4 = (BigDecimal) value;
outBuffer.put(offset, DECIMAL4_HEADER);
outBuffer.put(offset + 1, (byte) decimal4.scale());
outBuffer.putInt(offset + 2, decimal4.unscaledValue().intValueExact());
return 6;
case DECIMAL8:
BigDecimal decimal8 = (BigDecimal) value;
outBuffer.put(offset, DECIMAL8_HEADER);
outBuffer.put(offset + 1, (byte) decimal8.scale());
outBuffer.putLong(offset + 2, decimal8.unscaledValue().longValueExact());
return 10;
case DECIMAL16:
BigDecimal decimal16 = (BigDecimal) value;
byte padding = (byte) (decimal16.signum() < 0 ? 0xFF : 0x00);
byte[] bytes = decimal16.unscaledValue().toByteArray();
outBuffer.put(offset, DECIMAL16_HEADER);
outBuffer.put(offset + 1, (byte) decimal16.scale());
for (int i = 0; i < 16; i += 1) {
if (i < bytes.length) {
// copy the big endian value and convert to little endian
outBuffer.put(offset + 2 + i, bytes[bytes.length - i - 1]);
} else {
// pad with 0x00 or 0xFF depending on the sign
outBuffer.put(offset + 2 + i, padding);
}
}
return 18;
case BINARY:
ByteBuffer binary = (ByteBuffer) value;
outBuffer.put(offset, BINARY_HEADER);
outBuffer.putInt(offset + 1, binary.remaining());
VariantUtil.writeBufferAbsolute(outBuffer, offset + 5, binary);
return 5 + binary.remaining();
case STRING:
// TODO: use short string when possible
if (null == buffer) {
this.buffer = ByteBuffer.wrap(((String) value).getBytes(StandardCharsets.UTF_8));
}
outBuffer.put(offset, STRING_HEADER);
outBuffer.putInt(offset + 1, buffer.remaining());
VariantUtil.writeBufferAbsolute(outBuffer, offset + 5, buffer);
return 5 + buffer.remaining();
case TIME:
outBuffer.put(offset, TIME_HEADER);
outBuffer.putLong(offset + 1, (Long) value);
return 9;
case TIMESTAMPTZ_NANOS:
outBuffer.put(offset, TIMESTAMPTZ_NANOS_HEADER);
outBuffer.putLong(offset + 1, (Long) value);
return 9;
case TIMESTAMPNTZ_NANOS:
outBuffer.put(offset, TIMESTAMPNTZ_NANOS_HEADER);
outBuffer.putLong(offset + 1, (Long) value);
return 9;
case UUID:
outBuffer.put(offset, UUID_HEADER);
VariantUtil.writeBufferAbsolute(
outBuffer, offset + 1, UUIDUtil.convertToByteBuffer((UUID) value));
return 17;
}
throw new UnsupportedOperationException("Unsupported primitive type: " + type());
}