in parquet/src/main/scala/magnolify/parquet/ParquetField.scala [494:518]
def decimalFixed(length: Int, precision: Int, scale: Int = 0): Primitive[BigDecimal] = {
val capacity = math.floor(math.log10(math.pow(2, (8 * length - 1).toDouble) - 1)).toInt
require(
1 <= precision && precision <= capacity,
s"Precision for FIXED($length) not within [1, $capacity]"
)
new Primitive[BigDecimal] {
override def buildSchema(cm: CaseMapper): Type =
Schema.primitive(
PrimitiveTypeName.FIXED_LEN_BYTE_ARRAY,
LogicalTypeAnnotation.decimalType(scale, precision),
length
)
override def write(c: RecordConsumer, v: BigDecimal)(cm: CaseMapper): Unit =
c.addBinary(Binary.fromConstantByteArray(Decimal.toFixed(v, precision, scale, length)))
override def newConverter: TypeConverter[BigDecimal] = TypeConverter.newByteArray.map { ba =>
Decimal.fromBytes(ba, precision, scale)
}
override type ParquetT = Binary
}
}