in arrow/avro/reader_types.go [392:580]
func mapFieldBuilders(b array.Builder, field arrow.Field, parent *fieldPos) {
f := parent.newChild(field.Name, b, field.Metadata)
switch bt := b.(type) {
case *array.BinaryBuilder:
f.appendFunc = func(data interface{}) error {
appendBinaryData(bt, data)
return nil
}
case *array.BinaryDictionaryBuilder:
// has metadata for Avro enum symbols
f.appendFunc = func(data interface{}) error {
appendBinaryDictData(bt, data)
return nil
}
// add Avro enum symbols to builder
sb := array.NewStringBuilder(memory.DefaultAllocator)
for _, v := range field.Metadata.Values() {
sb.Append(v)
}
sa := sb.NewStringArray()
bt.InsertStringDictValues(sa)
case *array.BooleanBuilder:
f.appendFunc = func(data interface{}) error {
appendBoolData(bt, data)
return nil
}
case *array.Date32Builder:
f.appendFunc = func(data interface{}) error {
appendDate32Data(bt, data)
return nil
}
case *array.Decimal128Builder:
f.appendFunc = func(data interface{}) error {
err := appendDecimal128Data(bt, data)
if err != nil {
return err
}
return nil
}
case *array.Decimal256Builder:
f.appendFunc = func(data interface{}) error {
err := appendDecimal256Data(bt, data)
if err != nil {
return err
}
return nil
}
case *extensions.UUIDBuilder:
f.appendFunc = func(data interface{}) error {
switch dt := data.(type) {
case nil:
bt.AppendNull()
case string:
err := bt.AppendValueFromString(dt)
if err != nil {
return err
}
case []byte:
err := bt.AppendValueFromString(string(dt))
if err != nil {
return err
}
}
return nil
}
case *array.FixedSizeBinaryBuilder:
f.appendFunc = func(data interface{}) error {
appendFixedSizeBinaryData(bt, data)
return nil
}
case *array.Float32Builder:
f.appendFunc = func(data interface{}) error {
appendFloat32Data(bt, data)
return nil
}
case *array.Float64Builder:
f.appendFunc = func(data interface{}) error {
appendFloat64Data(bt, data)
return nil
}
case *array.Int32Builder:
f.appendFunc = func(data interface{}) error {
appendInt32Data(bt, data)
return nil
}
case *array.Int64Builder:
f.appendFunc = func(data interface{}) error {
appendInt64Data(bt, data)
return nil
}
case *array.LargeListBuilder:
vb := bt.ValueBuilder()
f.isList = true
mapFieldBuilders(vb, field.Type.(*arrow.LargeListType).ElemField(), f)
f.appendFunc = func(data interface{}) error {
switch dt := data.(type) {
case nil:
bt.AppendNull()
case []interface{}:
if len(dt) == 0 {
bt.AppendEmptyValue()
} else {
bt.Append(true)
}
default:
bt.Append(true)
}
return nil
}
case *array.ListBuilder:
vb := bt.ValueBuilder()
f.isList = true
mapFieldBuilders(vb, field.Type.(*arrow.ListType).ElemField(), f)
f.appendFunc = func(data interface{}) error {
switch dt := data.(type) {
case nil:
bt.AppendNull()
case []interface{}:
if len(dt) == 0 {
bt.AppendEmptyValue()
} else {
bt.Append(true)
}
default:
bt.Append(true)
}
return nil
}
case *array.MapBuilder:
// has metadata for objects in values
f.isMap = true
kb := bt.KeyBuilder()
ib := bt.ItemBuilder()
mapFieldBuilders(kb, field.Type.(*arrow.MapType).KeyField(), f)
mapFieldBuilders(ib, field.Type.(*arrow.MapType).ItemField(), f)
f.appendFunc = func(data interface{}) error {
switch data.(type) {
case nil:
bt.AppendNull()
default:
bt.Append(true)
}
return nil
}
case *array.MonthDayNanoIntervalBuilder:
f.appendFunc = func(data interface{}) error {
appendDurationData(bt, data)
return nil
}
case *array.StringBuilder:
f.appendFunc = func(data interface{}) error {
appendStringData(bt, data)
return nil
}
case *array.StructBuilder:
// has metadata for Avro Union named types
f.typeName, _ = field.Metadata.GetValue("typeName")
f.isStruct = true
// create children
for i, p := range field.Type.(*arrow.StructType).Fields() {
mapFieldBuilders(bt.FieldBuilder(i), p, f)
}
f.appendFunc = func(data interface{}) error {
switch data.(type) {
case nil:
bt.AppendNull()
return ErrNullStructData
default:
bt.Append(true)
}
return nil
}
case *array.Time32Builder:
f.appendFunc = func(data interface{}) error {
appendTime32Data(bt, data)
return nil
}
case *array.Time64Builder:
f.appendFunc = func(data interface{}) error {
appendTime64Data(bt, data)
return nil
}
case *array.TimestampBuilder:
f.appendFunc = func(data interface{}) error {
appendTimestampData(bt, data)
return nil
}
}
}