Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 6 additions & 11 deletions Sources/Arrow/ArrowArray.swift
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,13 @@ public protocol AnyArrowArray {
var type: ArrowType { get }
var length: UInt { get }
var nullCount: UInt { get }
var array: AnyArray { get }
var data: ArrowData { get }
var arrowData: ArrowData { get }
var bufferData: [Data] { get }
var bufferDataSizes: [Int] { get }
func asAny(_ index: UInt) -> Any?
}

public class ArrowArray<T>: AsString, AnyArray, AnyArrowArray {
public class ArrowArray<T>: AsString, AnyArrowArray {
public typealias ItemType = T
public let arrowData: ArrowData
public var nullCount: UInt { self.arrowData.nullCount }
Expand All @@ -40,11 +40,6 @@ public class ArrowArray<T>: AsString, AnyArray, AnyArrowArray {
arrowData.type
}

// FIXME: Temporary to mimic ArrowArrayHolder protocol.
public var array: any AnyArray { self }

public var data: ArrowData { self.arrowData }

public var bufferData: [Data] {
self.arrowData.buffers.map { buffer in
var data = Data()
Expand Down Expand Up @@ -347,13 +342,13 @@ public class NestedArray: ArrowArray<[Any?]> {
.load(as: Int32.self)
var items: [Any?] = []
for i in startOffset..<endOffset {
items.append(values.array.asAny(UInt(i)))
items.append(values.asAny(UInt(i)))
}
return items
case .strct(let _):
var result: [Any?] = []
for field in children {
result.append(field.array.asAny(index))
result.append(field.asAny(index))
}
return result
default:
Expand Down Expand Up @@ -393,7 +388,7 @@ public class NestedArray: ArrowArray<[Any?]> {
var output = "{"
if let children = self.children {
let parts = children.compactMap { child in
(child.array as? AsString)?.asString(index)
(child as? AsString)?.asString(index)
}
output.append(parts.joined(separator: ","))
}
Expand Down
4 changes: 2 additions & 2 deletions Sources/Arrow/ArrowArrayBuilder.swift
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,7 @@ public class StructArrayBuilder: ArrowArrayBuilder<
let buffers = self.bufferBuilder.finish()
var childData: [ArrowData] = []
for builder in self.builders {
childData.append(try builder.toHolder().array.arrowData)
childData.append(try builder.toHolder().arrowData)
}

let arrowData = try ArrowData(
Expand Down Expand Up @@ -240,7 +240,7 @@ public class ListArrayBuilder: ArrowArrayBuilder<ListBufferBuilder, NestedArray>

public override func finish() throws(ArrowError) -> NestedArray {
let buffers = self.bufferBuilder.finish()
let childData = try valueBuilder.toHolder().array.arrowData
let childData = try valueBuilder.toHolder().arrowData
let arrowData = try ArrowData(
self.type,
buffers: buffers,
Expand Down
16 changes: 8 additions & 8 deletions Sources/Arrow/ArrowDecoder.swift
Original file line number Diff line number Diff line change
Expand Up @@ -91,39 +91,39 @@ public class ArrowDecoder: Decoder {
ArrowSingleValueDecoding(self, codingPath: codingPath)
}

func getCol(_ name: String) throws -> AnyArray {
func getCol(_ name: String) throws -> AnyArrowArray {
guard let col = self.nameToCol[name] else {
throw ArrowError.invalid("Column for key \"\(name)\" not found")
}

return col.array
return col
}

func getCol(_ index: Int) throws -> AnyArray {
func getCol(_ index: Int) throws -> AnyArrowArray {
if index >= self.columns.count {
throw ArrowError.outOfBounds(index: Int64(index))
}

return self.columns[index].array
return self.columns[index]
}

func doDecode<T>(_ key: CodingKey) throws -> T? {
let array: AnyArray = try self.getCol(key.stringValue)
let array: AnyArrowArray = try self.getCol(key.stringValue)
return array.asAny(self.rbIndex) as? T
}

func doDecode<T>(_ col: Int) throws -> T? {
let array: AnyArray = try self.getCol(col)
let array: AnyArrowArray = try self.getCol(col)
return array.asAny(self.rbIndex) as? T
}

func isNull(_ key: CodingKey) throws -> Bool {
let array: AnyArray = try self.getCol(key.stringValue)
let array: AnyArrowArray = try self.getCol(key.stringValue)
return array.asAny(self.rbIndex) == nil
}

func isNull(_ col: Int) throws -> Bool {
let array: AnyArray = try self.getCol(col)
let array: AnyArrowArray = try self.getCol(col)
return array.asAny(self.rbIndex) == nil
}
}
Expand Down
4 changes: 2 additions & 2 deletions Sources/Arrow/ArrowReader.swift
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ public struct ArrowReader: Sendable {
}
switch loadField(loadInfo, field: childField) {
case .success(let holder):
children.append(holder.array.arrowData)
children.append(holder.arrowData)
case .failure(let error):
return .failure(error)
}
Expand Down Expand Up @@ -173,7 +173,7 @@ public struct ArrowReader: Sendable {
return makeArrayHolder(
field, buffers: [arrowNullBuffer, arrowOffsetBuffer],
nullCount: UInt(node.nullCount),
children: [childHolder.array.arrowData],
children: [childHolder.arrowData],
rbLength: UInt(loadInfo.batchData.recordBatch.length))
case .failure(let error):
return .failure(error)
Expand Down
11 changes: 3 additions & 8 deletions Sources/Arrow/ArrowTable.swift
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ public class ArrowTable {
) throws(ArrowError) -> ArrowColumn {
var arrays: [ArrowArray<T>] = []
for holder in holders {
guard let array = holder.array as? ArrowArray<T> else {
guard let array = holder as? ArrowArray<T> else {
throw .runtimeError(
"Array type mismatch: expected \(T.self) for field \(field.name)"
)
Expand Down Expand Up @@ -266,20 +266,15 @@ public class RecordBatch {
for columnIndex: Int
) throws(ArrowError) -> ArrowArray<T> {
let arrayHolder = column(columnIndex)
if let array = arrayHolder.array as? ArrowArray<T> {
if let array = arrayHolder as? ArrowArray<T> {
return array
} else {
throw .invalid(
"Could not convert \(arrayHolder.array) for \(columnIndex)"
"Could not convert \(arrayHolder) for \(columnIndex)"
)
}
}

public func anyData(for columnIndex: Int) -> AnyArray {
let arrayHolder = column(columnIndex)
return arrayHolder.array
}

public func column(_ index: Int) -> AnyArrowArray {
self.columns[index]
}
Expand Down
6 changes: 3 additions & 3 deletions Sources/Arrow/ArrowWriter.swift
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ public class ArrowWriter {
offsets.append(fbb.create(struct: fieldNode))
if case .strct(let fields) = column.type {

let nestedArray = column.array as? NestedArray
let nestedArray = column as? NestedArray
if let nestedFields = nestedArray?.fields {
writeFieldNodes(
fields,
Expand Down Expand Up @@ -239,7 +239,7 @@ public class ArrowWriter {
bufferOffset += bufferDataSize

if case .strct(let fields) = column.type {
let nestedArray = column.array as? NestedArray
let nestedArray = column as? NestedArray
if let nestedFields = nestedArray?.fields {
writeBufferInfo(
fields, columns: nestedFields,
Expand Down Expand Up @@ -312,7 +312,7 @@ public class ArrowWriter {
addPadForAlignment(&bufferData)
writer.append(bufferData)
if case .strct(let fields) = column.type {
guard let nestedArray = column.array as? NestedArray,
guard let nestedArray = column as? NestedArray,
let nestedFields = nestedArray.fields
else {
return .failure(
Expand Down
6 changes: 0 additions & 6 deletions Sources/Arrow/ChunkedArray.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,6 @@

import Foundation

public protocol AnyArray {
var arrowData: ArrowData { get }
func asAny(_ index: UInt) -> Any?
var length: UInt { get }
}

public protocol AsString {
func asString(_ index: UInt) -> String
}
Expand Down
2 changes: 1 addition & 1 deletion Tests/ArrowTests/ArrayTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -379,7 +379,7 @@ struct ArrayTests {
#expect(structArray.length == 3)
#expect(structArray[1] == nil)
#expect(structArray.fields![0].length == 3)
#expect(structArray.fields![0].array.asAny(1) == nil)
#expect(structArray.fields![0].asAny(1) == nil)
#expect(structArray[0]![STIndex.bool.rawValue] as? Bool == true)
#expect(structArray[0]![STIndex.int8.rawValue] as? Int8 == 1)
#expect(structArray[0]![STIndex.int16.rawValue] as? Int16 == 2)
Expand Down
4 changes: 2 additions & 2 deletions Tests/ArrowTests/CodableTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,7 @@ struct CodableTests {

func getArrayValue<T>(_ rb: RecordBatch, colIndex: Int, rowIndex: UInt) -> T?
{
let anyArray = rb.columns[colIndex].array
let anyArray = rb.columns[colIndex]
return anyArray.asAny(UInt(rowIndex)) as? T
}

Expand Down Expand Up @@ -371,7 +371,7 @@ struct CodableTests {
#expect(rb.columns[0].type == .int32)
for index in 0..<100 {
if index == 10 {
let anyArray = rb.columns[0].array
let anyArray = rb.columns[0]
#expect(anyArray.asAny(UInt(index)) == nil)
} else {
#expect(
Expand Down
43 changes: 21 additions & 22 deletions Tests/ArrowTests/IPCTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ func checkBoolRecordBatch(
#expect(recordBatch.schema.fields[1].type == .utf8)
for index in 0..<recordBatch.length {
let column = recordBatch.columns[0]
guard let str = column.array as? AsString else {
guard let str = column as? AsString else {
throw .invalid("Could not cast column to AsString")
}
let val = "\(str.asString(index))"
Expand Down Expand Up @@ -108,8 +108,7 @@ func checkStructRecordBatch(
Issue.record("Expected field 0 to be a struct")
return []
}
let nestedArray = recordBatch.columns[0].array as? NestedArray
guard let nestedArray else {
guard let nestedArray = recordBatch.columns[0] as? NestedArray else {
throw .runtimeError("Could not cast to NestedArray")
}
guard let fields = nestedArray.fields else {
Expand All @@ -119,12 +118,12 @@ func checkStructRecordBatch(
#expect(fields[0].type == .utf8)
#expect(fields[1].type == .boolean)
let column = recordBatch.columns[0]
guard let str = column.array as? AsString else {
guard let str = column as? AsString else {
throw .runtimeError("String array is nil")
}
#expect("\(str.asString(0))" == "{0,false}")
#expect("\(str.asString(1))" == "{1,true}")
#expect(column.array.asAny(2) == nil)
#expect(column.asAny(2) == nil)
}
return recordBatches
}
Expand Down Expand Up @@ -278,15 +277,15 @@ struct IPCStreamReaderTests {
#expect(recordBatch.schema.fields[4].type == .float32)
let columns = recordBatch.columns
#expect(columns[0].nullCount == 2)
let dateVal = "\((columns[2].array as! AsString).asString(0))"
let dateVal = "\((columns[2] as! AsString).asString(0))"
#expect(dateVal == "2014-09-10 00:00:00 +0000")
let stringVal = "\((columns[1].array as! AsString).asString(1))"
let stringVal = "\((columns[1] as! AsString).asString(1))"
#expect(stringVal == "test22")
let uintVal = "\((columns[0].array as! AsString).asString(0))"
let uintVal = "\((columns[0] as! AsString).asString(0))"
#expect(uintVal == "10")
let stringVal2 = "\((columns[1].array as! AsString).asString(3))"
let stringVal2 = "\((columns[1] as! AsString).asString(3))"
#expect(stringVal2 == "test44")
let uintVal2 = "\((columns[0].array as! AsString).asString(3))"
let uintVal2 = "\((columns[0] as! AsString).asString(3))"
#expect(uintVal2 == "44")
}
case .failure(let error):
Expand Down Expand Up @@ -324,7 +323,7 @@ struct IPCFileReaderTests {
recordBatch.schema.fields[1].type == .utf8)
for index in 0..<recordBatch.length {
let column = recordBatch.columns[1]
let str = column.array as! AsString
let str = column as! AsString
let val = "\(str.asString(index))"
if index != 1 {
#expect(!val.isEmpty)
Expand Down Expand Up @@ -431,15 +430,15 @@ struct IPCFileReaderTests {
#expect(recordBatch.schema.fields[4].type == .float32)
let columns = recordBatch.columns
#expect(columns[0].nullCount == 2)
let dateVal = "\((columns[2].array as! AsString).asString(0))"
let dateVal = "\((columns[2] as! AsString).asString(0))"
#expect(dateVal == "2014-09-10 00:00:00 +0000")
let stringVal = "\((columns[1].array as! AsString).asString(1))"
let stringVal = "\((columns[1] as! AsString).asString(1))"
#expect(stringVal == "test22")
let uintVal = "\((columns[0].array as! AsString).asString(0))"
let uintVal = "\((columns[0] as! AsString).asString(0))"
#expect(uintVal == "10")
let stringVal2 = "\((columns[1].array as! AsString).asString(3))"
let stringVal2 = "\((columns[1] as! AsString).asString(3))"
#expect(stringVal2 == "test44")
let uintVal2 = "\((columns[0].array as! AsString).asString(3))"
let uintVal2 = "\((columns[0] as! AsString).asString(3))"
#expect(uintVal2 == "44")
}
case .failure(let error):
Expand Down Expand Up @@ -572,11 +571,11 @@ struct IPCFileReaderTests {
#expect(fields.count == 14)
let columns = recordBatch.columns
#expect(columns[0].nullCount == 1)
#expect(columns[0].array.asAny(1) == nil)
let structVal = "\((columns[0].array as? AsString)!.asString(0))"
#expect(columns[0].asAny(1) == nil)
let structVal = "\((columns[0] as? AsString)!.asString(0))"
#expect(
structVal == "{true,1,2,3,4,5,6,7,8,9.9,10.1,11,12,\(currentDate)}")
let nestedArray = (recordBatch.columns[0].array as? NestedArray)!
let nestedArray = (recordBatch.columns[0] as? NestedArray)!
#expect(nestedArray.length == 3)
#expect(nestedArray.fields != nil)
#expect(nestedArray.fields!.count == 14)
Expand Down Expand Up @@ -626,7 +625,7 @@ struct IPCFileReaderTests {
#expect(recordBatch.length == 4)
let columns = recordBatch.columns
let stringVal =
"\((columns[0].array as! AsString).asString(1))"
"\((columns[0] as! AsString).asString(1))"
#expect(stringVal == "test22")
case .failure(let error):
throw error
Expand Down Expand Up @@ -661,10 +660,10 @@ struct IPCFileReaderTests {
#expect(recordBatch.length == 4)
let columns = recordBatch.columns
let stringVal =
"\((columns[0].array as! AsString).asString(0))"
"\((columns[0] as! AsString).asString(0))"
#expect(stringVal == "12345678")
let stringVal2 =
"\((columns[1].array as! AsString).asString(3))"
"\((columns[1] as! AsString).asString(3))"
#expect(stringVal2 == "3")
case .failure(let error):
throw error
Expand Down