Skip to content

Commit f918093

Browse files
authored
refactor(arrow/array): replace some codegen with generics (#315)
### Rationale for this change Simplifying code and removing old code-gen ### What changes are included in this PR? Replacing the old `numeric.gen.go` and `numeric.gen.go.tmpl` with a new version built using go generics. ### Are these changes tested? All the same unit tests will test the new versions of the objects ### Are there any user-facing changes? There shouldn't be any user-facing changes. Everything was designed to avoid any public breaking changes.
1 parent d493460 commit f918093

File tree

12 files changed

+483
-1694
lines changed

12 files changed

+483
-1694
lines changed

arrow/array.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,3 +127,15 @@ type Array interface {
127127
// When the reference count goes to zero, the memory is freed.
128128
Release()
129129
}
130+
131+
// ValueType is a generic constraint for valid Arrow primitive types
132+
type ValueType interface {
133+
bool | FixedWidthType | string | []byte
134+
}
135+
136+
// TypedArray is an interface representing an Array of a particular type
137+
// allowing for easy propagation of generics
138+
type TypedArray[T ValueType] interface {
139+
Array
140+
Value(int) T
141+
}

arrow/array/binary.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -450,4 +450,8 @@ var (
450450

451451
_ BinaryLike = (*Binary)(nil)
452452
_ BinaryLike = (*LargeBinary)(nil)
453+
454+
_ arrow.TypedArray[[]byte] = (*Binary)(nil)
455+
_ arrow.TypedArray[[]byte] = (*LargeBinary)(nil)
456+
_ arrow.TypedArray[[]byte] = (*BinaryView)(nil)
453457
)

arrow/array/boolean.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,5 +122,6 @@ func arrayEqualBoolean(left, right *Boolean) bool {
122122
}
123123

124124
var (
125-
_ arrow.Array = (*Boolean)(nil)
125+
_ arrow.Array = (*Boolean)(nil)
126+
_ arrow.TypedArray[bool] = (*Boolean)(nil)
126127
)

arrow/array/compare.go

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -240,37 +240,37 @@ func Equal(left, right arrow.Array) bool {
240240
return arrayEqualStringView(l, r)
241241
case *Int8:
242242
r := right.(*Int8)
243-
return arrayEqualInt8(l, r)
243+
return arrayEqualFixedWidth(l, r)
244244
case *Int16:
245245
r := right.(*Int16)
246-
return arrayEqualInt16(l, r)
246+
return arrayEqualFixedWidth(l, r)
247247
case *Int32:
248248
r := right.(*Int32)
249-
return arrayEqualInt32(l, r)
249+
return arrayEqualFixedWidth(l, r)
250250
case *Int64:
251251
r := right.(*Int64)
252-
return arrayEqualInt64(l, r)
252+
return arrayEqualFixedWidth(l, r)
253253
case *Uint8:
254254
r := right.(*Uint8)
255-
return arrayEqualUint8(l, r)
255+
return arrayEqualFixedWidth(l, r)
256256
case *Uint16:
257257
r := right.(*Uint16)
258-
return arrayEqualUint16(l, r)
258+
return arrayEqualFixedWidth(l, r)
259259
case *Uint32:
260260
r := right.(*Uint32)
261-
return arrayEqualUint32(l, r)
261+
return arrayEqualFixedWidth(l, r)
262262
case *Uint64:
263263
r := right.(*Uint64)
264-
return arrayEqualUint64(l, r)
264+
return arrayEqualFixedWidth(l, r)
265265
case *Float16:
266266
r := right.(*Float16)
267-
return arrayEqualFloat16(l, r)
267+
return arrayEqualFixedWidth(l, r)
268268
case *Float32:
269269
r := right.(*Float32)
270-
return arrayEqualFloat32(l, r)
270+
return arrayEqualFixedWidth(l, r)
271271
case *Float64:
272272
r := right.(*Float64)
273-
return arrayEqualFloat64(l, r)
273+
return arrayEqualFixedWidth(l, r)
274274
case *Decimal32:
275275
r := right.(*Decimal32)
276276
return arrayEqualDecimal(l, r)
@@ -285,16 +285,16 @@ func Equal(left, right arrow.Array) bool {
285285
return arrayEqualDecimal(l, r)
286286
case *Date32:
287287
r := right.(*Date32)
288-
return arrayEqualDate32(l, r)
288+
return arrayEqualFixedWidth(l, r)
289289
case *Date64:
290290
r := right.(*Date64)
291-
return arrayEqualDate64(l, r)
291+
return arrayEqualFixedWidth(l, r)
292292
case *Time32:
293293
r := right.(*Time32)
294-
return arrayEqualTime32(l, r)
294+
return arrayEqualFixedWidth(l, r)
295295
case *Time64:
296296
r := right.(*Time64)
297-
return arrayEqualTime64(l, r)
297+
return arrayEqualFixedWidth(l, r)
298298
case *Timestamp:
299299
r := right.(*Timestamp)
300300
return arrayEqualTimestamp(l, r)
@@ -327,7 +327,7 @@ func Equal(left, right arrow.Array) bool {
327327
return arrayEqualMonthDayNanoInterval(l, r)
328328
case *Duration:
329329
r := right.(*Duration)
330-
return arrayEqualDuration(l, r)
330+
return arrayEqualFixedWidth(l, r)
331331
case *Map:
332332
r := right.(*Map)
333333
return arrayEqualMap(l, r)
@@ -502,28 +502,28 @@ func arrayApproxEqual(left, right arrow.Array, opt equalOption) bool {
502502
return arrayApproxEqualStringView(l, r)
503503
case *Int8:
504504
r := right.(*Int8)
505-
return arrayEqualInt8(l, r)
505+
return arrayEqualFixedWidth(l, r)
506506
case *Int16:
507507
r := right.(*Int16)
508-
return arrayEqualInt16(l, r)
508+
return arrayEqualFixedWidth(l, r)
509509
case *Int32:
510510
r := right.(*Int32)
511-
return arrayEqualInt32(l, r)
511+
return arrayEqualFixedWidth(l, r)
512512
case *Int64:
513513
r := right.(*Int64)
514-
return arrayEqualInt64(l, r)
514+
return arrayEqualFixedWidth(l, r)
515515
case *Uint8:
516516
r := right.(*Uint8)
517-
return arrayEqualUint8(l, r)
517+
return arrayEqualFixedWidth(l, r)
518518
case *Uint16:
519519
r := right.(*Uint16)
520-
return arrayEqualUint16(l, r)
520+
return arrayEqualFixedWidth(l, r)
521521
case *Uint32:
522522
r := right.(*Uint32)
523-
return arrayEqualUint32(l, r)
523+
return arrayEqualFixedWidth(l, r)
524524
case *Uint64:
525525
r := right.(*Uint64)
526-
return arrayEqualUint64(l, r)
526+
return arrayEqualFixedWidth(l, r)
527527
case *Float16:
528528
r := right.(*Float16)
529529
return arrayApproxEqualFloat16(l, r, opt)
@@ -547,16 +547,16 @@ func arrayApproxEqual(left, right arrow.Array, opt equalOption) bool {
547547
return arrayEqualDecimal(l, r)
548548
case *Date32:
549549
r := right.(*Date32)
550-
return arrayEqualDate32(l, r)
550+
return arrayEqualFixedWidth(l, r)
551551
case *Date64:
552552
r := right.(*Date64)
553-
return arrayEqualDate64(l, r)
553+
return arrayEqualFixedWidth(l, r)
554554
case *Time32:
555555
r := right.(*Time32)
556-
return arrayEqualTime32(l, r)
556+
return arrayEqualFixedWidth(l, r)
557557
case *Time64:
558558
r := right.(*Time64)
559-
return arrayEqualTime64(l, r)
559+
return arrayEqualFixedWidth(l, r)
560560
case *Timestamp:
561561
r := right.(*Timestamp)
562562
return arrayEqualTimestamp(l, r)
@@ -589,7 +589,7 @@ func arrayApproxEqual(left, right arrow.Array, opt equalOption) bool {
589589
return arrayEqualMonthDayNanoInterval(l, r)
590590
case *Duration:
591591
r := right.(*Duration)
592-
return arrayEqualDuration(l, r)
592+
return arrayEqualFixedWidth(l, r)
593593
case *Map:
594594
r := right.(*Map)
595595
if opt.unorderedMapKeys {

arrow/array/decimal.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,4 +429,9 @@ var (
429429
_ Builder = (*Decimal64Builder)(nil)
430430
_ Builder = (*Decimal128Builder)(nil)
431431
_ Builder = (*Decimal256Builder)(nil)
432+
433+
_ arrow.TypedArray[decimal.Decimal32] = (*Decimal32)(nil)
434+
_ arrow.TypedArray[decimal.Decimal64] = (*Decimal64)(nil)
435+
_ arrow.TypedArray[decimal.Decimal128] = (*Decimal128)(nil)
436+
_ arrow.TypedArray[decimal.Decimal256] = (*Decimal256)(nil)
432437
)

arrow/array/float16.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,5 +119,6 @@ func arrayEqualFloat16(left, right *Float16) bool {
119119
}
120120

121121
var (
122-
_ arrow.Array = (*Float16)(nil)
122+
_ arrow.Array = (*Float16)(nil)
123+
_ arrow.TypedArray[float16.Num] = (*Float16)(nil)
123124
)

arrow/array/interval.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -950,4 +950,8 @@ var (
950950
_ Builder = (*MonthIntervalBuilder)(nil)
951951
_ Builder = (*DayTimeIntervalBuilder)(nil)
952952
_ Builder = (*MonthDayNanoIntervalBuilder)(nil)
953+
954+
_ arrow.TypedArray[arrow.MonthInterval] = (*MonthInterval)(nil)
955+
_ arrow.TypedArray[arrow.DayTimeInterval] = (*DayTimeInterval)(nil)
956+
_ arrow.TypedArray[arrow.MonthDayNanoInterval] = (*MonthDayNanoInterval)(nil)
953957
)

0 commit comments

Comments
 (0)