in Sources/SparkConnect/ProtoUtil.swift [20:74]
func fromProto( // swiftlint:disable:this cyclomatic_complexity
field: org_apache_arrow_flatbuf_Field
) -> ArrowField {
let type = field.typeType
var arrowType = ArrowType(ArrowType.ArrowUnknown)
switch type {
case .int:
let intType = field.type(type: org_apache_arrow_flatbuf_Int.self)!
let bitWidth = intType.bitWidth
if bitWidth == 8 {
arrowType = ArrowType(intType.isSigned ? ArrowType.ArrowInt8 : ArrowType.ArrowUInt8)
} else if bitWidth == 16 {
arrowType = ArrowType(intType.isSigned ? ArrowType.ArrowInt16 : ArrowType.ArrowUInt16)
} else if bitWidth == 32 {
arrowType = ArrowType(intType.isSigned ? ArrowType.ArrowInt32 : ArrowType.ArrowUInt32)
} else if bitWidth == 64 {
arrowType = ArrowType(intType.isSigned ? ArrowType.ArrowInt64 : ArrowType.ArrowUInt64)
}
case .bool:
arrowType = ArrowType(ArrowType.ArrowBool)
case .floatingpoint:
let floatType = field.type(type: org_apache_arrow_flatbuf_FloatingPoint.self)!
if floatType.precision == .single {
arrowType = ArrowType(ArrowType.ArrowFloat)
} else if floatType.precision == .double {
arrowType = ArrowType(ArrowType.ArrowDouble)
}
case .utf8:
arrowType = ArrowType(ArrowType.ArrowString)
case .binary:
arrowType = ArrowType(ArrowType.ArrowBinary)
case .date:
let dateType = field.type(type: org_apache_arrow_flatbuf_Date.self)!
if dateType.unit == .day {
arrowType = ArrowType(ArrowType.ArrowDate32)
} else {
arrowType = ArrowType(ArrowType.ArrowDate64)
}
case .time:
let timeType = field.type(type: org_apache_arrow_flatbuf_Time.self)!
if timeType.unit == .second || timeType.unit == .millisecond {
let arrowUnit: ArrowTime32Unit = timeType.unit == .second ? .seconds : .milliseconds
arrowType = ArrowTypeTime32(arrowUnit)
} else {
let arrowUnit: ArrowTime64Unit = timeType.unit == .microsecond ? .microseconds : .nanoseconds
arrowType = ArrowTypeTime64(arrowUnit)
}
case .struct_:
arrowType = ArrowType(ArrowType.ArrowStruct)
default:
arrowType = ArrowType(ArrowType.ArrowUnknown)
}
return ArrowField(field.name ?? "", type: arrowType, isNullable: field.nullable)
}