18
18
import FlatBuffers
19
19
import Foundation
20
20
21
- private func makeBinaryHolder( _ buffers: [ ArrowBuffer ] ) -> Result < ArrowArrayHolder , ArrowError > {
21
+ private func makeBinaryHolder( _ buffers: [ ArrowBuffer ] ,
22
+ nullCount: UInt ) -> Result < ArrowArrayHolder , ArrowError > {
22
23
do {
23
24
let arrowData = try ArrowData ( ArrowType ( ArrowType . ArrowBinary) , buffers: buffers,
24
- nullCount: buffers [ 0 ] . length , stride: MemoryLayout< Int8> . stride)
25
+ nullCount: nullCount , stride: MemoryLayout< Int8> . stride)
25
26
return . success( ArrowArrayHolder ( BinaryArray ( arrowData) ) )
26
27
} catch let error as ArrowError {
27
28
return . failure( error)
@@ -30,10 +31,11 @@ private func makeBinaryHolder(_ buffers: [ArrowBuffer]) -> Result<ArrowArrayHold
30
31
}
31
32
}
32
33
33
- private func makeStringHolder( _ buffers: [ ArrowBuffer ] ) -> Result < ArrowArrayHolder , ArrowError > {
34
+ private func makeStringHolder( _ buffers: [ ArrowBuffer ] ,
35
+ nullCount: UInt ) -> Result < ArrowArrayHolder , ArrowError > {
34
36
do {
35
37
let arrowData = try ArrowData ( ArrowType ( ArrowType . ArrowString) , buffers: buffers,
36
- nullCount: buffers [ 0 ] . length , stride: MemoryLayout< Int8> . stride)
38
+ nullCount: nullCount , stride: MemoryLayout< Int8> . stride)
37
39
return . success( ArrowArrayHolder ( StringArray ( arrowData) ) )
38
40
} catch let error as ArrowError {
39
41
return . failure( error)
@@ -43,30 +45,32 @@ private func makeStringHolder(_ buffers: [ArrowBuffer]) -> Result<ArrowArrayHold
43
45
}
44
46
45
47
private func makeFloatHolder( _ floatType: org_apache_arrow_flatbuf_FloatingPoint ,
46
- buffers: [ ArrowBuffer ]
48
+ buffers: [ ArrowBuffer ] ,
49
+ nullCount: UInt
47
50
) -> Result < ArrowArrayHolder , ArrowError > {
48
51
switch floatType. precision {
49
52
case . single:
50
- return makeFixedHolder ( Float . self, buffers: buffers, arrowType: ArrowType . ArrowFloat)
53
+ return makeFixedHolder ( Float . self, buffers: buffers, arrowType: ArrowType . ArrowFloat, nullCount : nullCount )
51
54
case . double:
52
- return makeFixedHolder ( Double . self, buffers: buffers, arrowType: ArrowType . ArrowDouble)
55
+ return makeFixedHolder ( Double . self, buffers: buffers, arrowType: ArrowType . ArrowDouble, nullCount : nullCount )
53
56
default :
54
57
return . failure( . unknownType( " Float precision \( floatType. precision) currently not supported " ) )
55
58
}
56
59
}
57
60
58
61
private func makeDateHolder( _ dateType: org_apache_arrow_flatbuf_Date ,
59
- buffers: [ ArrowBuffer ]
62
+ buffers: [ ArrowBuffer ] ,
63
+ nullCount: UInt
60
64
) -> Result < ArrowArrayHolder , ArrowError > {
61
65
do {
62
66
if dateType. unit == . day {
63
67
let arrowData = try ArrowData ( ArrowType ( ArrowType . ArrowString) , buffers: buffers,
64
- nullCount: buffers [ 0 ] . length , stride: MemoryLayout< Date> . stride)
68
+ nullCount: nullCount , stride: MemoryLayout< Date> . stride)
65
69
return . success( ArrowArrayHolder ( Date32Array ( arrowData) ) )
66
70
}
67
71
68
72
let arrowData = try ArrowData ( ArrowType ( ArrowType . ArrowString) , buffers: buffers,
69
- nullCount: buffers [ 0 ] . length , stride: MemoryLayout< Date> . stride)
73
+ nullCount: nullCount , stride: MemoryLayout< Date> . stride)
70
74
return . success( ArrowArrayHolder ( Date64Array ( arrowData) ) )
71
75
} catch let error as ArrowError {
72
76
return . failure( error)
@@ -76,19 +80,20 @@ private func makeDateHolder(_ dateType: org_apache_arrow_flatbuf_Date,
76
80
}
77
81
78
82
private func makeTimeHolder( _ timeType: org_apache_arrow_flatbuf_Time ,
79
- buffers: [ ArrowBuffer ]
83
+ buffers: [ ArrowBuffer ] ,
84
+ nullCount: UInt
80
85
) -> Result < ArrowArrayHolder , ArrowError > {
81
86
do {
82
87
if timeType. unit == . second || timeType. unit == . millisecond {
83
88
let arrowUnit : ArrowTime32Unit = timeType. unit == . second ? . seconds : . milliseconds
84
89
let arrowData = try ArrowData ( ArrowTypeTime32 ( arrowUnit) , buffers: buffers,
85
- nullCount: buffers [ 0 ] . length , stride: MemoryLayout< Time32> . stride)
90
+ nullCount: nullCount , stride: MemoryLayout< Time32> . stride)
86
91
return . success( ArrowArrayHolder ( FixedArray < Time32 > ( arrowData) ) )
87
92
}
88
93
89
94
let arrowUnit : ArrowTime64Unit = timeType. unit == . microsecond ? . microseconds : . nanoseconds
90
95
let arrowData = try ArrowData ( ArrowTypeTime64 ( arrowUnit) , buffers: buffers,
91
- nullCount: buffers [ 0 ] . length , stride: MemoryLayout< Time64> . stride)
96
+ nullCount: nullCount , stride: MemoryLayout< Time64> . stride)
92
97
return . success( ArrowArrayHolder ( FixedArray < Time64 > ( arrowData) ) )
93
98
} catch let error as ArrowError {
94
99
return . failure( error)
@@ -97,10 +102,11 @@ private func makeTimeHolder(_ timeType: org_apache_arrow_flatbuf_Time,
97
102
}
98
103
}
99
104
100
- private func makeBoolHolder( _ buffers: [ ArrowBuffer ] ) -> Result < ArrowArrayHolder , ArrowError > {
105
+ private func makeBoolHolder( _ buffers: [ ArrowBuffer ] ,
106
+ nullCount: UInt ) -> Result < ArrowArrayHolder , ArrowError > {
101
107
do {
102
108
let arrowData = try ArrowData ( ArrowType ( ArrowType . ArrowBool) , buffers: buffers,
103
- nullCount: buffers [ 0 ] . length , stride: MemoryLayout< UInt8> . stride)
109
+ nullCount: nullCount , stride: MemoryLayout< UInt8> . stride)
104
110
return . success( ArrowArrayHolder ( BoolArray ( arrowData) ) )
105
111
} catch let error as ArrowError {
106
112
return . failure( error)
@@ -111,11 +117,12 @@ private func makeBoolHolder(_ buffers: [ArrowBuffer]) -> Result<ArrowArrayHolder
111
117
112
118
private func makeFixedHolder< T> (
113
119
_: T . Type , buffers: [ ArrowBuffer ] ,
114
- arrowType: ArrowType . Info
120
+ arrowType: ArrowType . Info ,
121
+ nullCount: UInt
115
122
) -> Result < ArrowArrayHolder , ArrowError > {
116
123
do {
117
124
let arrowData = try ArrowData ( ArrowType ( arrowType) , buffers: buffers,
118
- nullCount: buffers [ 0 ] . length , stride: MemoryLayout< T> . stride)
125
+ nullCount: nullCount , stride: MemoryLayout< T> . stride)
119
126
return . success( ArrowArrayHolder ( FixedArray < T > ( arrowData) ) )
120
127
} catch let error as ArrowError {
121
128
return . failure( error)
@@ -124,9 +131,10 @@ private func makeFixedHolder<T>(
124
131
}
125
132
}
126
133
127
- func makeArrayHolder( // swiftlint:disable:this cyclomatic_complexity
134
+ func makeArrayHolder( // swiftlint:disable:this cyclomatic_complexity function_body_length
128
135
_ field: org_apache_arrow_flatbuf_Field ,
129
- buffers: [ ArrowBuffer ]
136
+ buffers: [ ArrowBuffer ] ,
137
+ nullCount: UInt
130
138
) -> Result < ArrowArrayHolder , ArrowError > {
131
139
let type = field. typeType
132
140
switch type {
@@ -135,45 +143,53 @@ func makeArrayHolder( // swiftlint:disable:this cyclomatic_complexity
135
143
let bitWidth = intType. bitWidth
136
144
if bitWidth == 8 {
137
145
if intType. isSigned {
138
- return makeFixedHolder ( Int8 . self, buffers: buffers, arrowType: ArrowType . ArrowInt8)
146
+ return makeFixedHolder ( Int8 . self, buffers: buffers,
147
+ arrowType: ArrowType . ArrowInt8, nullCount: nullCount)
139
148
} else {
140
- return makeFixedHolder ( UInt8 . self, buffers: buffers, arrowType: ArrowType . ArrowUInt8)
149
+ return makeFixedHolder ( UInt8 . self, buffers: buffers,
150
+ arrowType: ArrowType . ArrowUInt8, nullCount: nullCount)
141
151
}
142
152
} else if bitWidth == 16 {
143
153
if intType. isSigned {
144
- return makeFixedHolder ( Int16 . self, buffers: buffers, arrowType: ArrowType . ArrowInt16)
154
+ return makeFixedHolder ( Int16 . self, buffers: buffers,
155
+ arrowType: ArrowType . ArrowInt16, nullCount: nullCount)
145
156
} else {
146
- return makeFixedHolder ( UInt16 . self, buffers: buffers, arrowType: ArrowType . ArrowUInt16)
157
+ return makeFixedHolder ( UInt16 . self, buffers: buffers,
158
+ arrowType: ArrowType . ArrowUInt16, nullCount: nullCount)
147
159
}
148
160
} else if bitWidth == 32 {
149
161
if intType. isSigned {
150
- return makeFixedHolder ( Int32 . self, buffers: buffers, arrowType: ArrowType . ArrowInt32)
162
+ return makeFixedHolder ( Int32 . self, buffers: buffers,
163
+ arrowType: ArrowType . ArrowInt32, nullCount: nullCount)
151
164
} else {
152
- return makeFixedHolder ( UInt32 . self, buffers: buffers, arrowType: ArrowType . ArrowUInt32)
165
+ return makeFixedHolder ( UInt32 . self, buffers: buffers,
166
+ arrowType: ArrowType . ArrowUInt32, nullCount: nullCount)
153
167
}
154
168
} else if bitWidth == 64 {
155
169
if intType. isSigned {
156
- return makeFixedHolder ( Int64 . self, buffers: buffers, arrowType: ArrowType . ArrowInt64)
170
+ return makeFixedHolder ( Int64 . self, buffers: buffers,
171
+ arrowType: ArrowType . ArrowInt64, nullCount: nullCount)
157
172
} else {
158
- return makeFixedHolder ( UInt64 . self, buffers: buffers, arrowType: ArrowType . ArrowUInt64)
173
+ return makeFixedHolder ( UInt64 . self, buffers: buffers,
174
+ arrowType: ArrowType . ArrowUInt64, nullCount: nullCount)
159
175
}
160
176
}
161
177
return . failure( . unknownType( " Int width \( bitWidth) currently not supported " ) )
162
178
case . bool:
163
- return makeBoolHolder ( buffers)
179
+ return makeBoolHolder ( buffers, nullCount : nullCount )
164
180
case . floatingpoint:
165
181
let floatType = field. type ( type: org_apache_arrow_flatbuf_FloatingPoint. self) !
166
- return makeFloatHolder ( floatType, buffers: buffers)
182
+ return makeFloatHolder ( floatType, buffers: buffers, nullCount : nullCount )
167
183
case . utf8:
168
- return makeStringHolder ( buffers)
184
+ return makeStringHolder ( buffers, nullCount : nullCount )
169
185
case . binary:
170
- return makeBinaryHolder ( buffers)
186
+ return makeBinaryHolder ( buffers, nullCount : nullCount )
171
187
case . date:
172
188
let dateType = field. type ( type: org_apache_arrow_flatbuf_Date. self) !
173
- return makeDateHolder ( dateType, buffers: buffers)
189
+ return makeDateHolder ( dateType, buffers: buffers, nullCount : nullCount )
174
190
case . time:
175
191
let timeType = field. type ( type: org_apache_arrow_flatbuf_Time. self) !
176
- return makeTimeHolder ( timeType, buffers: buffers)
192
+ return makeTimeHolder ( timeType, buffers: buffers, nullCount : nullCount )
177
193
default :
178
194
return . failure( . unknownType( " Type \( type) currently not supported " ) )
179
195
}
0 commit comments