kou commented on code in PR #35985:
URL: https://github.com/apache/arrow/pull/35985#discussion_r1222344262


##########
swift/Arrow/Sources/Arrow/ArrowArray.swift:
##########
@@ -182,3 +182,52 @@ public class Date64Array: ArrowArray<Date> {
         }
     }
 }
+
+public class Time32Array: FixedArray<Time32> {}
+public class Time64Array: FixedArray<Time64> {}
+
+public class BinaryArray: ArrowArray<Data> {
+    public struct Options {
+        public var printAsHex = false
+        public var printEncoding: String.Encoding = .utf8;
+    }
+    
+    public var options = Options()
+    
+    public override subscript(_ index: UInt) -> Data? {
+        get{

Review Comment:
   ```suggestion
           get {
   ```



##########
swift/Arrow/Sources/Arrow/ArrowType.swift:
##########
@@ -116,17 +154,21 @@ public class ArrowType {
             return ArrowType.ArrowUnknown
         }
     }
+    
+    

Review Comment:
   ```suggestion
   ```



##########
swift/Arrow/Tests/ArrowTests/IPCTests.swift:
##########
@@ -108,33 +108,34 @@ final class IPCFileReaderTests: XCTestCase {
         let fileRBs = try checkBoolRecordBatch(arrowReader.fromFile(fileURL))
         let arrowWriter = ArrowWriter()
         //write data from file to a stream
-        switch arrowWriter.toStream(fileRBs[0].schema, batches: fileRBs) {
+        let writerInfo = ArrowWriter.Info(.recordbatch, schema: 
fileRBs[0].schema, batches: fileRBs)
+        switch arrowWriter.toStream(writerInfo) {
         case .success(let writeData):
             //read stream back into recordbatches
             try checkBoolRecordBatch(arrowReader.fromStream(writeData))
         case .failure(let error):
             throw error
         }
-
+        

Review Comment:
   ```suggestion
   
   ```



##########
swift/Arrow/Sources/Arrow/ArrowWriterHelper.swift:
##########
@@ -34,16 +35,21 @@ func toFBTypeEnum(_ infoType: ArrowType.Info) -> 
Result<org_apache_arrow_flatbuf
         return .success(org_apache_arrow_flatbuf_Type_.floatingpoint)
     } else if infoType == ArrowType.ArrowString {
         return .success(org_apache_arrow_flatbuf_Type_.utf8)
+    } else if infoType == ArrowType.ArrowBinary {
+        return .success(org_apache_arrow_flatbuf_Type_.binary)
     } else if infoType == ArrowType.ArrowBool {
         return .success(org_apache_arrow_flatbuf_Type_.bool)
     } else if infoType == ArrowType.ArrowDate32 || infoType == 
ArrowType.ArrowDate64 {
         return .success(org_apache_arrow_flatbuf_Type_.date)
+    } else if infoType == ArrowType.ArrowTime32 || infoType == 
ArrowType.ArrowTime64 {
+        return .success(org_apache_arrow_flatbuf_Type_.time)
     }
-
-    return .failure(.unknownType)
+    

Review Comment:
   ```suggestion
   
   ```



##########
swift/Arrow/Tests/ArrowTests/IPCTests.swift:
##########
@@ -153,7 +154,7 @@ final class IPCFileReaderTests: XCTestCase {
         date32Builder.append(date2)
         date32Builder.append(date1)
         date32Builder.append(date2)
-
+        

Review Comment:
   ```suggestion
   
   ```



##########
swift/Arrow/Tests/ArrowTests/IPCTests.swift:
##########
@@ -209,4 +212,163 @@ final class IPCFileReaderTests: XCTestCase {
             throw error
         }
     }
+    
+    func testSchemaInMemoryToFromStream() throws {
+        //read existing file
+        let schema = makeSchema()
+        let arrowWriter = ArrowWriter()
+        let writerInfo = ArrowWriter.Info(.schema, schema: schema)
+        switch arrowWriter.toStream(writerInfo) {
+        case .success(let writeData):
+            let arrowReader = ArrowReader()
+            switch arrowReader.fromStream(writeData) {
+            case .success(let result):
+                XCTAssertNotNil(result.schema)
+                let schema  = result.schema!
+                XCTAssertEqual(schema.fields.count, 3)
+                XCTAssertEqual(schema.fields[0].name, "col1")
+                XCTAssertEqual(schema.fields[0].type.info, 
ArrowType.ArrowUInt8)
+                XCTAssertEqual(schema.fields[1].name, "col2")
+                XCTAssertEqual(schema.fields[1].type.info, 
ArrowType.ArrowString)
+                XCTAssertEqual(schema.fields[2].name, "col3")
+                XCTAssertEqual(schema.fields[2].type.info, 
ArrowType.ArrowDate32)
+            case.failure(let error):
+                throw error
+            }
+        case .failure(let error):
+            throw error
+        }
+    }
+    
+    func makeBinaryDataset() throws -> (ArrowSchema, RecordBatch) {
+        let schemaBuilder = ArrowSchema.Builder();
+        let schema = schemaBuilder.addField("col1", type: 
ArrowType(ArrowType.ArrowUInt8), isNullable: true)
+            .addField("col2", type: ArrowType(ArrowType.ArrowBinary), 
isNullable: false)
+            .finish()
+        
+        let uint8Builder: NumberArrayBuilder<UInt8> = try 
ArrowArrayBuilders.loadNumberArrayBuilder();
+        uint8Builder.append(10)
+        uint8Builder.append(22)
+        uint8Builder.append(33)
+        uint8Builder.append(44)
+        let binaryBuilder = try ArrowArrayBuilders.loadBinaryArrayBuilder();
+        binaryBuilder.append("test10".data(using: .utf8))
+        binaryBuilder.append("test22".data(using: .utf8))
+        binaryBuilder.append("test33".data(using: .utf8))
+        binaryBuilder.append("test44".data(using: .utf8))
+        
+        let intHolder = ArrowArrayHolder(try uint8Builder.finish())
+        let binaryHolder = ArrowArrayHolder(try binaryBuilder.finish())
+        let result = RecordBatch.Builder()
+            .addColumn("col1", arrowArray: intHolder)
+            .addColumn("col2", arrowArray: binaryHolder)
+            .finish()
+        switch result {
+        case .success(let recordBatch):
+            return (schema, recordBatch)
+        case .failure(let error):
+            throw error
+        }
+    }
+    
+    func makeTimeDataset() throws -> (ArrowSchema, RecordBatch) {
+        let schemaBuilder = ArrowSchema.Builder();
+        let schema = schemaBuilder.addField("col1", type: 
ArrowType(ArrowType.ArrowUInt8), isNullable: true)
+            .addField("col2", type: ArrowTypeTime64(.Microseconds), 
isNullable: false)
+            .addField("col3", type: ArrowTypeTime32(.Milliseconds), 
isNullable: false)
+            .finish()
+        
+        let uint8Builder: NumberArrayBuilder<UInt8> = try 
ArrowArrayBuilders.loadNumberArrayBuilder();
+        uint8Builder.append(10)
+        uint8Builder.append(22)
+        uint8Builder.append(33)
+        uint8Builder.append(44)
+        let time64Builder = try 
ArrowArrayBuilders.loadTime64ArrayBuilder(.Nanoseconds);
+        time64Builder.append(12345678)
+        time64Builder.append(1)
+        time64Builder.append(nil)
+        time64Builder.append(98765432)
+        let time32Builder = try 
ArrowArrayBuilders.loadTime32ArrayBuilder(.Milliseconds);
+        time32Builder.append(1)
+        time32Builder.append(2)
+        time32Builder.append(nil)
+        time32Builder.append(3)
+        
+        let intHolder = ArrowArrayHolder(try uint8Builder.finish())

Review Comment:
   ```suggestion
           let uintHolder = ArrowArrayHolder(try uint8Builder.finish())
   ```



##########
swift/Arrow/Tests/ArrowTests/IPCTests.swift:
##########
@@ -209,4 +212,163 @@ final class IPCFileReaderTests: XCTestCase {
             throw error
         }
     }
+    
+    func testSchemaInMemoryToFromStream() throws {
+        //read existing file
+        let schema = makeSchema()
+        let arrowWriter = ArrowWriter()
+        let writerInfo = ArrowWriter.Info(.schema, schema: schema)
+        switch arrowWriter.toStream(writerInfo) {
+        case .success(let writeData):
+            let arrowReader = ArrowReader()
+            switch arrowReader.fromStream(writeData) {
+            case .success(let result):
+                XCTAssertNotNil(result.schema)
+                let schema  = result.schema!
+                XCTAssertEqual(schema.fields.count, 3)
+                XCTAssertEqual(schema.fields[0].name, "col1")
+                XCTAssertEqual(schema.fields[0].type.info, 
ArrowType.ArrowUInt8)
+                XCTAssertEqual(schema.fields[1].name, "col2")
+                XCTAssertEqual(schema.fields[1].type.info, 
ArrowType.ArrowString)
+                XCTAssertEqual(schema.fields[2].name, "col3")
+                XCTAssertEqual(schema.fields[2].type.info, 
ArrowType.ArrowDate32)
+            case.failure(let error):
+                throw error
+            }
+        case .failure(let error):
+            throw error
+        }
+    }
+    
+    func makeBinaryDataset() throws -> (ArrowSchema, RecordBatch) {
+        let schemaBuilder = ArrowSchema.Builder();
+        let schema = schemaBuilder.addField("col1", type: 
ArrowType(ArrowType.ArrowUInt8), isNullable: true)
+            .addField("col2", type: ArrowType(ArrowType.ArrowBinary), 
isNullable: false)
+            .finish()
+        
+        let uint8Builder: NumberArrayBuilder<UInt8> = try 
ArrowArrayBuilders.loadNumberArrayBuilder();
+        uint8Builder.append(10)
+        uint8Builder.append(22)
+        uint8Builder.append(33)
+        uint8Builder.append(44)
+        let binaryBuilder = try ArrowArrayBuilders.loadBinaryArrayBuilder();
+        binaryBuilder.append("test10".data(using: .utf8))
+        binaryBuilder.append("test22".data(using: .utf8))
+        binaryBuilder.append("test33".data(using: .utf8))
+        binaryBuilder.append("test44".data(using: .utf8))
+        
+        let intHolder = ArrowArrayHolder(try uint8Builder.finish())

Review Comment:
   ```suggestion
           let uintHolder = ArrowArrayHolder(try uint8Builder.finish())
   ```
   
   BTW, do we need this column?



##########
swift/Arrow/Tests/ArrowTests/IPCTests.swift:
##########
@@ -108,33 +108,34 @@ final class IPCFileReaderTests: XCTestCase {
         let fileRBs = try checkBoolRecordBatch(arrowReader.fromFile(fileURL))
         let arrowWriter = ArrowWriter()
         //write data from file to a stream
-        switch arrowWriter.toStream(fileRBs[0].schema, batches: fileRBs) {
+        let writerInfo = ArrowWriter.Info(.recordbatch, schema: 
fileRBs[0].schema, batches: fileRBs)
+        switch arrowWriter.toStream(writerInfo) {
         case .success(let writeData):
             //read stream back into recordbatches
             try checkBoolRecordBatch(arrowReader.fromStream(writeData))
         case .failure(let error):
             throw error
         }
-
+        
         //write file record batches to another file
         let outputUrl = 
currentDirectory().appendingPathComponent("../../testfilewriter_bool.arrow")
-        switch arrowWriter.toFile(outputUrl, schema: fileRBs[0].schema, 
batches: fileRBs) {
+        switch arrowWriter.toFile(outputUrl, info: writerInfo) {
         case .success(_):
             try checkBoolRecordBatch(arrowReader.fromFile(outputUrl))
         case .failure(let error):
             throw error
         }
         
     }
-
+    
     func makeSchema() -> ArrowSchema {
         let schemaBuilder = ArrowSchema.Builder();
-        return schemaBuilder.addField("col1", type: ArrowType.ArrowUInt8, 
isNullable: true)
-            .addField("col2", type: ArrowType.ArrowString, isNullable: false)
-            .addField("col3", type: ArrowType.ArrowDate32, isNullable: false)
+        return schemaBuilder.addField("col1", type: 
ArrowType(ArrowType.ArrowUInt8), isNullable: true)
+            .addField("col2", type: ArrowType(ArrowType.ArrowString), 
isNullable: false)
+            .addField("col3", type: ArrowType(ArrowType.ArrowDate32), 
isNullable: false)
             .finish()
     }
-
+    

Review Comment:
   ```suggestion
   
   ```



##########
swift/Arrow/Tests/ArrowTests/ArrayTests.swift:
##########
@@ -125,6 +125,62 @@ final class ArrayTests: XCTestCase {
         XCTAssertEqual(date64Array.length, 3)
         XCTAssertEqual(date64Array[1], date2)
         XCTAssertEqual(date64Array[0]!, date1)
+    }
+    
+    func testBinaryArray() throws {
+        let binaryBuilder = try ArrowArrayBuilders.loadBinaryArrayBuilder();
+        for i in 0..<100 {
+            if i % 10 == 9 {
+                binaryBuilder.append(nil)
+            } else {
+                binaryBuilder.append(("test" + String(i)).data(using:.utf8))
+            }
+        }
         
+        XCTAssertEqual(binaryBuilder.nullCount, 10)
+        XCTAssertEqual(binaryBuilder.length, 100)
+        XCTAssertEqual(binaryBuilder.capacity, 648)
+        let binaryArray = try binaryBuilder.finish()
+        XCTAssertEqual(binaryArray.length, 100)
+        for i in 0..<binaryArray.length {
+            if i % 10 == 9 {
+                XCTAssertEqual(try binaryArray.isNull(i), true)
+            } else {
+                let stringData = String(bytes: binaryArray[i]!, encoding: 
.utf8)
+                XCTAssertEqual(stringData, "test" + String(i))
+            }
+        }
+    }
+    
+    func testTime32Array() throws {
+        let time32Builder = try 
ArrowArrayBuilders.loadTime32ArrayBuilder(.Milliseconds);
+        time32Builder.append(100)
+        time32Builder.append(1000000)
+        time32Builder.append(nil)
+        XCTAssertEqual(time32Builder.nullCount, 1)
+        XCTAssertEqual(time32Builder.length, 3)
+        XCTAssertEqual(time32Builder.capacity, 136)
+        let time32Array = try time32Builder.finish()
+        let time32Type = time32Array.arrowData.type as! ArrowTypeTime32
+        XCTAssertEqual(time32Type.unit, .Milliseconds)
+        XCTAssertEqual(time32Array.length, 3)
+        XCTAssertEqual(time32Array[1], 1000000)
+        XCTAssertEqual(time32Array[2], nil)
+    }
+    
+    func testTime64Array() throws {
+        let time32Builder = try 
ArrowArrayBuilders.loadTime64ArrayBuilder(.Nanoseconds);

Review Comment:
   We may want to add a test for `.Microseconds` too.



##########
swift/Arrow/Sources/Arrow/ArrowArray.swift:
##########
@@ -182,3 +182,52 @@ public class Date64Array: ArrowArray<Date> {
         }
     }
 }
+
+public class Time32Array: FixedArray<Time32> {}
+public class Time64Array: FixedArray<Time64> {}
+
+public class BinaryArray: ArrowArray<Data> {
+    public struct Options {
+        public var printAsHex = false
+        public var printEncoding: String.Encoding = .utf8;
+    }
+    
+    public var options = Options()
+    
+    public override subscript(_ index: UInt) -> Data? {
+        get{
+            let offsetIndex = MemoryLayout<Int32>.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<Int32>.stride ).load(as: Int32.self)
+            let arrayLength = Int(endIndex - startIndex);
+            let rawPointer =  values.rawPointer.advanced(by: 
Int(startIndex)).bindMemory(to: UInt8.self, capacity: arrayLength)
+            let buffer = UnsafeBufferPointer<UInt8>(start: rawPointer, count: 
arrayLength);
+            let byteArray = Array(buffer)
+            return Data(byteArray)
+        }
+    }
+    
+    public override func asString(_ index: UInt) -> String {
+        if self[index] == nil {
+            return ""
+        }
+        
+        let data = self[index]!
+        if(options.printAsHex) {

Review Comment:
   ```suggestion
           if options.printAsHex {
   ```



##########
swift/Arrow/Tests/ArrowTests/ArrayTests.swift:
##########
@@ -125,6 +125,62 @@ final class ArrayTests: XCTestCase {
         XCTAssertEqual(date64Array.length, 3)
         XCTAssertEqual(date64Array[1], date2)
         XCTAssertEqual(date64Array[0]!, date1)
+    }
+    
+    func testBinaryArray() throws {
+        let binaryBuilder = try ArrowArrayBuilders.loadBinaryArrayBuilder();
+        for i in 0..<100 {
+            if i % 10 == 9 {
+                binaryBuilder.append(nil)
+            } else {
+                binaryBuilder.append(("test" + String(i)).data(using:.utf8))
+            }
+        }
         
+        XCTAssertEqual(binaryBuilder.nullCount, 10)
+        XCTAssertEqual(binaryBuilder.length, 100)
+        XCTAssertEqual(binaryBuilder.capacity, 648)
+        let binaryArray = try binaryBuilder.finish()
+        XCTAssertEqual(binaryArray.length, 100)
+        for i in 0..<binaryArray.length {
+            if i % 10 == 9 {
+                XCTAssertEqual(try binaryArray.isNull(i), true)
+            } else {
+                let stringData = String(bytes: binaryArray[i]!, encoding: 
.utf8)
+                XCTAssertEqual(stringData, "test" + String(i))
+            }
+        }
+    }
+    
+    func testTime32Array() throws {
+        let time32Builder = try 
ArrowArrayBuilders.loadTime32ArrayBuilder(.Milliseconds);
+        time32Builder.append(100)
+        time32Builder.append(1000000)
+        time32Builder.append(nil)
+        XCTAssertEqual(time32Builder.nullCount, 1)
+        XCTAssertEqual(time32Builder.length, 3)
+        XCTAssertEqual(time32Builder.capacity, 136)
+        let time32Array = try time32Builder.finish()
+        let time32Type = time32Array.arrowData.type as! ArrowTypeTime32
+        XCTAssertEqual(time32Type.unit, .Milliseconds)
+        XCTAssertEqual(time32Array.length, 3)
+        XCTAssertEqual(time32Array[1], 1000000)
+        XCTAssertEqual(time32Array[2], nil)
+    }
+    
+    func testTime64Array() throws {
+        let time32Builder = try 
ArrowArrayBuilders.loadTime64ArrayBuilder(.Nanoseconds);

Review Comment:
   ```suggestion
           let time64Builder = try 
ArrowArrayBuilders.loadTime64ArrayBuilder(.Nanoseconds);
   ```



##########
swift/Arrow/Tests/ArrowTests/IPCTests.swift:
##########
@@ -66,21 +66,21 @@ final class IPCFileReaderTests: XCTestCase {
         let result = arrowReader.fromFile(fileURL)
         let recordBatches: [RecordBatch]
         switch result {
-        case .success(let rbBatches):
-            recordBatches = rbBatches
+        case .success(let result):
+            recordBatches = result.batches
         case .failure(let error):
             throw error
         }
-
+        

Review Comment:
   ```suggestion
   
   ```



##########
swift/Arrow/Tests/ArrowTests/ArrayTests.swift:
##########
@@ -125,6 +125,62 @@ final class ArrayTests: XCTestCase {
         XCTAssertEqual(date64Array.length, 3)
         XCTAssertEqual(date64Array[1], date2)
         XCTAssertEqual(date64Array[0]!, date1)
+    }
+    
+    func testBinaryArray() throws {
+        let binaryBuilder = try ArrowArrayBuilders.loadBinaryArrayBuilder();
+        for i in 0..<100 {
+            if i % 10 == 9 {
+                binaryBuilder.append(nil)
+            } else {
+                binaryBuilder.append(("test" + String(i)).data(using:.utf8))
+            }
+        }
         
+        XCTAssertEqual(binaryBuilder.nullCount, 10)
+        XCTAssertEqual(binaryBuilder.length, 100)
+        XCTAssertEqual(binaryBuilder.capacity, 648)
+        let binaryArray = try binaryBuilder.finish()
+        XCTAssertEqual(binaryArray.length, 100)
+        for i in 0..<binaryArray.length {
+            if i % 10 == 9 {
+                XCTAssertEqual(try binaryArray.isNull(i), true)
+            } else {
+                let stringData = String(bytes: binaryArray[i]!, encoding: 
.utf8)
+                XCTAssertEqual(stringData, "test" + String(i))
+            }
+        }
+    }
+    
+    func testTime32Array() throws {
+        let time32Builder = try 
ArrowArrayBuilders.loadTime32ArrayBuilder(.Milliseconds);

Review Comment:
   We may want to add a test for `.Seconds` too.



##########
swift/Arrow/Tests/ArrowTests/IPCTests.swift:
##########
@@ -108,33 +108,34 @@ final class IPCFileReaderTests: XCTestCase {
         let fileRBs = try checkBoolRecordBatch(arrowReader.fromFile(fileURL))
         let arrowWriter = ArrowWriter()
         //write data from file to a stream
-        switch arrowWriter.toStream(fileRBs[0].schema, batches: fileRBs) {
+        let writerInfo = ArrowWriter.Info(.recordbatch, schema: 
fileRBs[0].schema, batches: fileRBs)
+        switch arrowWriter.toStream(writerInfo) {
         case .success(let writeData):
             //read stream back into recordbatches
             try checkBoolRecordBatch(arrowReader.fromStream(writeData))
         case .failure(let error):
             throw error
         }
-
+        
         //write file record batches to another file
         let outputUrl = 
currentDirectory().appendingPathComponent("../../testfilewriter_bool.arrow")
-        switch arrowWriter.toFile(outputUrl, schema: fileRBs[0].schema, 
batches: fileRBs) {
+        switch arrowWriter.toFile(outputUrl, info: writerInfo) {
         case .success(_):
             try checkBoolRecordBatch(arrowReader.fromFile(outputUrl))
         case .failure(let error):
             throw error
         }
         
     }
-
+    

Review Comment:
   ```suggestion
   
   ```



##########
swift/Arrow/Tests/ArrowTests/IPCTests.swift:
##########
@@ -209,4 +212,163 @@ final class IPCFileReaderTests: XCTestCase {
             throw error
         }
     }
+    
+    func testSchemaInMemoryToFromStream() throws {
+        //read existing file
+        let schema = makeSchema()
+        let arrowWriter = ArrowWriter()
+        let writerInfo = ArrowWriter.Info(.schema, schema: schema)
+        switch arrowWriter.toStream(writerInfo) {
+        case .success(let writeData):
+            let arrowReader = ArrowReader()
+            switch arrowReader.fromStream(writeData) {
+            case .success(let result):
+                XCTAssertNotNil(result.schema)
+                let schema  = result.schema!
+                XCTAssertEqual(schema.fields.count, 3)
+                XCTAssertEqual(schema.fields[0].name, "col1")
+                XCTAssertEqual(schema.fields[0].type.info, 
ArrowType.ArrowUInt8)
+                XCTAssertEqual(schema.fields[1].name, "col2")
+                XCTAssertEqual(schema.fields[1].type.info, 
ArrowType.ArrowString)
+                XCTAssertEqual(schema.fields[2].name, "col3")
+                XCTAssertEqual(schema.fields[2].type.info, 
ArrowType.ArrowDate32)
+            case.failure(let error):
+                throw error
+            }
+        case .failure(let error):
+            throw error
+        }
+    }
+    
+    func makeBinaryDataset() throws -> (ArrowSchema, RecordBatch) {
+        let schemaBuilder = ArrowSchema.Builder();
+        let schema = schemaBuilder.addField("col1", type: 
ArrowType(ArrowType.ArrowUInt8), isNullable: true)
+            .addField("col2", type: ArrowType(ArrowType.ArrowBinary), 
isNullable: false)
+            .finish()
+        
+        let uint8Builder: NumberArrayBuilder<UInt8> = try 
ArrowArrayBuilders.loadNumberArrayBuilder();
+        uint8Builder.append(10)
+        uint8Builder.append(22)
+        uint8Builder.append(33)
+        uint8Builder.append(44)
+        let binaryBuilder = try ArrowArrayBuilders.loadBinaryArrayBuilder();
+        binaryBuilder.append("test10".data(using: .utf8))
+        binaryBuilder.append("test22".data(using: .utf8))
+        binaryBuilder.append("test33".data(using: .utf8))
+        binaryBuilder.append("test44".data(using: .utf8))
+        
+        let intHolder = ArrowArrayHolder(try uint8Builder.finish())
+        let binaryHolder = ArrowArrayHolder(try binaryBuilder.finish())
+        let result = RecordBatch.Builder()
+            .addColumn("col1", arrowArray: intHolder)
+            .addColumn("col2", arrowArray: binaryHolder)
+            .finish()
+        switch result {
+        case .success(let recordBatch):
+            return (schema, recordBatch)
+        case .failure(let error):
+            throw error
+        }
+    }
+    
+    func makeTimeDataset() throws -> (ArrowSchema, RecordBatch) {
+        let schemaBuilder = ArrowSchema.Builder();
+        let schema = schemaBuilder.addField("col1", type: 
ArrowType(ArrowType.ArrowUInt8), isNullable: true)
+            .addField("col2", type: ArrowTypeTime64(.Microseconds), 
isNullable: false)
+            .addField("col3", type: ArrowTypeTime32(.Milliseconds), 
isNullable: false)
+            .finish()
+        
+        let uint8Builder: NumberArrayBuilder<UInt8> = try 
ArrowArrayBuilders.loadNumberArrayBuilder();
+        uint8Builder.append(10)
+        uint8Builder.append(22)
+        uint8Builder.append(33)
+        uint8Builder.append(44)
+        let time64Builder = try 
ArrowArrayBuilders.loadTime64ArrayBuilder(.Nanoseconds);
+        time64Builder.append(12345678)
+        time64Builder.append(1)
+        time64Builder.append(nil)
+        time64Builder.append(98765432)
+        let time32Builder = try 
ArrowArrayBuilders.loadTime32ArrayBuilder(.Milliseconds);
+        time32Builder.append(1)
+        time32Builder.append(2)
+        time32Builder.append(nil)
+        time32Builder.append(3)
+        
+        let intHolder = ArrowArrayHolder(try uint8Builder.finish())
+        let time64Holder = ArrowArrayHolder(try time64Builder.finish())
+        let time32Holder = ArrowArrayHolder(try time32Builder.finish())
+        let result = RecordBatch.Builder()
+            .addColumn("col1", arrowArray: intHolder)
+            .addColumn("col2", arrowArray: time64Holder)
+            .addColumn("col3", arrowArray: time32Holder)

Review Comment:
   How about using more readable column names such as `time64` and  `time32`?



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to