@@ -25,6 +25,7 @@ public typealias Time64 = Int64
25
25
public typealias Date32 = Int32
26
26
/// @nodoc
27
27
public typealias Date64 = Int64
28
+ public typealias Timestamp = Int64
28
29
29
30
func FlatBuffersVersion_23_1_4( ) { // swiftlint:disable:this identifier_name
30
31
}
@@ -70,6 +71,7 @@ public enum ArrowTypeId: Sendable, Equatable {
70
71
case strct
71
72
case time32
72
73
case time64
74
+ case timestamp
73
75
case time
74
76
case uint16
75
77
case uint32
@@ -146,6 +148,47 @@ public class ArrowTypeDecimal128: ArrowType {
146
148
}
147
149
}
148
150
151
+ public enum ArrowTimestampUnit {
152
+ case seconds
153
+ case milliseconds
154
+ case microseconds
155
+ case nanoseconds
156
+ }
157
+
158
+ public class ArrowTypeTimestamp : ArrowType {
159
+ let unit : ArrowTimestampUnit
160
+ let timezone : String ?
161
+
162
+ public init ( _ unit: ArrowTimestampUnit , timezone: String ? = nil ) {
163
+ self . unit = unit
164
+ self . timezone = timezone
165
+
166
+ super. init ( ArrowType . ArrowTimestamp)
167
+ }
168
+
169
+ public convenience init ( type: ArrowTypeId ) {
170
+ self . init ( . milliseconds, timezone: nil )
171
+ }
172
+
173
+ public override var cDataFormatId : String {
174
+ get throws {
175
+ let unitChar : String
176
+ switch self . unit {
177
+ case . seconds: unitChar = " s "
178
+ case . milliseconds: unitChar = " m "
179
+ case . microseconds: unitChar = " u "
180
+ case . nanoseconds: unitChar = " n "
181
+ }
182
+
183
+ if let timezone = self . timezone {
184
+ return " ts \( unitChar) : \( timezone) "
185
+ } else {
186
+ return " ts \( unitChar) "
187
+ }
188
+ }
189
+ }
190
+ }
191
+
149
192
/// @nodoc
150
193
public class ArrowNestedType : ArrowType {
151
194
let fields : [ ArrowField ]
@@ -177,6 +220,7 @@ public class ArrowType {
177
220
public static let ArrowBinary = Info . variableInfo ( ArrowTypeId . binary)
178
221
public static let ArrowTime32 = Info . timeInfo ( ArrowTypeId . time32)
179
222
public static let ArrowTime64 = Info . timeInfo ( ArrowTypeId . time64)
223
+ public static let ArrowTimestamp = Info . timeInfo ( ArrowTypeId . timestamp)
180
224
public static let ArrowStruct = Info . complexInfo ( ArrowTypeId . strct)
181
225
182
226
public init ( _ info: ArrowType . Info ) {
@@ -305,6 +349,8 @@ public class ArrowType {
305
349
return MemoryLayout< Time32> . stride
306
350
case . time64:
307
351
return MemoryLayout< Time64> . stride
352
+ case . timestamp:
353
+ return MemoryLayout< Timestamp> . stride
308
354
case . binary:
309
355
return MemoryLayout< Int8> . stride
310
356
case . string:
@@ -357,6 +403,11 @@ public class ArrowType {
357
403
return try time64. cDataFormatId
358
404
}
359
405
return " ttu "
406
+ case ArrowTypeId . timestamp:
407
+ if let timestamp = self as? ArrowTypeTimestamp {
408
+ return try timestamp. cDataFormatId
409
+ }
410
+ return " tsu "
360
411
case ArrowTypeId . binary:
361
412
return " z "
362
413
case ArrowTypeId . string:
@@ -409,6 +460,27 @@ public class ArrowType {
409
460
return ArrowTypeTime64 ( . microseconds)
410
461
} else if from == " ttn " {
411
462
return ArrowTypeTime64 ( . nanoseconds)
463
+ } else if from. starts ( with: " ts " ) {
464
+ let components = from. split ( separator: " : " , maxSplits: 1 )
465
+ guard let unitPart = components. first, unitPart. count == 3 else {
466
+ throw ArrowError . invalid (
467
+ " Invalid timestamp format ' \( from) '. Expected format 'ts[s|m|u|n][:timezone]' " )
468
+ }
469
+
470
+ let unitChar = unitPart. suffix ( 1 )
471
+ let unit : ArrowTimestampUnit
472
+ switch unitChar {
473
+ case " s " : unit = . seconds
474
+ case " m " : unit = . milliseconds
475
+ case " u " : unit = . microseconds
476
+ case " n " : unit = . nanoseconds
477
+ default :
478
+ throw ArrowError . invalid (
479
+ " Unrecognized timestamp unit ' \( unitChar) '. Expected 's', 'm', 'u', or 'n'. " )
480
+ }
481
+
482
+ let timezone = components. count > 1 ? String ( components [ 1 ] ) : nil
483
+ return ArrowTypeTimestamp ( unit, timezone: timezone)
412
484
} else if from == " z " {
413
485
return ArrowType ( ArrowType . ArrowBinary)
414
486
} else if from == " u " {
0 commit comments