package array
import (
"bytes"
"fmt"
"reflect"
"strings"
"github.com/apache/arrow-go/v18/arrow"
"github.com/apache/arrow-go/v18/arrow/internal/debug"
"github.com/apache/arrow-go/v18/arrow/memory"
"github.com/apache/arrow-go/v18/internal/json"
)
type Null struct {
array
}
func NewNull (n int ) *Null {
a := &Null {}
a .refCount .Add (1 )
data := NewData (
arrow .Null , n ,
[]*memory .Buffer {nil },
nil ,
n ,
0 ,
)
a .setData (data )
data .Release ()
return a
}
func NewNullData (data arrow .ArrayData ) *Null {
a := &Null {}
a .refCount .Add (1 )
a .setData (data .(*Data ))
return a
}
func (a *Null ) ValueStr (int ) string { return NullValueStr }
func (a *Null ) Value (int ) interface {} { return nil }
func (a *Null ) String () string {
o := new (strings .Builder )
o .WriteString ("[" )
for i := 0 ; i < a .Len (); i ++ {
if i > 0 {
o .WriteString (" " )
}
o .WriteString (NullValueStr )
}
o .WriteString ("]" )
return o .String ()
}
func (a *Null ) setData (data *Data ) {
a .array .setData (data )
a .nullBitmapBytes = nil
a .data .nulls = a .data .length
}
func (a *Null ) GetOneForMarshal (i int ) interface {} {
return nil
}
func (a *Null ) MarshalJSON () ([]byte , error ) {
return json .Marshal (make ([]interface {}, a .Len ()))
}
type NullBuilder struct {
builder
}
func NewNullBuilder (mem memory .Allocator ) *NullBuilder {
nb := &NullBuilder {builder : builder {mem : mem }}
nb .refCount .Add (1 )
return nb
}
func (b *NullBuilder ) Type () arrow .DataType { return arrow .Null }
func (b *NullBuilder ) Release () {
debug .Assert (b .refCount .Load () > 0 , "too many releases" )
if b .refCount .Add (-1 ) == 0 {
if b .nullBitmap != nil {
b .nullBitmap .Release ()
b .nullBitmap = nil
}
}
}
func (b *NullBuilder ) AppendNull () {
b .length ++
b .nulls ++
}
func (b *NullBuilder ) AppendNulls (n int ) {
for i := 0 ; i < n ; i ++ {
b .AppendNull ()
}
}
func (b *NullBuilder ) AppendValueFromString (s string ) error {
if s == NullValueStr {
b .AppendNull ()
return nil
}
return fmt .Errorf ("cannot convert %q to null" , s )
}
func (b *NullBuilder ) AppendEmptyValue () { b .AppendNull () }
func (b *NullBuilder ) AppendEmptyValues (n int ) { b .AppendNulls (n ) }
func (*NullBuilder ) Reserve (size int ) {}
func (*NullBuilder ) Resize (size int ) {}
func (*NullBuilder ) init (cap int ) {}
func (*NullBuilder ) resize (newBits int , init func (int )) {}
func (b *NullBuilder ) NewArray () arrow .Array {
return b .NewNullArray ()
}
func (b *NullBuilder ) NewNullArray () (a *Null ) {
data := b .newData ()
a = NewNullData (data )
data .Release ()
return
}
func (b *NullBuilder ) newData () (data *Data ) {
data = NewData (
arrow .Null , b .length ,
[]*memory .Buffer {nil },
nil ,
b .nulls ,
0 ,
)
b .reset ()
return
}
func (b *NullBuilder ) UnmarshalOne (dec *json .Decoder ) error {
t , err := dec .Token ()
if err != nil {
return err
}
switch t .(type ) {
case nil :
b .AppendNull ()
default :
return &json .UnmarshalTypeError {
Value : fmt .Sprint (t ),
Type : reflect .TypeOf (nil ),
Offset : dec .InputOffset (),
}
}
return nil
}
func (b *NullBuilder ) Unmarshal (dec *json .Decoder ) error {
for dec .More () {
if err := b .UnmarshalOne (dec ); err != nil {
return err
}
}
return nil
}
func (b *NullBuilder ) UnmarshalJSON (data []byte ) error {
dec := json .NewDecoder (bytes .NewReader (data ))
t , err := dec .Token ()
if err != nil {
return err
}
if delim , ok := t .(json .Delim ); !ok || delim != '[' {
return fmt .Errorf ("null builder must unpack from json array, found %s" , delim )
}
return b .Unmarshal (dec )
}
var (
_ arrow .Array = (*Null )(nil )
_ Builder = (*NullBuilder )(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 .