From 0e1a7088b8bdc1a9a5b9bc60851d867a59569b0f Mon Sep 17 00:00:00 2001 From: Will Temperley Date: Fri, 7 Nov 2025 17:43:19 +0800 Subject: [PATCH 1/3] Begin removal of ArrowData from array interface --- Sources/Arrow/ArrowArray.swift | 6 ------ Sources/Arrow/ArrowReader.swift | 25 ++++++++++++++++++------- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/Sources/Arrow/ArrowArray.swift b/Sources/Arrow/ArrowArray.swift index 24034d7..db5b54a 100644 --- a/Sources/Arrow/ArrowArray.swift +++ b/Sources/Arrow/ArrowArray.swift @@ -116,12 +116,6 @@ public class FixedArray: ArrowArrayBase where T: BitwiseCopyable { } let byteOffset = arrowData.stride * Int(index) - // FIXME: Can probably do this and remove BitwiseCopyable constraint. - // let buffer = UnsafeBufferPointer( - // start: arrowData.buffers[1].rawPointer.assumingMemoryBound(to: ItemType.self), - // count: Int(arrowData.length) - // ) - // return buffer[Int(index)] return arrowData.buffers[1].rawPointer .advanced(by: byteOffset) .load(as: ItemType.self) diff --git a/Sources/Arrow/ArrowReader.swift b/Sources/Arrow/ArrowReader.swift index 166839a..b7fd642 100644 --- a/Sources/Arrow/ArrowReader.swift +++ b/Sources/Arrow/ArrowReader.swift @@ -30,6 +30,8 @@ public struct ArrowReader: Sendable { let startOffset = messageOffset + buffer.offset let endOffset = startOffset + buffer.length + let range = Int(startOffset).. Date: Sat, 8 Nov 2025 11:31:25 +0800 Subject: [PATCH 2/3] ArrowBuffer array is private on ArrowData, meaning all pointer manipulation has been moved out of Arrays and into ArrowData. This will be moved to buffers or removed. --- README.md | 2 + Sources/Arrow/ArrowArray.swift | 89 +++++-------------- Sources/Arrow/ArrowData.swift | 84 +++++++++++++++-- Sources/Arrow/ArrowType.swift | 2 +- .../Buffer/ArrowBufferBackedOffsets.swift | 39 ++++++++ Sources/Arrow/Buffer/NullBufferBuilder.swift | 1 - Sources/Arrow/Buffer/OffsetProtocol.swift | 2 +- Tests/ArrowTests/ArrayTests.swift | 13 +-- Tests/ArrowTests/BufferTests.swift | 3 + 9 files changed, 147 insertions(+), 88 deletions(-) create mode 100644 Sources/Arrow/Buffer/ArrowBufferBackedOffsets.swift diff --git a/README.md b/README.md index 41e8058..8a0a9c9 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,8 @@ A Swift implementation of Apache Arrow, the universal columnar format for fast data interchange and in-memory analytics. +This is a **work in progress**. Do not use in production. Progress is fast however, expect a beta in December. + This project is based on Arrow-Swift, the official Swift implementation of Apache Arrow. The decision was made to at least temporarily operate independently of the Apache Software Foundation (ASF). Currently there are no active ASF maintaners with knowledge of Swift, and the only [Apache approved CI for Swift](https://github.com/apache/infrastructure-actions/blob/main/approved_patterns.yml) is [setup-swift which is unmaintained](https://github.com/swift-actions/setup-swift/issues), leading to intermittent CI failures. This has led to delays in much-needed fixes being implemented. The intention is to continue contributing to the official Apache-Swift repository, however changes can be iterated on more quickly here. diff --git a/Sources/Arrow/ArrowArray.swift b/Sources/Arrow/ArrowArray.swift index ecb778b..25507f0 100644 --- a/Sources/Arrow/ArrowArray.swift +++ b/Sources/Arrow/ArrowArray.swift @@ -87,16 +87,11 @@ extension ArrowArrayBase { // TODO: Remove public var bufferData: [Data] { arrowData.bufferData -// arrowData.buffers.map { buffer in -// var data = Data() -// buffer.append(to: &data) -// return data -// } } + // TODO: Remove public var bufferDataSizes: [Int] { arrowData.bufferDataSizes -// arrowData.buffers.map { Int($0.capacity) } } public func isNull(at index: UInt) throws(ArrowError) -> Bool { @@ -115,11 +110,8 @@ public class FixedArray: ArrowArrayBase where T: BitwiseCopyable { if arrowData.isNull(index) { return nil } - let byteOffset = arrowData.stride * Int(index) - - return arrowData.buffers[1].rawPointer - .advanced(by: byteOffset) - .load(as: ItemType.self) + let value: ItemType = arrowData.load(at: index) + return value } } @@ -129,28 +121,11 @@ public class StringArray: ArrowArrayBase { if self.arrowData.isNull(index) { return nil } - - let offsets = self.arrowData.buffers[1] - let offsetIndex = MemoryLayout.stride * Int(index) - var startIndex: Int32 = 0 - if index > 0 { - startIndex = offsets.rawPointer.advanced(by: offsetIndex) - .load(as: Int32.self) - } - let endIndex = offsets.rawPointer.advanced( - by: offsetIndex + MemoryLayout.stride - ) - .load(as: Int32.self) - + let offsetBuffer: OffsetsBuffer = arrowData.offsets + let (startIndex, endIndex) = offsetBuffer.offsets(at: Int(index)) let arrayLength = Int(endIndex - startIndex) - let values = self.arrowData.buffers[2] - let rawPointer = values.rawPointer.advanced(by: Int(startIndex)) - .bindMemory(to: UInt8.self, capacity: arrayLength) - let buffer = UnsafeBufferPointer( - start: rawPointer, - count: arrayLength - ) - return String(bytes: buffer, encoding: .utf8) + let value: String = self.arrowData.loadVariable(at: Int(startIndex), arrayLength: arrayLength) + return value } } @@ -160,8 +135,7 @@ public class BoolArray: ArrowArrayBase { if self.arrowData.isNull(index) { return nil } - let valueBuffer = self.arrowData.buffers[1] - return BitUtility.isSet(index, buffer: valueBuffer) + return arrowData.isNullValue(at: index) } } @@ -171,10 +145,7 @@ public class Date32Array: ArrowArrayBase { if self.arrowData.isNull(index) { return nil } - let byteOffset = self.arrowData.stride * Int(index) - let milliseconds = self.arrowData.buffers[1].rawPointer.advanced( - by: byteOffset - ).load(as: UInt32.self) + let milliseconds: UInt32 = arrowData.load(at: index) return Date(timeIntervalSince1970: TimeInterval(milliseconds * 86400)) } } @@ -185,10 +156,8 @@ public class Date64Array: ArrowArrayBase { if self.arrowData.isNull(index) { return nil } - let byteOffset = self.arrowData.stride * Int(index) - let milliseconds = self.arrowData.buffers[1].rawPointer.advanced( - by: byteOffset - ).load(as: UInt64.self) + + let milliseconds: UInt64 = self.arrowData.load(at: index) return Date(timeIntervalSince1970: TimeInterval(milliseconds / 1000)) } } @@ -293,28 +262,16 @@ public class BinaryArray: ArrowArrayBase { public var options = Options() public override subscript(_ index: UInt) -> Data? { - let offsetIndex = MemoryLayout.stride * Int(index) if self.arrowData.isNull(index) { return nil } - let offsets = self.arrowData.buffers[1] - let values = self.arrowData.buffers[2] - var startIndex: Int32 = 0 - if index > 0 { - startIndex = offsets.rawPointer.advanced(by: offsetIndex) - .load(as: Int32.self) - } - let endIndex = offsets.rawPointer.advanced( - by: offsetIndex + MemoryLayout.stride - ) - .load(as: Int32.self) + + let (startIndex, endIndex) = arrowData.offsets.offsets(at: Int(index)) + let arrayLength = Int(endIndex - startIndex) - let rawPointer = values.rawPointer.advanced(by: Int(startIndex)) - .bindMemory(to: UInt8.self, capacity: arrayLength) - let buffer = UnsafeBufferPointer( - start: rawPointer, count: arrayLength) - let byteArray = Array(buffer) - return Data(byteArray) + + let data: Data = self.arrowData.loadVariable(at: Int(startIndex), arrayLength: arrayLength) + return data } public override func asString(_ index: UInt) -> String { @@ -376,16 +333,10 @@ public class NestedArray: ArrowArrayBase<[Any?]> { switch arrowData.type { case .list(let _): guard let values = children.first else { return nil } - let offsets = self.arrowData.buffers[1] - let offsetIndex = Int(index) * MemoryLayout.stride - let startOffset = offsets.rawPointer.advanced(by: offsetIndex) - .load(as: Int32.self) - let endOffset = offsets.rawPointer.advanced( - by: offsetIndex + MemoryLayout.stride - ) - .load(as: Int32.self) + + let (startIndex, endIndex) = arrowData.offsets.offsets(at: Int(index)) var items: [Any?] = [] - for i in startOffset..) +} + +extension String: VariableLength { + init(_ value: UnsafeBufferPointer) { + self.init(decoding: value, as: Unicode.UTF8.self) + } +} + +extension Data: VariableLength { + init(value: UnsafeBufferPointer) { + self.init(value) + } +} + public struct ArrowData { - // MARK: Remove + // FIXME: Remove public var bufferData: [Data] { buffers.map { buffer in var data = Data() @@ -25,26 +41,43 @@ public struct ArrowData { } } + // FIXME: Remove public var bufferDataSizes: [Int] { buffers.map { Int($0.capacity) } } + // FIXME: Remove public var data: [UnsafeMutableRawPointer] { buffers.map { $0.rawPointer } } + // FIXME: Remove public var bufferCount: Int { return buffers.count } - let buffers: [ArrowBuffer] - // MARK: End remove + // FIXME: Remove + private let buffers: [ArrowBuffer] + + // TODO: Typed accessors - migration + var offsets: OffsetsBuffer { + if !type.isVariable && !type.isNested { + fatalError() + } + return ArrowBufferBackedOffsets(buffers[1]) + } + + // TODO: this should replace nullBuffer + var nulls: NullBuffer { + let buffer = buffers[0] + let pointer = buffer.rawPointer.assumingMemoryBound(to: UInt8.self) + return NullBuffer(length: Int(buffer.length), capacity: 0, ownsMemory: false, buffer: pointer) + } public let type: ArrowType public let children: [ArrowData] public let nullCount: UInt public let length: UInt - public let stride: Int let nullBuffer: ArrowBuffer @@ -73,12 +106,49 @@ public struct ArrowData { self.children = children self.nullCount = nullCount self.length = length - self.stride = arrowType.getStride() - self.nullBuffer = buffers[0] } + + // TODO: Temporary while removing ArrowBuffer + public func load(at index: UInt) -> T where T: BitwiseCopyable { + let valueType = T.self + let byteOffset = type.getStride() * Int(index) + let milliseconds = buffers[1].rawPointer.advanced( + by: byteOffset + ).load(as: valueType) + return milliseconds + } + + // TODO: Temporary while removing ArrowBuffer + func loadVariable( + at startIndex: Int, + arrayLength: Int + ) -> T where T: VariableLength { + let values = buffers[2] + let rawPointer = values.rawPointer.advanced(by: startIndex) + .bindMemory(to: UInt8.self, capacity: arrayLength) + let buffer = UnsafeBufferPointer( + start: rawPointer, count: arrayLength) + return T(buffer) + } + // TODO: Temporary while removing ArrowBuffer public func isNull(_ at: UInt) -> Bool { - nullBuffer.length > 0 && !BitUtility.isSet(at, buffer: nullBuffer) + let a = nulls.length > 0 && !nulls.isSet(Int(at)) + let b = nullBuffer.length > 0 && !BitUtility.isSet(at, buffer: nullBuffer) + if nulls.length != nullBuffer.length { + fatalError("Check new null handling") + } + if a != b { + fatalError("Check new null handling") + } + return a } + + // TODO: Temporary while removing ArrowBuffer + func isNullValue(at index: UInt) -> Bool { + let valueBuffer = buffers[1] + return BitUtility.isSet(index, buffer: valueBuffer) + } + } diff --git a/Sources/Arrow/ArrowType.swift b/Sources/Arrow/ArrowType.swift index e03ed10..f8fe4c4 100644 --- a/Sources/Arrow/ArrowType.swift +++ b/Sources/Arrow/ArrowType.swift @@ -57,7 +57,7 @@ public struct UnionField: Codable, Sendable, Equatable { /// [the physical memory layout of Apache Arrow]: https://arrow.apache.org/docs/format/Columnar.html#physical-memory-layout public indirect enum ArrowType: Codable, Sendable, Equatable { /// Null type - case null + case null // TODO: Implement this /// A boolean datatype representing the values `true` and `false`. case boolean /// A signed 8-bit integer. diff --git a/Sources/Arrow/Buffer/ArrowBufferBackedOffsets.swift b/Sources/Arrow/Buffer/ArrowBufferBackedOffsets.swift new file mode 100644 index 0000000..4b5d2c7 --- /dev/null +++ b/Sources/Arrow/Buffer/ArrowBufferBackedOffsets.swift @@ -0,0 +1,39 @@ +// Copyright 2025 The Columnar Swift Contributors +// +// Licensed 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. + +struct ArrowBufferBackedOffsets: OffsetsBuffer { + + let arrowBuffer: ArrowBuffer + + init(_ arrowBuffer: ArrowBuffer) { + self.arrowBuffer = arrowBuffer + } + + func offsets(at index: Int) -> (start: Int32, end: Int32) { + + let offsets = arrowBuffer + let offsetIndex = MemoryLayout.stride * Int(index) + var startIndex: Int32 = 0 + if index > 0 { + startIndex = offsets.rawPointer.advanced(by: offsetIndex) + .load(as: Int32.self) + } + let endIndex = offsets.rawPointer.advanced( + by: offsetIndex + MemoryLayout.stride + ) + .load(as: Int32.self) + + return (start: startIndex, end: endIndex) + } +} diff --git a/Sources/Arrow/Buffer/NullBufferBuilder.swift b/Sources/Arrow/Buffer/NullBufferBuilder.swift index f3046ed..024af9b 100644 --- a/Sources/Arrow/Buffer/NullBufferBuilder.swift +++ b/Sources/Arrow/Buffer/NullBufferBuilder.swift @@ -51,7 +51,6 @@ final class NullBufferBuilder { // ensure we have space to write at index `length` if length >= capacity { resize(to: capacity * 2) - print("capacity: \(capacity)") } buffer[length] = currentByte currentByte = 0 diff --git a/Sources/Arrow/Buffer/OffsetProtocol.swift b/Sources/Arrow/Buffer/OffsetProtocol.swift index 70092af..6660242 100644 --- a/Sources/Arrow/Buffer/OffsetProtocol.swift +++ b/Sources/Arrow/Buffer/OffsetProtocol.swift @@ -15,7 +15,7 @@ /// A type which provides offset ranges in Arrow arrays. protocol OffsetsBuffer { /// Number of offset pairs available - var count: Int { get } +// var count: Int { get } /// Get the start and end offsets for the element at index /// - Parameter index: Zero-based index of the element diff --git a/Tests/ArrowTests/ArrayTests.swift b/Tests/ArrowTests/ArrayTests.swift index 46df65f..3bbb064 100644 --- a/Tests/ArrowTests/ArrayTests.swift +++ b/Tests/ArrowTests/ArrayTests.swift @@ -40,10 +40,10 @@ struct ArrayTests { #expect(array[10]! == 10) #expect(try array.isNull(at: 100) == true) - for buffer in array.arrowData.buffers { - let dataAddress = UInt(bitPattern: buffer.rawPointer) - #expect(dataAddress % 64 == 0, "Buffer should be 64-byte aligned") - } +// for buffer in array.arrowData.buffers { +// let dataAddress = UInt(bitPattern: buffer.rawPointer) +// #expect(dataAddress % 64 == 0, "Buffer should be 64-byte aligned") +// } } @Test func doubleArray() throws { @@ -91,11 +91,6 @@ struct ArrayTests { @Test func boolArray() throws { - for i in 0..<100 { - let bytesNeeded = (i + 7) / 8 - print("\(i) bits requires \(bytesNeeded) bytes") - } - let boolBuilder = try ArrowArrayBuilders.loadBoolArrayBuilder() boolBuilder.append(true) boolBuilder.append(nil) diff --git a/Tests/ArrowTests/BufferTests.swift b/Tests/ArrowTests/BufferTests.swift index 3335ef4..c2fac29 100644 --- a/Tests/ArrowTests/BufferTests.swift +++ b/Tests/ArrowTests/BufferTests.swift @@ -21,6 +21,9 @@ import Testing struct BufferTests { @Test func nullBufferBuilder() { + + // TODO: consider empty buffers + let mutableNullBuffer = NullBufferBuilder() for i in 0..<10000 { if i % 7 == 0 { From 05e4e4c6c0a904a8b77c3349d5a0ee724f4c42fa Mon Sep 17 00:00:00 2001 From: Will Temperley Date: Sat, 8 Nov 2025 11:34:50 +0800 Subject: [PATCH 3/3] Format. --- Sources/Arrow/ArrowArray.swift | 18 +++++----- Sources/Arrow/ArrowCExporter.swift | 6 ++-- Sources/Arrow/ArrowData.swift | 33 ++++++++++--------- Sources/Arrow/ArrowReader.swift | 2 +- Sources/Arrow/ArrowType.swift | 2 +- .../Buffer/ArrowBufferBackedOffsets.swift | 10 +++--- Sources/Arrow/Buffer/OffsetProtocol.swift | 2 +- Sources/Arrow/ChunkedArray.swift | 2 +- Tests/ArrowTests/ArrayTests.swift | 8 ++--- Tests/ArrowTests/BufferTests.swift | 4 +-- 10 files changed, 45 insertions(+), 42 deletions(-) diff --git a/Sources/Arrow/ArrowArray.swift b/Sources/Arrow/ArrowArray.swift index 25507f0..d938f93 100644 --- a/Sources/Arrow/ArrowArray.swift +++ b/Sources/Arrow/ArrowArray.swift @@ -22,8 +22,8 @@ public protocol AnyArrowArray { var length: UInt { get } var nullCount: UInt { get } var arrowData: ArrowData { get } - var bufferData: [Data] { get } // TODO: remove - var bufferDataSizes: [Int] { get } // TODO: remove + var bufferData: [Data] { get } // TODO: remove + var bufferDataSizes: [Int] { get } // TODO: remove func asAny(_ index: UInt) -> Any? func asString(_ index: UInt) -> String func setCArrayPtr(_ cArrayPtr: UnsafePointer?) @@ -124,7 +124,8 @@ public class StringArray: ArrowArrayBase { let offsetBuffer: OffsetsBuffer = arrowData.offsets let (startIndex, endIndex) = offsetBuffer.offsets(at: Int(index)) let arrayLength = Int(endIndex - startIndex) - let value: String = self.arrowData.loadVariable(at: Int(startIndex), arrayLength: arrayLength) + let value: String = self.arrowData.loadVariable( + at: Int(startIndex), arrayLength: arrayLength) return value } } @@ -156,7 +157,7 @@ public class Date64Array: ArrowArrayBase { if self.arrowData.isNull(index) { return nil } - + let milliseconds: UInt64 = self.arrowData.load(at: index) return Date(timeIntervalSince1970: TimeInterval(milliseconds / 1000)) } @@ -265,12 +266,13 @@ public class BinaryArray: ArrowArrayBase { if self.arrowData.isNull(index) { return nil } - + let (startIndex, endIndex) = arrowData.offsets.offsets(at: Int(index)) let arrayLength = Int(endIndex - startIndex) - - let data: Data = self.arrowData.loadVariable(at: Int(startIndex), arrayLength: arrayLength) + + let data: Data = self.arrowData.loadVariable( + at: Int(startIndex), arrayLength: arrayLength) return data } @@ -333,7 +335,7 @@ public class NestedArray: ArrowArrayBase<[Any?]> { switch arrowData.type { case .list(let _): guard let values = children.first else { return nil } - + let (startIndex, endIndex) = arrowData.offsets.offsets(at: Int(index)) var items: [Any?] = [] for i in startIndex..) + init(_ value: UnsafeBufferPointer) } extension String: VariableLength { @@ -31,7 +31,7 @@ extension Data: VariableLength { } public struct ArrowData { - + // FIXME: Remove public var bufferData: [Data] { buffers.map { buffer in @@ -45,20 +45,17 @@ public struct ArrowData { public var bufferDataSizes: [Int] { buffers.map { Int($0.capacity) } } - + // FIXME: Remove public var data: [UnsafeMutableRawPointer] { buffers.map { $0.rawPointer } } - + // FIXME: Remove public var bufferCount: Int { - return buffers.count + buffers.count } - - // FIXME: Remove - private let buffers: [ArrowBuffer] - + // TODO: Typed accessors - migration var offsets: OffsetsBuffer { if !type.isVariable && !type.isNested { @@ -66,12 +63,14 @@ public struct ArrowData { } return ArrowBufferBackedOffsets(buffers[1]) } - + // TODO: this should replace nullBuffer var nulls: NullBuffer { let buffer = buffers[0] let pointer = buffer.rawPointer.assumingMemoryBound(to: UInt8.self) - return NullBuffer(length: Int(buffer.length), capacity: 0, ownsMemory: false, buffer: pointer) + return NullBuffer( + length: Int(buffer.length), capacity: 0, ownsMemory: false, + buffer: pointer) } public let type: ArrowType @@ -79,7 +78,9 @@ public struct ArrowData { public let nullCount: UInt public let length: UInt - let nullBuffer: ArrowBuffer + private let nullBuffer: ArrowBuffer + // FIXME: Remove + private let buffers: [ArrowBuffer] init( _ arrowType: ArrowType, @@ -108,7 +109,7 @@ public struct ArrowData { self.length = length self.nullBuffer = buffers[0] } - + // TODO: Temporary while removing ArrowBuffer public func load(at index: UInt) -> T where T: BitwiseCopyable { let valueType = T.self @@ -118,7 +119,7 @@ public struct ArrowData { ).load(as: valueType) return milliseconds } - + // TODO: Temporary while removing ArrowBuffer func loadVariable( at startIndex: Int, @@ -144,11 +145,11 @@ public struct ArrowData { } return a } - + // TODO: Temporary while removing ArrowBuffer func isNullValue(at index: UInt) -> Bool { let valueBuffer = buffers[1] return BitUtility.isSet(index, buffer: valueBuffer) } - + } diff --git a/Sources/Arrow/ArrowReader.swift b/Sources/Arrow/ArrowReader.swift index dd70148..a2310ab 100644 --- a/Sources/Arrow/ArrowReader.swift +++ b/Sources/Arrow/ArrowReader.swift @@ -31,7 +31,7 @@ public struct ArrowReader: Sendable { let endOffset = startOffset + buffer.length let range = Int(startOffset).. (start: Int32, end: Int32) { - + let offsets = arrowBuffer let offsetIndex = MemoryLayout.stride * Int(index) var startIndex: Int32 = 0 @@ -33,7 +33,7 @@ struct ArrowBufferBackedOffsets: OffsetsBuffer { by: offsetIndex + MemoryLayout.stride ) .load(as: Int32.self) - + return (start: startIndex, end: endIndex) } } diff --git a/Sources/Arrow/Buffer/OffsetProtocol.swift b/Sources/Arrow/Buffer/OffsetProtocol.swift index 6660242..67f8ae5 100644 --- a/Sources/Arrow/Buffer/OffsetProtocol.swift +++ b/Sources/Arrow/Buffer/OffsetProtocol.swift @@ -15,7 +15,7 @@ /// A type which provides offset ranges in Arrow arrays. protocol OffsetsBuffer { /// Number of offset pairs available -// var count: Int { get } + // var count: Int { get } /// Get the start and end offsets for the element at index /// - Parameter index: Zero-based index of the element diff --git a/Sources/Arrow/ChunkedArray.swift b/Sources/Arrow/ChunkedArray.swift index 96dc301..90bd7e1 100644 --- a/Sources/Arrow/ChunkedArray.swift +++ b/Sources/Arrow/ChunkedArray.swift @@ -19,7 +19,7 @@ public class ChunkedArrayHolder { public let length: UInt public let nullCount: UInt public let holder: Any - + public init(_ chunked: ChunkedArray) { self.holder = chunked self.length = chunked.length diff --git a/Tests/ArrowTests/ArrayTests.swift b/Tests/ArrowTests/ArrayTests.swift index 3bbb064..e665c4e 100644 --- a/Tests/ArrowTests/ArrayTests.swift +++ b/Tests/ArrowTests/ArrayTests.swift @@ -40,10 +40,10 @@ struct ArrayTests { #expect(array[10]! == 10) #expect(try array.isNull(at: 100) == true) -// for buffer in array.arrowData.buffers { -// let dataAddress = UInt(bitPattern: buffer.rawPointer) -// #expect(dataAddress % 64 == 0, "Buffer should be 64-byte aligned") -// } + // for buffer in array.arrowData.buffers { + // let dataAddress = UInt(bitPattern: buffer.rawPointer) + // #expect(dataAddress % 64 == 0, "Buffer should be 64-byte aligned") + // } } @Test func doubleArray() throws { diff --git a/Tests/ArrowTests/BufferTests.swift b/Tests/ArrowTests/BufferTests.swift index c2fac29..79d04a9 100644 --- a/Tests/ArrowTests/BufferTests.swift +++ b/Tests/ArrowTests/BufferTests.swift @@ -21,9 +21,9 @@ import Testing struct BufferTests { @Test func nullBufferBuilder() { - + // TODO: consider empty buffers - + let mutableNullBuffer = NullBufferBuilder() for i in 0..<10000 { if i % 7 == 0 {