package compute
import (
"fmt"
"github.com/apache/arrow-go/v18/arrow"
"github.com/apache/arrow-go/v18/arrow/array"
"github.com/apache/arrow-go/v18/arrow/scalar"
)
type DatumKind int
const (
KindNone DatumKind = iota
KindScalar
KindArray
KindChunked
KindRecord
KindTable
)
const UnknownLength int64 = -1
func DatumIsValue (d Datum ) bool {
switch d .Kind () {
case KindScalar , KindArray , KindChunked :
return true
}
return false
}
type Datum interface {
fmt .Stringer
Kind () DatumKind
Len () int64
Equals (Datum ) bool
Release ()
data() any
}
type ArrayLikeDatum interface {
Datum
NullN () int64
Type () arrow .DataType
Chunks () []arrow .Array
}
type TableLikeDatum interface {
Datum
Schema () *arrow .Schema
}
type EmptyDatum struct {}
func (EmptyDatum ) String () string { return "nullptr" }
func (EmptyDatum ) Kind () DatumKind { return KindNone }
func (EmptyDatum ) Len () int64 { return UnknownLength }
func (EmptyDatum ) Release () {}
func (EmptyDatum ) Equals (other Datum ) bool {
_ , ok := other .(EmptyDatum )
return ok
}
func (EmptyDatum ) data () any { return nil }
type ScalarDatum struct {
Value scalar .Scalar
}
func (ScalarDatum ) Kind () DatumKind { return KindScalar }
func (ScalarDatum ) Len () int64 { return 1 }
func (ScalarDatum ) Chunks () []arrow .Array { return nil }
func (d *ScalarDatum ) Type () arrow .DataType { return d .Value .DataType () }
func (d *ScalarDatum ) String () string { return d .Value .String () }
func (d *ScalarDatum ) ToScalar () (scalar .Scalar , error ) {
return d .Value , nil
}
func (d *ScalarDatum ) data () any { return d .Value }
func (d *ScalarDatum ) NullN () int64 {
if d .Value .IsValid () {
return 0
}
return 1
}
type releasable interface {
Release()
}
func (d *ScalarDatum ) Release () {
if v , ok := d .Value .(releasable ); ok {
v .Release ()
}
}
func (d *ScalarDatum ) Equals (other Datum ) bool {
if rhs , ok := other .(*ScalarDatum ); ok {
return scalar .Equals (d .Value , rhs .Value )
}
return false
}
type ArrayDatum struct {
Value arrow .ArrayData
}
func (ArrayDatum ) Kind () DatumKind { return KindArray }
func (d *ArrayDatum ) Type () arrow .DataType { return d .Value .DataType () }
func (d *ArrayDatum ) Len () int64 { return int64 (d .Value .Len ()) }
func (d *ArrayDatum ) NullN () int64 { return int64 (d .Value .NullN ()) }
func (d *ArrayDatum ) String () string { return fmt .Sprintf ("Array:{%s}" , d .Value .DataType ()) }
func (d *ArrayDatum ) MakeArray () arrow .Array { return array .MakeFromData (d .Value ) }
func (d *ArrayDatum ) Chunks () []arrow .Array { return []arrow .Array {d .MakeArray ()} }
func (d *ArrayDatum ) ToScalar () (scalar .Scalar , error ) {
return scalar .NewListScalarData (d .Value ), nil
}
func (d *ArrayDatum ) Release () {
d .Value .Release ()
d .Value = nil
}
func (d *ArrayDatum ) data () any { return d .Value }
func (d *ArrayDatum ) Equals (other Datum ) bool {
rhs , ok := other .(*ArrayDatum )
if !ok {
return false
}
left := d .MakeArray ()
defer left .Release ()
right := rhs .MakeArray ()
defer right .Release ()
return array .Equal (left , right )
}
type ChunkedDatum struct {
Value *arrow .Chunked
}
func (ChunkedDatum ) Kind () DatumKind { return KindChunked }
func (d *ChunkedDatum ) Type () arrow .DataType { return d .Value .DataType () }
func (d *ChunkedDatum ) Len () int64 { return int64 (d .Value .Len ()) }
func (d *ChunkedDatum ) NullN () int64 { return int64 (d .Value .NullN ()) }
func (d *ChunkedDatum ) String () string { return fmt .Sprintf ("Array:{%s}" , d .Value .DataType ()) }
func (d *ChunkedDatum ) Chunks () []arrow .Array { return d .Value .Chunks () }
func (d *ChunkedDatum ) data () any { return d .Value }
func (d *ChunkedDatum ) Release () {
d .Value .Release ()
d .Value = nil
}
func (d *ChunkedDatum ) Equals (other Datum ) bool {
if rhs , ok := other .(*ChunkedDatum ); ok {
return array .ChunkedEqual (d .Value , rhs .Value )
}
return false
}
type RecordDatum struct {
Value arrow .RecordBatch
}
func (RecordDatum ) Kind () DatumKind { return KindRecord }
func (RecordDatum ) String () string { return "RecordBatch" }
func (r *RecordDatum ) Len () int64 { return r .Value .NumRows () }
func (r *RecordDatum ) Schema () *arrow .Schema { return r .Value .Schema () }
func (r *RecordDatum ) data () any { return r .Value }
func (r *RecordDatum ) Release () {
r .Value .Release ()
r .Value = nil
}
func (r *RecordDatum ) Equals (other Datum ) bool {
if rhs , ok := other .(*RecordDatum ); ok {
return array .RecordEqual (r .Value , rhs .Value )
}
return false
}
type TableDatum struct {
Value arrow .Table
}
func (TableDatum ) Kind () DatumKind { return KindTable }
func (TableDatum ) String () string { return "Table" }
func (d *TableDatum ) Len () int64 { return d .Value .NumRows () }
func (d *TableDatum ) Schema () *arrow .Schema { return d .Value .Schema () }
func (d *TableDatum ) data () any { return d .Value }
func (d *TableDatum ) Release () {
d .Value .Release ()
d .Value = nil
}
func (d *TableDatum ) Equals (other Datum ) bool {
if rhs , ok := other .(*TableDatum ); ok {
return array .TableEqual (d .Value , rhs .Value )
}
return false
}
func NewDatum (value interface {}) Datum {
switch v := value .(type ) {
case Datum :
return NewDatum (v .data ())
case arrow .Array :
v .Data ().Retain ()
return &ArrayDatum {v .Data ()}
case scalar .Releasable :
v .Retain ()
return NewDatumWithoutOwning (v )
case scalar .Scalar :
return &ScalarDatum {v }
default :
return &ScalarDatum {scalar .MakeScalar (value )}
}
}
func NewDatumWithoutOwning (value interface {}) Datum {
switch v := value .(type ) {
case arrow .Array :
return &ArrayDatum {v .Data ()}
case arrow .ArrayData :
return &ArrayDatum {v }
case *arrow .Chunked :
return &ChunkedDatum {v }
case arrow .RecordBatch :
return &RecordDatum {v }
case arrow .Table :
return &TableDatum {v }
case scalar .Scalar :
return &ScalarDatum {v }
default :
return &ScalarDatum {scalar .MakeScalar (value )}
}
}
var (
_ ArrayLikeDatum = (*ScalarDatum )(nil )
_ ArrayLikeDatum = (*ArrayDatum )(nil )
_ ArrayLikeDatum = (*ChunkedDatum )(nil )
_ TableLikeDatum = (*RecordDatum )(nil )
_ TableLikeDatum = (*TableDatum )(nil )
)
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .