Skip to content

Commit f8f3278

Browse files
committed
apacheGH-41945: [Swift] Add interface ArrowArrayHolderBuilder
1 parent da0eb7e commit f8f3278

File tree

2 files changed

+42
-2
lines changed

2 files changed

+42
-2
lines changed

swift/Arrow/Sources/Arrow/ArrowArrayBuilder.swift

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,12 @@
1717

1818
import Foundation
1919

20-
public class ArrowArrayBuilder<T: ArrowBufferBuilder, U: ArrowArray<T.ItemType>> {
20+
public protocol ArrowArrayHolderBuilder {
21+
func toHolder() throws -> ArrowArrayHolder
22+
func appendAny(_ val: Any?)
23+
}
24+
25+
public class ArrowArrayBuilder<T: ArrowBufferBuilder, U: ArrowArray<T.ItemType>>: ArrowArrayHolderBuilder {
2126
let type: ArrowType
2227
let bufferBuilder: T
2328
public var length: UInt {return self.bufferBuilder.length}
@@ -34,6 +39,10 @@ public class ArrowArrayBuilder<T: ArrowBufferBuilder, U: ArrowArray<T.ItemType>>
3439
self.bufferBuilder.append(val)
3540
}
3641

42+
public func appendAny(_ val: Any?) {
43+
self.bufferBuilder.append(val as? T.ItemType)
44+
}
45+
3746
public func finish() throws -> ArrowArray<T.ItemType> {
3847
let buffers = self.bufferBuilder.finish()
3948
let arrowData = try ArrowData(self.type, buffers: buffers, nullCount: self.nullCount)
@@ -43,6 +52,10 @@ public class ArrowArrayBuilder<T: ArrowBufferBuilder, U: ArrowArray<T.ItemType>>
4352
public func getStride() -> Int {
4453
return self.type.getStride()
4554
}
55+
56+
public func toHolder() throws -> ArrowArrayHolder {
57+
return try ArrowArrayHolderImpl(self.finish())
58+
}
4659
}
4760

4861
public class NumberArrayBuilder<T>: ArrowArrayBuilder<FixedBufferBuilder<T>, FixedArray<T>> {

swift/Arrow/Tests/ArrowTests/ArrayTests.swift

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,4 +245,31 @@ final class ArrayTests: XCTestCase {
245245
try checkHolderForType(ArrowType(ArrowType.ArrowBool))
246246
try checkHolderForType(ArrowType(ArrowType.ArrowString))
247247
}
248-
}
248+
249+
func testArrowArrayHolderBuilder() throws {
250+
let uint8HBuilder: ArrowArrayHolderBuilder =
251+
(try ArrowArrayBuilders.loadNumberArrayBuilder() as NumberArrayBuilder<UInt8>)
252+
for index in 0..<100 {
253+
uint8HBuilder.appendAny(UInt8(index))
254+
}
255+
256+
let uint8Holder = try uint8HBuilder.toHolder()
257+
XCTAssertEqual(uint8Holder.nullCount, 0)
258+
XCTAssertEqual(uint8Holder.length, 101)
259+
let uint8Data = uint8Holder.data
260+
261+
let stringHBuilder: ArrowArrayHolderBuilder =
262+
(try ArrowArrayBuilders.loadStringArrayBuilder())
263+
for index in 0..<100 {
264+
if index % 10 == 9 {
265+
stringHBuilder.appendAny(nil)
266+
} else {
267+
stringHBuilder.appendAny("test" + String(index))
268+
}
269+
}
270+
271+
let stringHolder = try stringHBuilder.toHolder()
272+
XCTAssertEqual(stringHolder.nullCount, 0)
273+
XCTAssertEqual(stringHolder.length, 101)
274+
}
275+
}

0 commit comments

Comments
 (0)