1+ // The Swift Programming Language
2+ // https://docs.swift.org/swift-book
3+
4+ import Foundation
5+ import Arrow
6+ import Hummingbird
7+
8+
9+ func makeRecordBatch( ) throws -> RecordBatch {
10+ let doubleBuilder : NumberArrayBuilder < Double > = try ArrowArrayBuilders . loadNumberArrayBuilder ( )
11+ doubleBuilder. append ( 11.11 )
12+ doubleBuilder. append ( 22.22 )
13+ doubleBuilder. append ( 33.33 )
14+ doubleBuilder. append ( 44.44 )
15+ let stringBuilder = try ArrowArrayBuilders . loadStringArrayBuilder ( )
16+ stringBuilder. append ( " test10 " )
17+ stringBuilder. append ( " test22 " )
18+ stringBuilder. append ( " test33 " )
19+ stringBuilder. append ( " test44 " )
20+ let date32Builder = try ArrowArrayBuilders . loadDate32ArrayBuilder ( )
21+ let date2 = Date ( timeIntervalSinceReferenceDate: 86400 * 1 )
22+ let date1 = Date ( timeIntervalSinceReferenceDate: 86400 * 5000 + 352 )
23+ date32Builder. append ( date1)
24+ date32Builder. append ( date2)
25+ date32Builder. append ( date1)
26+ date32Builder. append ( date2)
27+ let doubleHolder = ArrowArrayHolderImpl ( try doubleBuilder. finish ( ) )
28+ let stringHolder = ArrowArrayHolderImpl ( try stringBuilder. finish ( ) )
29+ let date32Holder = ArrowArrayHolderImpl ( try date32Builder. finish ( ) )
30+ let result = RecordBatch . Builder ( )
31+ . addColumn ( " col1 " , arrowArray: doubleHolder)
32+ . addColumn ( " col2 " , arrowArray: stringHolder)
33+ . addColumn ( " col3 " , arrowArray: date32Holder)
34+ . finish ( )
35+ switch result {
36+ case . success( let recordBatch) :
37+ return recordBatch
38+ case . failure( let error) :
39+ throw error
40+ }
41+ }
42+
43+ final class HttpTest {
44+ var appStarted = false
45+ var done = false
46+ var stopFunc : ( ( ) -> Void ) ?
47+
48+ func run( ) throws {
49+ _ = Task {
50+ let router = Router ( )
51+ router. get ( " / " ) { request, _ -> ByteBuffer in
52+ let recordBatch = try makeRecordBatch ( )
53+ let arrowWriter = ArrowWriter ( )
54+ let writerInfo = ArrowWriter . Info ( . recordbatch, schema: recordBatch. schema, batches: [ recordBatch] )
55+ switch arrowWriter. toStream ( writerInfo) {
56+ case . success( let writeData) :
57+ return ByteBuffer ( data: writeData)
58+ case . failure( let error) :
59+ throw error
60+ }
61+ }
62+
63+ // create application using router
64+ let app = Application (
65+ router: router,
66+ configuration: . init( address: . hostname( " 127.0.0.1 " , port: 8081 ) )
67+ )
68+
69+ try await app. runService ( )
70+ return ByteBuffer ( )
71+ }
72+
73+ let sem = DispatchSemaphore ( value: 0 )
74+ let url = URL ( string: " http://127.0.0.1:8081 " ) !
75+ let task = URLSession . shared. dataTask ( with: url) { data, response, error in
76+ defer { sem. signal ( ) }
77+ if let writeData = data {
78+ let arrowReader = ArrowReader ( )
79+ switch arrowReader. fromStream ( writeData) {
80+ case . success( let result) :
81+ let recordBatches = result. batches
82+ print ( " recordBatch columns: \( recordBatches. count) " )
83+ let rb = recordBatches [ 0 ]
84+ print ( " recordBatch columns: \( rb. columnCount) " )
85+ for (idx, column) in rb. columns. enumerated ( ) {
86+ print ( " col \( idx) " )
87+ let array = column. array
88+ for idx in 0 ..< array. length {
89+ print ( " data col \( idx) : \( String ( describing: array. asAny ( idx) ) ) " )
90+ }
91+ }
92+ case . failure( let error) :
93+ print ( " error: \( error) " )
94+ }
95+ } else if let error = error {
96+ print ( " HTTP Request Failed \( error) " )
97+ }
98+ }
99+
100+ task. resume ( )
101+ _ = sem. wait ( timeout: . distantFuture)
102+ print ( " done running http server " )
103+ }
104+ }
105+
106+ var httpTest = HttpTest ( )
107+ try httpTest. run ( )
0 commit comments