@@ -114,9 +114,9 @@ public class ArrowArrayHolderImpl: ArrowArrayHolder {
114
114
case . binary:
115
115
return try ArrowArrayHolderImpl ( BinaryArray ( with) )
116
116
case . strct:
117
- return try ArrowArrayHolderImpl ( StructArray ( with) )
117
+ return try ArrowArrayHolderImpl ( NestedArray ( with) )
118
118
case . list:
119
- return try ArrowArrayHolderImpl ( ListArray ( with) )
119
+ return try ArrowArrayHolderImpl ( NestedArray ( with) )
120
120
default :
121
121
throw ArrowError . invalid ( " Array not found for type: \( arrowType) " )
122
122
}
@@ -357,119 +357,121 @@ public class BinaryArray: ArrowArray<Data> {
357
357
}
358
358
}
359
359
360
- public class StructArray : ArrowArray < [ Any ? ] > {
361
- public private( set) var arrowFields : [ ArrowArrayHolder ] ?
360
+ public class NestedArray : ArrowArray < [ Any ? ] > {
361
+ private var children : [ ArrowArrayHolder ] ?
362
+
362
363
public required init ( _ arrowData: ArrowData ) throws {
363
364
try super. init ( arrowData)
364
- var fields = [ ArrowArrayHolder] ( )
365
- for child in arrowData. children {
366
- fields. append ( try ArrowArrayHolderImpl . loadArray ( child. type, with: child) )
365
+
366
+ if let listType = arrowData. type as? ArrowTypeList {
367
+ guard arrowData. children. count == 1 else {
368
+ throw ArrowError . invalid ( " List array must have exactly one child " )
369
+ }
370
+
371
+ self . children = [ try ArrowArrayHolderImpl . loadArray (
372
+ listType. elementType,
373
+ with: arrowData. children [ 0 ]
374
+ ) ]
375
+ } else {
376
+ var fields = [ ArrowArrayHolder] ( )
377
+ for child in arrowData. children {
378
+ fields. append ( try ArrowArrayHolderImpl . loadArray ( child. type, with: child) )
379
+ }
380
+ self . children = fields
367
381
}
368
-
369
- self . arrowFields = fields
370
382
}
371
-
383
+
372
384
public override subscript( _ index: UInt ) -> [ Any ? ] ? {
373
385
if self . arrowData. isNull ( index) {
374
386
return nil
375
387
}
376
-
377
- if let fields = arrowFields {
388
+
389
+ guard let children = self . children else {
390
+ return nil
391
+ }
392
+
393
+ if arrowData. type is ArrowTypeList {
394
+ guard let values = children. first else { return nil }
395
+
396
+ let offsets = self . arrowData. buffers [ 1 ]
397
+ let offsetIndex = Int ( index) * MemoryLayout< Int32> . stride
398
+
399
+ let startOffset = offsets. rawPointer. advanced ( by: offsetIndex) . load ( as: Int32 . self)
400
+ let endOffset = offsets. rawPointer. advanced ( by: offsetIndex + MemoryLayout< Int32> . stride) . load ( as: Int32 . self)
401
+
402
+ var items = [ Any? ] ( )
403
+ for i in startOffset..< endOffset {
404
+ items. append ( values. array. asAny ( UInt ( i) ) )
405
+ }
406
+
407
+ return items
408
+ } else {
378
409
var result = [ Any? ] ( )
379
- for field in fields {
410
+ for field in children {
380
411
result. append ( field. array. asAny ( index) )
381
412
}
382
-
383
413
return result
384
414
}
385
-
386
- return nil
387
415
}
388
-
416
+
389
417
public override func asString( _ index: UInt ) -> String {
418
+ let isListType = arrowData. type is ArrowTypeList
419
+
390
420
if self . arrowData. isNull ( index) {
391
- return " "
421
+ return isListType ? " null " : " "
392
422
}
393
-
394
- var output = " { "
395
- if let fields = arrowFields {
396
- for fieldIndex in 0 ..< fields. count {
397
- let asStr = fields [ fieldIndex] . array as? AsString
398
- if fieldIndex == 0 {
399
- output. append ( " \( asStr!. asString ( index) ) " )
423
+
424
+ if isListType {
425
+ guard let list = self [ index] else {
426
+ return " null "
427
+ }
428
+
429
+ var output = " [ "
430
+ for (i, item) in list. enumerated ( ) {
431
+ if i > 0 {
432
+ output. append ( " , " )
433
+ }
434
+
435
+ if item == nil {
436
+ output. append ( " null " )
437
+ } else if let asStringItem = item as? AsString {
438
+ output. append ( asStringItem. asString ( 0 ) )
400
439
} else {
401
- output. append ( " , \( asStr! . asString ( index ) ) " )
440
+ output. append ( " \( item! ) " )
402
441
}
403
442
}
443
+ output. append ( " ] " )
444
+ return output
445
+ } else {
446
+ var output = " { "
447
+ if let children = self . children {
448
+ for fieldIndex in 0 ..< children. count {
449
+ let asStr = children [ fieldIndex] . array as? AsString
450
+ if fieldIndex == 0 {
451
+ output. append ( " \( asStr!. asString ( index) ) " )
452
+ } else {
453
+ output. append ( " , \( asStr!. asString ( index) ) " )
454
+ }
455
+ }
456
+ }
457
+ output += " } "
458
+ return output
404
459
}
405
-
406
- output += " } "
407
- return output
408
460
}
409
- }
410
-
411
- public class ListArray : ArrowArray < [ Any ? ] > {
412
- public private( set) var values : ArrowArrayHolder ?
413
-
414
- public required init ( _ arrowData: ArrowData ) throws {
415
- try super. init ( arrowData)
416
- guard arrowData. children. count == 1 else {
417
- throw ArrowError . invalid ( " List array must have exactly one child " )
418
- }
419
-
420
- guard let listType = arrowData. type as? ArrowTypeList else {
421
- throw ArrowError . invalid ( " Expected ArrowTypeList " )
422
- }
423
-
424
- self . values = try ArrowArrayHolderImpl . loadArray (
425
- listType. elementType,
426
- with: arrowData. children [ 0 ]
427
- )
461
+
462
+ public var isListArray : Bool {
463
+ return arrowData. type is ArrowTypeList
428
464
}
429
-
430
- public override subscript( _ index: UInt ) -> [ Any ? ] ? {
431
- guard let values = self . values else { return nil }
432
-
433
- if self . arrowData. isNull ( index) {
434
- return nil
435
- }
436
-
437
- let offsets = self . arrowData. buffers [ 1 ]
438
- let offsetIndex = Int ( index) * MemoryLayout< Int32> . stride
439
-
440
- let startOffset = offsets. rawPointer. advanced ( by: offsetIndex) . load ( as: Int32 . self)
441
- let endOffset = offsets. rawPointer. advanced ( by: offsetIndex + MemoryLayout< Int32> . stride) . load ( as: Int32 . self)
442
-
443
- var items = [ Any? ] ( )
444
- for i in startOffset..< endOffset {
445
- items. append ( values. array. asAny ( UInt ( i) ) )
446
- }
447
-
448
- return items
465
+
466
+ public var isStructArray : Bool {
467
+ return arrowData. type is ArrowTypeStruct
449
468
}
450
-
451
- public override func asString( _ index: UInt ) -> String {
452
- guard let list = self [ index] else {
453
- return " null "
454
- }
455
-
456
- var output = " [ "
457
-
458
- for (i, item) in list. enumerated ( ) {
459
- if i > 0 {
460
- output. append ( " , " )
461
- }
462
-
463
- if item == nil {
464
- output. append ( " null " )
465
- } else if let asStringItem = item as? AsString {
466
- output. append ( asStringItem. asString ( 0 ) )
467
- } else {
468
- output. append ( " \( item!) " )
469
- }
470
- }
471
-
472
- output. append ( " ] " )
473
- return output
469
+
470
+ public var fields : [ ArrowArrayHolder ] ? {
471
+ return isStructArray ? children : nil
472
+ }
473
+
474
+ public var values : ArrowArrayHolder ? {
475
+ return isListArray ? children? . first : nil
474
476
}
475
477
}
0 commit comments