func findArrowType()

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)
  }
}