Skip to content

Commit

Permalink
ARROW-17588: [Go] Casting to binary-like types (apache#14027)
Browse files Browse the repository at this point in the history
Authored-by: Matt Topol <zotthewizard@gmail.com>
Signed-off-by: Matt Topol <zotthewizard@gmail.com>
  • Loading branch information
zeroshade authored and zagto committed Oct 7, 2022
1 parent 74df9f7 commit 329a56d
Show file tree
Hide file tree
Showing 11 changed files with 849 additions and 25 deletions.
16 changes: 12 additions & 4 deletions go/arrow/array/string.go
Original file line number Diff line number Diff line change
Expand Up @@ -482,9 +482,17 @@ func (b *LargeStringBuilder) UnmarshalJSON(data []byte) error {
return b.unmarshal(dec)
}

type StringLikeBuilder interface {
Builder
Append(string)
ReserveData(int)
}

var (
_ arrow.Array = (*String)(nil)
_ arrow.Array = (*LargeString)(nil)
_ Builder = (*StringBuilder)(nil)
_ Builder = (*LargeStringBuilder)(nil)
_ arrow.Array = (*String)(nil)
_ arrow.Array = (*LargeString)(nil)
_ Builder = (*StringBuilder)(nil)
_ Builder = (*LargeStringBuilder)(nil)
_ StringLikeBuilder = (*StringBuilder)(nil)
_ StringLikeBuilder = (*LargeStringBuilder)(nil)
)
22 changes: 22 additions & 0 deletions go/arrow/compute/cast.go
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,7 @@ func initCastTable() {
castTable = make(map[arrow.Type]*castFunction)
addCastFuncs(getBooleanCasts())
addCastFuncs(getNumericCasts())
addCastFuncs(getBinaryLikeCasts())
addCastFuncs(getTemporalCasts())
}

Expand Down Expand Up @@ -273,6 +274,27 @@ func getNumericCasts() []*castFunction {
return out
}

func getBinaryLikeCasts() []*castFunction {
out := make([]*castFunction, 0)

addFn := func(name string, ty arrow.Type, kns []exec.ScalarKernel) {
fn := newCastFunction(name, ty)
for _, k := range kns {
if err := fn.AddTypeCast(k.Signature.InputTypes[0].MatchID(), k); err != nil {
panic(err)
}
}
out = append(out, fn)
}

addFn("cast_binary", arrow.BINARY, kernels.GetToBinaryKernels(arrow.BinaryTypes.Binary))
addFn("cast_large_binary", arrow.LARGE_BINARY, kernels.GetToBinaryKernels(arrow.BinaryTypes.LargeBinary))
addFn("cast_string", arrow.STRING, kernels.GetToBinaryKernels(arrow.BinaryTypes.String))
addFn("cast_large_string", arrow.LARGE_STRING, kernels.GetToBinaryKernels(arrow.BinaryTypes.LargeString))
addFn("cast_fixed_sized_binary", arrow.FIXED_SIZE_BINARY, kernels.GetFsbCastKernels())
return out
}

// CastDatum is a convenience function for casting a Datum to another type.
// It is equivalent to calling CallFunction(ctx, "cast", opts, Datum) and
// should work for Scalar, Array or ChunkedArray Datums.
Expand Down
Loading

0 comments on commit 329a56d

Please sign in to comment.