Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
1b7d94a
Separate public API from impl of comparison functions
serramatutu Apr 30, 2026
0e3d440
Add `nullable` to `equalOption`
serramatutu Apr 30, 2026
9d5be98
Check for nullable opt in most array compare implementations
serramatutu Apr 30, 2026
ced2cd3
Add stricter tests to null JSON in record and struct
serramatutu Apr 28, 2026
def12f0
`AppendEmptyValue()` if field is nullable
serramatutu Apr 28, 2026
0f4a3ba
Add `nullable` argument to `GetOneForMarshal()`
serramatutu Apr 29, 2026
8edca06
Make struct and record use `field.Nullable` when serializing
serramatutu Apr 29, 2026
3cf588b
Fix tests that were implicitly depending on wrong nullable semantics
serramatutu Apr 29, 2026
83783ac
Add `TimestampWithOffset` extension type
serramatutu Oct 28, 2025
5c9dea3
Allow dictionary encoding of `TimestampWithOffset`
serramatutu Dec 22, 2025
e990eb1
Allow run-end encoding of `TimestampWithOffset`
serramatutu Dec 22, 2025
0b00393
Optimize `Values()` and `MarshalJSON()` for REE
serramatutu Dec 22, 2025
c9a7060
General code smell patches
serramatutu Jan 30, 2026
07f9179
Test with `-08:30` and `11:00` timezone
serramatutu Jan 30, 2026
6e19e71
Rename constructors
serramatutu Jan 30, 2026
98019bb
Leverage generics for REE and dict-encoding
serramatutu Feb 2, 2026
6b0be1b
Make equals also check for data type
serramatutu Feb 3, 2026
38e6e07
Remove outdated docs
serramatutu Apr 10, 2026
90b0ec7
Remove unnecessary IsInteger call
serramatutu Apr 10, 2026
e7eb2de
Remove specific type for `TimestampWithOffsetRunEndsType`
serramatutu Apr 10, 2026
8b1e972
Uncomment test
serramatutu Apr 10, 2026
37c3640
Fix REE ends type
serramatutu Apr 15, 2026
562e9ef
Support unix epoch
serramatutu Apr 15, 2026
4867b34
Fix inconsistency with `UnsafeAppend()`
serramatutu Apr 15, 2026
ffba5ab
Stop appending nulls to child arrays
serramatutu Apr 15, 2026
7da2fee
Fix lint
serramatutu Apr 15, 2026
2184359
Simplify `fieldValuesFromTime()` implementation
serramatutu Apr 15, 2026
9f931fb
Add subtests
serramatutu Apr 30, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion arrow/array.go
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ type Array interface {
ValueStr(i int) string

// Get single value to be marshalled with `json.Marshal`
GetOneForMarshal(i int) interface{}
GetOneForMarshal(i int, nullable bool) interface{}

Data() ArrayData

Expand Down
30 changes: 15 additions & 15 deletions arrow/array/binary.go
Original file line number Diff line number Diff line change
Expand Up @@ -152,8 +152,8 @@ func (a *Binary) setData(data *Data) {
}
}

func (a *Binary) GetOneForMarshal(i int) interface{} {
if a.IsNull(i) {
func (a *Binary) GetOneForMarshal(i int, nullable bool) interface{} {
if nullable && a.IsNull(i) {
return nil
}
return a.Value(i)
Expand All @@ -162,7 +162,7 @@ func (a *Binary) GetOneForMarshal(i int) interface{} {
func (a *Binary) MarshalJSON() ([]byte, error) {
vals := make([]interface{}, a.Len())
for i := 0; i < a.Len(); i++ {
vals[i] = a.GetOneForMarshal(i)
vals[i] = a.GetOneForMarshal(i, true)
}
// golang marshal standard says that []byte will be marshalled
// as a base64-encoded string
Expand Down Expand Up @@ -223,9 +223,9 @@ func (a *Binary) ValidateFull() error {
return nil
}

func arrayEqualBinary(left, right *Binary) bool {
func arrayEqualBinary(left, right *Binary, opt equalOption) bool {
for i := 0; i < left.Len(); i++ {
if left.IsNull(i) {
if opt.nullable && left.IsNull(i) {
continue
}
if !bytes.Equal(left.Value(i), right.Value(i)) {
Expand Down Expand Up @@ -346,8 +346,8 @@ func (a *LargeBinary) setData(data *Data) {
}
}

func (a *LargeBinary) GetOneForMarshal(i int) interface{} {
if a.IsNull(i) {
func (a *LargeBinary) GetOneForMarshal(i int, nullable bool) interface{} {
if nullable && a.IsNull(i) {
return nil
}
return a.Value(i)
Expand All @@ -356,7 +356,7 @@ func (a *LargeBinary) GetOneForMarshal(i int) interface{} {
func (a *LargeBinary) MarshalJSON() ([]byte, error) {
vals := make([]interface{}, a.Len())
for i := 0; i < a.Len(); i++ {
vals[i] = a.GetOneForMarshal(i)
vals[i] = a.GetOneForMarshal(i, true)
}
// golang marshal standard says that []byte will be marshalled
// as a base64-encoded string
Expand Down Expand Up @@ -417,9 +417,9 @@ func (a *LargeBinary) ValidateFull() error {
return nil
}

func arrayEqualLargeBinary(left, right *LargeBinary) bool {
func arrayEqualLargeBinary(left, right *LargeBinary, opt equalOption) bool {
for i := 0; i < left.Len(); i++ {
if left.IsNull(i) {
if opt.nullable && left.IsNull(i) {
continue
}
if !bytes.Equal(left.Value(i), right.Value(i)) {
Expand Down Expand Up @@ -522,8 +522,8 @@ func (a *BinaryView) ValueStr(i int) string {
return base64.StdEncoding.EncodeToString(a.Value(i))
}

func (a *BinaryView) GetOneForMarshal(i int) interface{} {
if a.IsNull(i) {
func (a *BinaryView) GetOneForMarshal(i int, nullable bool) interface{} {
if nullable && a.IsNull(i) {
return nil
}
return a.Value(i)
Expand All @@ -532,17 +532,17 @@ func (a *BinaryView) GetOneForMarshal(i int) interface{} {
func (a *BinaryView) MarshalJSON() ([]byte, error) {
vals := make([]interface{}, a.Len())
for i := 0; i < a.Len(); i++ {
vals[i] = a.GetOneForMarshal(i)
vals[i] = a.GetOneForMarshal(i, true)
}
// golang marshal standard says that []byte will be marshalled
// as a base64-encoded string
return json.Marshal(vals)
}

func arrayEqualBinaryView(left, right *BinaryView) bool {
func arrayEqualBinaryView(left, right *BinaryView, opt equalOption) bool {
leftBufs, rightBufs := left.dataBuffers, right.dataBuffers
for i := 0; i < left.Len(); i++ {
if left.IsNull(i) {
if opt.nullable && left.IsNull(i) {
continue
}
if !left.ValueHeader(i).Equals(leftBufs, right.ValueHeader(i), rightBufs) {
Expand Down
8 changes: 4 additions & 4 deletions arrow/array/boolean.go
Original file line number Diff line number Diff line change
Expand Up @@ -90,8 +90,8 @@ func (a *Boolean) setData(data *Data) {
}
}

func (a *Boolean) GetOneForMarshal(i int) interface{} {
if a.IsValid(i) {
func (a *Boolean) GetOneForMarshal(i int, nullable bool) interface{} {
if !nullable || a.IsValid(i) {
return a.Value(i)
}
return nil
Expand All @@ -109,9 +109,9 @@ func (a *Boolean) MarshalJSON() ([]byte, error) {
return json.Marshal(vals)
}

func arrayEqualBoolean(left, right *Boolean) bool {
func arrayEqualBoolean(left, right *Boolean, opt equalOption) bool {
for i := 0; i < left.Len(); i++ {
if left.IsNull(i) {
if opt.nullable && left.IsNull(i) {
continue
}
if left.Value(i) != right.Value(i) {
Expand Down
Loading
Loading