Skip to content

Commit 11bcde2

Browse files
authored
ARROW-17588: [Go] Casting to binary-like types (apache#14027)
Authored-by: Matt Topol <zotthewizard@gmail.com> Signed-off-by: Matt Topol <zotthewizard@gmail.com>
1 parent 413e493 commit 11bcde2

11 files changed

Lines changed: 849 additions & 25 deletions

File tree

go/arrow/array/string.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -482,9 +482,17 @@ func (b *LargeStringBuilder) UnmarshalJSON(data []byte) error {
482482
return b.unmarshal(dec)
483483
}
484484

485+
type StringLikeBuilder interface {
486+
Builder
487+
Append(string)
488+
ReserveData(int)
489+
}
490+
485491
var (
486-
_ arrow.Array = (*String)(nil)
487-
_ arrow.Array = (*LargeString)(nil)
488-
_ Builder = (*StringBuilder)(nil)
489-
_ Builder = (*LargeStringBuilder)(nil)
492+
_ arrow.Array = (*String)(nil)
493+
_ arrow.Array = (*LargeString)(nil)
494+
_ Builder = (*StringBuilder)(nil)
495+
_ Builder = (*LargeStringBuilder)(nil)
496+
_ StringLikeBuilder = (*StringBuilder)(nil)
497+
_ StringLikeBuilder = (*LargeStringBuilder)(nil)
490498
)

go/arrow/compute/cast.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ func initCastTable() {
163163
castTable = make(map[arrow.Type]*castFunction)
164164
addCastFuncs(getBooleanCasts())
165165
addCastFuncs(getNumericCasts())
166+
addCastFuncs(getBinaryLikeCasts())
166167
addCastFuncs(getTemporalCasts())
167168
}
168169

@@ -273,6 +274,27 @@ func getNumericCasts() []*castFunction {
273274
return out
274275
}
275276

277+
func getBinaryLikeCasts() []*castFunction {
278+
out := make([]*castFunction, 0)
279+
280+
addFn := func(name string, ty arrow.Type, kns []exec.ScalarKernel) {
281+
fn := newCastFunction(name, ty)
282+
for _, k := range kns {
283+
if err := fn.AddTypeCast(k.Signature.InputTypes[0].MatchID(), k); err != nil {
284+
panic(err)
285+
}
286+
}
287+
out = append(out, fn)
288+
}
289+
290+
addFn("cast_binary", arrow.BINARY, kernels.GetToBinaryKernels(arrow.BinaryTypes.Binary))
291+
addFn("cast_large_binary", arrow.LARGE_BINARY, kernels.GetToBinaryKernels(arrow.BinaryTypes.LargeBinary))
292+
addFn("cast_string", arrow.STRING, kernels.GetToBinaryKernels(arrow.BinaryTypes.String))
293+
addFn("cast_large_string", arrow.LARGE_STRING, kernels.GetToBinaryKernels(arrow.BinaryTypes.LargeString))
294+
addFn("cast_fixed_sized_binary", arrow.FIXED_SIZE_BINARY, kernels.GetFsbCastKernels())
295+
return out
296+
}
297+
276298
// CastDatum is a convenience function for casting a Datum to another type.
277299
// It is equivalent to calling CallFunction(ctx, "cast", opts, Datum) and
278300
// should work for Scalar, Array or ChunkedArray Datums.

0 commit comments

Comments
 (0)