Hello all,
I am working on avro logical type decimal, but was not sure what data
has to be provided.
As mentioned in the Avro document,
A decimal logical type annotates Avro bytes or fixed types. The byte
array must contain the two's-complement representation of the unscaled
integer value in big-endian byte order. The scale is fixed, and is
specified using an attribute.

But in code, in Conversions class, I can see that, from a decimal
value, it is forming a ByteArray.

@Override
public BigDecimal fromBytes(ByteBuffer value, Schema schema, LogicalType type) {
  int scale = ((LogicalTypes.Decimal) type).getScale();
  // always copy the bytes out because BigInteger has no offset/length ctor
  byte[] bytes = value.get(new byte[value.remaining()]).array();
  return new BigDecimal(new BigInteger(bytes), scale);
}

@Override
public ByteBuffer toBytes(BigDecimal value, Schema schema, LogicalType type) {
  int scale = ((LogicalTypes.Decimal) type).getScale();
  if (scale != value.scale()) {
    throw new AvroTypeException("Cannot encode decimal with scale " +
        value.scale() + " as scale " + scale);
  }
  return ByteBuffer.wrap(value.unscaledValue().toByteArray());
}

but, I find that, nowhere two's-complement representation of the
unscaled integer
value in big-endian byte order is stored in byte array.

Can anyone help me with this?

Thanks,

Indhumathi M

Reply via email to