package array
import (
"sync/atomic"
"github.com/apache/arrow-go/v18/arrow"
"github.com/apache/arrow-go/v18/arrow/bitutil"
"github.com/apache/arrow-go/v18/arrow/internal/debug"
)
const (
UnknownNullCount = -1
NullValueStr = "(null)"
)
type array struct {
refCount atomic .Int64
data *Data
nullBitmapBytes []byte
}
func (a *array ) Retain () {
a .refCount .Add (1 )
}
func (a *array ) Release () {
debug .Assert (a .refCount .Load () > 0 , "too many releases" )
if a .refCount .Add (-1 ) == 0 {
a .data .Release ()
a .data , a .nullBitmapBytes = nil , nil
}
}
func (a *array ) DataType () arrow .DataType { return a .data .dtype }
func (a *array ) NullN () int {
if a .data .nulls < 0 {
a .data .nulls = a .data .length - bitutil .CountSetBits (a .nullBitmapBytes , a .data .offset , a .data .length )
}
return a .data .nulls
}
func (a *array ) NullBitmapBytes () []byte { return a .nullBitmapBytes }
func (a *array ) Data () arrow .ArrayData { return a .data }
func (a *array ) Len () int { return a .data .length }
func (a *array ) IsNull (i int ) bool {
return len (a .nullBitmapBytes ) != 0 && bitutil .BitIsNotSet (a .nullBitmapBytes , a .data .offset +i )
}
func (a *array ) IsValid (i int ) bool {
return len (a .nullBitmapBytes ) == 0 || bitutil .BitIsSet (a .nullBitmapBytes , a .data .offset +i )
}
func (a *array ) setData (data *Data ) {
data .Retain ()
if a .data != nil {
a .data .Release ()
}
if len (data .buffers ) > 0 && data .buffers [0 ] != nil {
a .nullBitmapBytes = data .buffers [0 ].Bytes ()
}
a .data = data
}
func (a *array ) Offset () int {
return a .data .Offset ()
}
type arrayConstructorFn func (arrow .ArrayData ) arrow .Array
var makeArrayFn [64 ]arrayConstructorFn
func invalidDataType(data arrow .ArrayData ) arrow .Array {
panic ("invalid data type: " + data .DataType ().ID ().String ())
}
func MakeFromData (data arrow .ArrayData ) arrow .Array {
return makeArrayFn [byte (data .DataType ().ID ()&0x3f )](data )
}
func NewSlice (arr arrow .Array , i , j int64 ) arrow .Array {
data := NewSliceData (arr .Data (), i , j )
slice := MakeFromData (data )
data .Release ()
return slice
}
func init() {
makeArrayFn = [...]arrayConstructorFn {
arrow .NULL : func (data arrow .ArrayData ) arrow .Array { return NewNullData (data ) },
arrow .BOOL : func (data arrow .ArrayData ) arrow .Array { return NewBooleanData (data ) },
arrow .UINT8 : func (data arrow .ArrayData ) arrow .Array { return NewUint8Data (data ) },
arrow .INT8 : func (data arrow .ArrayData ) arrow .Array { return NewInt8Data (data ) },
arrow .UINT16 : func (data arrow .ArrayData ) arrow .Array { return NewUint16Data (data ) },
arrow .INT16 : func (data arrow .ArrayData ) arrow .Array { return NewInt16Data (data ) },
arrow .UINT32 : func (data arrow .ArrayData ) arrow .Array { return NewUint32Data (data ) },
arrow .INT32 : func (data arrow .ArrayData ) arrow .Array { return NewInt32Data (data ) },
arrow .UINT64 : func (data arrow .ArrayData ) arrow .Array { return NewUint64Data (data ) },
arrow .INT64 : func (data arrow .ArrayData ) arrow .Array { return NewInt64Data (data ) },
arrow .FLOAT16 : func (data arrow .ArrayData ) arrow .Array { return NewFloat16Data (data ) },
arrow .FLOAT32 : func (data arrow .ArrayData ) arrow .Array { return NewFloat32Data (data ) },
arrow .FLOAT64 : func (data arrow .ArrayData ) arrow .Array { return NewFloat64Data (data ) },
arrow .STRING : func (data arrow .ArrayData ) arrow .Array { return NewStringData (data ) },
arrow .BINARY : func (data arrow .ArrayData ) arrow .Array { return NewBinaryData (data ) },
arrow .FIXED_SIZE_BINARY : func (data arrow .ArrayData ) arrow .Array { return NewFixedSizeBinaryData (data ) },
arrow .DATE32 : func (data arrow .ArrayData ) arrow .Array { return NewDate32Data (data ) },
arrow .DATE64 : func (data arrow .ArrayData ) arrow .Array { return NewDate64Data (data ) },
arrow .TIMESTAMP : func (data arrow .ArrayData ) arrow .Array { return NewTimestampData (data ) },
arrow .TIME32 : func (data arrow .ArrayData ) arrow .Array { return NewTime32Data (data ) },
arrow .TIME64 : func (data arrow .ArrayData ) arrow .Array { return NewTime64Data (data ) },
arrow .INTERVAL_MONTHS : func (data arrow .ArrayData ) arrow .Array { return NewMonthIntervalData (data ) },
arrow .INTERVAL_DAY_TIME : func (data arrow .ArrayData ) arrow .Array { return NewDayTimeIntervalData (data ) },
arrow .DECIMAL32 : func (data arrow .ArrayData ) arrow .Array { return NewDecimal32Data (data ) },
arrow .DECIMAL64 : func (data arrow .ArrayData ) arrow .Array { return NewDecimal64Data (data ) },
arrow .DECIMAL128 : func (data arrow .ArrayData ) arrow .Array { return NewDecimal128Data (data ) },
arrow .DECIMAL256 : func (data arrow .ArrayData ) arrow .Array { return NewDecimal256Data (data ) },
arrow .LIST : func (data arrow .ArrayData ) arrow .Array { return NewListData (data ) },
arrow .STRUCT : func (data arrow .ArrayData ) arrow .Array { return NewStructData (data ) },
arrow .SPARSE_UNION : func (data arrow .ArrayData ) arrow .Array { return NewSparseUnionData (data ) },
arrow .DENSE_UNION : func (data arrow .ArrayData ) arrow .Array { return NewDenseUnionData (data ) },
arrow .DICTIONARY : func (data arrow .ArrayData ) arrow .Array { return NewDictionaryData (data ) },
arrow .MAP : func (data arrow .ArrayData ) arrow .Array { return NewMapData (data ) },
arrow .EXTENSION : func (data arrow .ArrayData ) arrow .Array { return NewExtensionData (data ) },
arrow .FIXED_SIZE_LIST : func (data arrow .ArrayData ) arrow .Array { return NewFixedSizeListData (data ) },
arrow .DURATION : func (data arrow .ArrayData ) arrow .Array { return NewDurationData (data ) },
arrow .LARGE_STRING : func (data arrow .ArrayData ) arrow .Array { return NewLargeStringData (data ) },
arrow .LARGE_BINARY : func (data arrow .ArrayData ) arrow .Array { return NewLargeBinaryData (data ) },
arrow .LARGE_LIST : func (data arrow .ArrayData ) arrow .Array { return NewLargeListData (data ) },
arrow .INTERVAL_MONTH_DAY_NANO : func (data arrow .ArrayData ) arrow .Array { return NewMonthDayNanoIntervalData (data ) },
arrow .RUN_END_ENCODED : func (data arrow .ArrayData ) arrow .Array { return NewRunEndEncodedData (data ) },
arrow .LIST_VIEW : func (data arrow .ArrayData ) arrow .Array { return NewListViewData (data ) },
arrow .LARGE_LIST_VIEW : func (data arrow .ArrayData ) arrow .Array { return NewLargeListViewData (data ) },
arrow .BINARY_VIEW : func (data arrow .ArrayData ) arrow .Array { return NewBinaryViewData (data ) },
arrow .STRING_VIEW : func (data arrow .ArrayData ) arrow .Array { return NewStringViewData (data ) },
63 : invalidDataType ,
}
}
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 .