in tools/src/main/scala/magnolify/tools/AvroParser.scala [41:109]
private def parseEnum(schema: avro.Schema): Primitive.Enum =
Primitive.Enum(
Some(schema.getName),
Option(schema.getDoc),
schema.getEnumSymbols.asScala.toList
)
private def parseSchema(schema: avro.Schema): Schema = schema.getType match {
// Composite types
case Type.RECORD =>
parseRecord(schema)
case Type.UNION =>
val types = schema.getTypes.asScala
if (types.size != 2 || !types.exists(_.getType == Type.NULL)) {
throw new IllegalArgumentException(s"Unsupported union $schema")
} else {
val s = types.find(_.getType != Type.NULL).get
Optional(parseSchema(s))
}
case Type.ARRAY =>
Repeated(parseSchema(schema.getElementType))
case Type.MAP =>
Mapped(Primitive.String, parseSchema(schema.getValueType))
// Logical types
case Type.STRING if isLogical(schema, LogicalTypes.uuid().getName) =>
Primitive.UUID
case Type.BYTES if schema.getLogicalType.isInstanceOf[LogicalTypes.Decimal] =>
Primitive.BigDecimal
case Type.INT if schema.getLogicalType.isInstanceOf[LogicalTypes.Date] =>
Primitive.LocalDate
// Millis
case Type.LONG if schema.getLogicalType.isInstanceOf[LogicalTypes.TimestampMillis] =>
Primitive.Instant
case Type.INT if schema.getLogicalType.isInstanceOf[LogicalTypes.TimeMillis] =>
Primitive.LocalTime
// `LogicalTypes.LocalTimestampMillis` is Avro 1.10.0+
case Type.LONG if isLogical(schema, "local-timestamp-millis") =>
Primitive.LocalDateTime
// Micros
case Type.LONG if schema.getLogicalType.isInstanceOf[LogicalTypes.TimestampMicros] =>
Primitive.Instant
case Type.LONG if schema.getLogicalType.isInstanceOf[LogicalTypes.TimeMicros] =>
Primitive.LocalTime
// `LogicalTypes.LocalTimestampMicros` is Avro 1.10.0+
case Type.LONG if isLogical(schema, "local-timestamp-micros") =>
Primitive.LocalDateTime
// BigQuery sqlType: DATETIME
case Type.STRING if isLogical(schema, "datetime") =>
Primitive.LocalDateTime
// Primitive types
case Type.ENUM => parseEnum(schema)
case Type.FIXED => Primitive.Bytes
case Type.STRING => Primitive.String
case Type.BYTES => Primitive.Bytes
case Type.INT => Primitive.Int
case Type.LONG => Primitive.Long
case Type.FLOAT => Primitive.Float
case Type.DOUBLE => Primitive.Double
case Type.BOOLEAN => Primitive.Boolean
case Type.NULL => Primitive.Null
case _ =>
throw new IllegalArgumentException(s"Unsupported schema $schema")
}