Skip to content

Commit 8f8429a

Browse files
committed
create better interface
1 parent 1a74b10 commit 8f8429a

File tree

5 files changed

+21
-28
lines changed

5 files changed

+21
-28
lines changed

go/arrow/array/builder.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -318,11 +318,11 @@ func NewBuilder(mem memory.Allocator, dtype arrow.DataType) Builder {
318318
return NewMapBuilderWithType(mem, typ)
319319
case arrow.EXTENSION:
320320
typ := dtype.(arrow.ExtensionType)
321-
bldr := typ.NewBuilder(mem, typ)
322-
if bldr != nil {
323-
return bldr.(Builder)
321+
bldr := NewExtensionBuilder(mem, typ)
322+
if custom, ok := typ.(ExtensionBuilderWrapper); ok {
323+
return custom.NewBuilder(bldr)
324324
}
325-
return NewExtensionBuilder(mem, typ)
325+
return bldr
326326
case arrow.FIXED_SIZE_LIST:
327327
typ := dtype.(*arrow.FixedSizeListType)
328328
return NewFixedSizeListBuilder(mem, typ.Len(), typ.Elem())

go/arrow/array/extension_builder.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package array
2+
3+
type ExtensionBuilderWrapper interface {
4+
NewBuilder(bldr *ExtensionBuilder) Builder
5+
}

go/arrow/datatype_extension.go

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@ import (
2020
"fmt"
2121
"reflect"
2222
"sync"
23-
24-
"github.com/apache/arrow/go/v12/arrow/memory"
2523
)
2624

2725
var (
@@ -124,20 +122,16 @@ type ExtensionType interface {
124122
// If the storage type is incorrect or something else is invalid with the data this should
125123
// return nil and an appropriate error.
126124
Deserialize(storageType DataType, data string) (ExtensionType, error)
127-
// this should return array.Builder interface but we cannot import due to cycle import, so we use
128-
// interface{} instead. At least for
129-
NewBuilder(mem memory.Allocator, dt ExtensionType) interface{}
130125
mustEmbedExtensionBase()
131126
}
132127

133128
// ExtensionBase is the base struct for user-defined Extension Types which must be
134129
// embedded in any user-defined types like so:
135130
//
136-
// type UserDefinedType struct {
137-
// arrow.ExtensionBase
138-
// // any other data
139-
// }
140-
//
131+
// type UserDefinedType struct {
132+
// arrow.ExtensionBase
133+
// // any other data
134+
// }
141135
type ExtensionBase struct {
142136
// Storage is the underlying storage type
143137
Storage DataType
@@ -166,13 +160,10 @@ func (e *ExtensionBase) Fields() []Field {
166160
return nil
167161
}
168162

169-
func (e *ExtensionBase) NewBuilder(mem memory.Allocator, dt ExtensionType) interface{} {
170-
return nil
171-
}
172-
173163
func (e *ExtensionBase) Layout() DataTypeLayout { return e.Storage.Layout() }
174164

175165
// this no-op exists to ensure that this type must be embedded in any user-defined extension type.
166+
//
176167
//lint:ignore U1000 this function is intentionally unused as it only exists to ensure embedding happens
177168
func (ExtensionBase) mustEmbedExtensionBase() {}
178169

go/arrow/internal/testing/types/extension_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,16 @@ import (
3333
var testUUID = uuid.New()
3434

3535
func TestExtensionBuilder(t *testing.T) {
36-
builder := types.NewUUIDBuilder(memory.DefaultAllocator, types.NewUUIDType())
36+
extBuilder := array.NewExtensionBuilder(memory.DefaultAllocator, types.NewUUIDType())
37+
builder := types.NewUUIDBuilder(extBuilder)
3738
builder.Append(testUUID)
3839
arr := builder.NewArray()
3940
arrStr := arr.String()
4041
assert.Equal(t, "[\""+testUUID.String()+"\"]", arrStr)
4142
jsonStr, err := json.Marshal(arr)
4243
assert.NoError(t, err)
4344

44-
arr1, _ , err := array.FromJSON(memory.DefaultAllocator, types.NewUUIDType(), bytes.NewReader(jsonStr))
45+
arr1, _, err := array.FromJSON(memory.DefaultAllocator, types.NewUUIDType(), bytes.NewReader(jsonStr))
4546
assert.NoError(t, err)
4647
assert.Equal(t, arr, arr1)
4748
}

go/arrow/internal/testing/types/extension_types.go

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ import (
2828

2929
"github.com/apache/arrow/go/v12/arrow"
3030
"github.com/apache/arrow/go/v12/arrow/array"
31-
"github.com/apache/arrow/go/v12/arrow/memory"
3231
"github.com/google/uuid"
3332
"golang.org/x/xerrors"
3433
)
@@ -38,10 +37,9 @@ type UUIDBuilder struct {
3837
dtype *UUIDType
3938
}
4039

41-
func NewUUIDBuilder(mem memory.Allocator, dtype arrow.ExtensionType) *UUIDBuilder {
40+
func NewUUIDBuilder(bldr *array.ExtensionBuilder) *UUIDBuilder {
4241
b := &UUIDBuilder{
43-
ExtensionBuilder: array.NewExtensionBuilder(mem, dtype),
44-
dtype: dtype.(*UUIDType),
42+
ExtensionBuilder: bldr,
4543
}
4644
return b
4745
}
@@ -192,7 +190,6 @@ type UUIDType struct {
192190
arrow.ExtensionBase
193191
}
194192

195-
196193
// NewUUIDType is a convenience function to create an instance of UuidType
197194
// with the correct storage type
198195
func NewUUIDType() *UUIDType {
@@ -226,11 +223,10 @@ func (u UUIDType) ExtensionEquals(other arrow.ExtensionType) bool {
226223
return u.ExtensionName() == other.ExtensionName()
227224
}
228225

229-
func (u UUIDType) NewBuilder(mem memory.Allocator, dt arrow.ExtensionType) interface{} {
230-
return NewUUIDBuilder(mem, dt)
226+
func (u UUIDType) NewBuilder(bldr *array.ExtensionBuilder) array.Builder {
227+
return NewUUIDBuilder(bldr)
231228
}
232229

233-
234230
// Parametric1Array is a simple int32 array for use with the Parametric1Type
235231
// in testing a parameterized user-defined extension type.
236232
type Parametric1Array struct {

0 commit comments

Comments
 (0)