in tools/src/main/scala/magnolify/tools/ParquetParser.scala [98:183]
private def parsePrimitive(primitiveType: PrimitiveType): Primitive = {
val ptn = primitiveType.getPrimitiveTypeName
val lta = primitiveType.getLogicalTypeAnnotation
val decimal = lta match {
case a: DecimalLogicalTypeAnnotation => Some(a)
case _ => None
}
ptn match {
case PTN.BOOLEAN =>
Primitive.Boolean
// Signed 32-bit integers
case PTN.INT32 if lta == null =>
Primitive.Int
case PTN.INT32 if lta == LTA.intType(8, true) =>
Primitive.Byte
case PTN.INT32 if lta == LTA.intType(16, true) =>
Primitive.Short
case PTN.INT32 if lta == LTA.intType(32, true) =>
Primitive.Int
// Signed 64-bit integers
case PTN.INT64 if lta == null =>
Primitive.Long
case PTN.INT64 if lta == LTA.intType(64, true) =>
Primitive.Long
case PTN.FLOAT =>
Primitive.Float
case PTN.DOUBLE =>
Primitive.Double
case PTN.BINARY if lta == null =>
Primitive.Bytes
case PTN.BINARY if lta == LTA.stringType() || lta == LTA.enumType() =>
Primitive.String
// BigDecimal
case PTN.INT32 if decimal.exists(a => 1 <= a.getPrecision && a.getPrecision <= 9) =>
Primitive.BigDecimal
case PTN.INT64 if decimal.exists(a => 1 <= a.getPrecision && a.getPrecision <= 18) =>
Primitive.BigDecimal
case PTN.FIXED_LEN_BYTE_ARRAY if decimal.nonEmpty =>
Primitive.BigDecimal
case PTN.BINARY if decimal.nonEmpty =>
Primitive.BigDecimal
// Date
case PTN.INT32 if lta == LTA.dateType() =>
Primitive.LocalDate
// Millis
case PTN.INT64 if lta == LTA.timestampType(true, TimeUnit.MILLIS) =>
Primitive.Instant
case PTN.INT64 if lta == LTA.timestampType(false, TimeUnit.MILLIS) =>
Primitive.LocalDateTime
case PTN.INT32 if lta == LTA.timeType(true, TimeUnit.MILLIS) =>
Primitive.OffsetTime
case PTN.INT32 if lta == LTA.timeType(false, TimeUnit.MILLIS) =>
Primitive.LocalTime
// Micros
case PTN.INT64 if lta == LTA.timestampType(true, TimeUnit.MICROS) =>
Primitive.Instant
case PTN.INT64 if lta == LTA.timestampType(false, TimeUnit.MICROS) =>
Primitive.LocalDateTime
case PTN.INT64 if lta == LTA.timeType(true, TimeUnit.MICROS) =>
Primitive.OffsetTime
case PTN.INT64 if lta == LTA.timeType(false, TimeUnit.MICROS) =>
Primitive.LocalTime
// Nanos
case PTN.INT64 if lta == LTA.timestampType(true, TimeUnit.NANOS) =>
Primitive.Instant
case PTN.INT64 if lta == LTA.timestampType(false, TimeUnit.NANOS) =>
Primitive.LocalDateTime
case PTN.INT64 if lta == LTA.timeType(true, TimeUnit.NANOS) =>
Primitive.OffsetTime
case PTN.INT64 if lta == LTA.timeType(false, TimeUnit.NANOS) =>
Primitive.LocalTime
case _ =>
throw new IllegalArgumentException(s"Unsupported primitive type $primitiveType")
}
}