in Sources/SparkConnect/ArrowReaderHelper.swift [236:301]
func findArrowType( // swiftlint:disable:this cyclomatic_complexity function_body_length
_ field: org_apache_arrow_flatbuf_Field
) -> ArrowType {
let type = field.typeType
switch type {
case .int:
let intType = field.type(type: org_apache_arrow_flatbuf_Int.self)!
let bitWidth = intType.bitWidth
if bitWidth == 8 {
return ArrowType(intType.isSigned ? ArrowType.ArrowInt8 : ArrowType.ArrowUInt8)
}
if bitWidth == 16 {
return ArrowType(intType.isSigned ? ArrowType.ArrowInt16 : ArrowType.ArrowUInt16)
}
if bitWidth == 32 {
return ArrowType(intType.isSigned ? ArrowType.ArrowInt32 : ArrowType.ArrowUInt32)
}
if bitWidth == 64 {
return ArrowType(intType.isSigned ? ArrowType.ArrowInt64 : ArrowType.ArrowUInt64)
}
return ArrowType(ArrowType.ArrowUnknown)
case .bool:
return ArrowType(ArrowType.ArrowBool)
case .floatingpoint:
let floatType = field.type(type: org_apache_arrow_flatbuf_FloatingPoint.self)!
switch floatType.precision {
case .single:
return ArrowType(ArrowType.ArrowFloat)
case .double:
return ArrowType(ArrowType.ArrowDouble)
default:
return ArrowType(ArrowType.ArrowUnknown)
}
case .utf8:
return ArrowType(ArrowType.ArrowString)
case .binary:
return ArrowType(ArrowType.ArrowBinary)
case .date:
let dateType = field.type(type: org_apache_arrow_flatbuf_Date.self)!
if dateType.unit == .day {
return ArrowType(ArrowType.ArrowDate32)
}
return ArrowType(ArrowType.ArrowDate64)
case .time:
let timeType = field.type(type: org_apache_arrow_flatbuf_Time.self)!
if timeType.unit == .second || timeType.unit == .millisecond {
return ArrowTypeTime32(timeType.unit == .second ? .seconds : .milliseconds)
}
return ArrowTypeTime64(timeType.unit == .microsecond ? .microseconds : .nanoseconds)
case .struct_:
_ = field.type(type: org_apache_arrow_flatbuf_Struct_.self)!
var fields = [ArrowField]()
for index in 0..<field.childrenCount {
let childField = field.children(at: index)!
let childType = findArrowType(childField)
fields.append(
ArrowField(childField.name ?? "", type: childType, isNullable: childField.nullable))
}
return ArrowNestedType(ArrowType.ArrowStruct, fields: fields)
default:
return ArrowType(ArrowType.ArrowUnknown)
}
}