Sources/SparkConnect/ProtoUtil.swift (55 lines of code) (raw):
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
import Foundation
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)
}