in arrow/util/protobuf_reflect.go [744:876]
func (f ProtobufMessageFieldReflection) AppendValueOrNull(b array.Builder, mem memory.Allocator) error {
pv := f.protoreflectValue()
fd := f.GetDescriptor()
if f.isNull() {
b.AppendNull()
return nil
}
switch b.Type().ID() {
case arrow.STRING:
if f.protobufReflection.isEnum() {
b.(*array.StringBuilder).Append(string(fd.Enum().Values().ByNumber(pv.Enum()).Name()))
} else {
b.(*array.StringBuilder).Append(pv.String())
}
case arrow.BINARY:
b.(*array.BinaryBuilder).Append(pv.Bytes())
case arrow.INT32:
if f.protobufReflection.isEnum() {
b.(*array.Int32Builder).Append(int32(f.reflectValue().Int()))
} else {
b.(*array.Int32Builder).Append(int32(pv.Int()))
}
case arrow.INT64:
b.(*array.Int64Builder).Append(pv.Int())
case arrow.FLOAT64:
b.(*array.Float64Builder).Append(pv.Float())
case arrow.UINT32:
b.(*array.Uint32Builder).Append(uint32(pv.Uint()))
case arrow.UINT64:
b.(*array.Uint64Builder).Append(pv.Uint())
case arrow.BOOL:
b.(*array.BooleanBuilder).Append(pv.Bool())
case arrow.DENSE_UNION:
ub := b.(array.UnionBuilder)
pur := f.asUnion()
if pur.whichOne() == -1 {
ub.AppendNull()
break
}
ub.Append(pur.whichOne())
cb := ub.Child(int(pur.whichOne()))
err := ProtobufMessageFieldReflection{
parent: f.parent,
protobufReflection: pur.getField(),
Field: pur.arrowField(),
}.AppendValueOrNull(cb, mem)
if err != nil {
return err
}
case arrow.DICTIONARY:
pdr := f.asDictionary()
db := b.(*array.BinaryDictionaryBuilder)
err := db.InsertStringDictValues(pdr.getDictValues(mem).(*array.String))
if err != nil {
return err
}
enumNum := int(f.reflectValue().Int())
enumVal := fd.Enum().Values().ByNumber(protoreflect.EnumNumber(enumNum)).Name()
err = db.AppendValueFromString(string(enumVal))
if err != nil {
return err
}
case arrow.STRUCT:
sb := b.(*array.StructBuilder)
sb.Append(true)
child := ProtobufMessageFieldReflection{
parent: f.parent,
}
for i, field := range f.Field.Type.(*arrow.StructType).Fields() {
child.protobufReflection = f.asStruct().getFieldByName(field.Name)
child.Field = field
err := child.AppendValueOrNull(sb.FieldBuilder(i), mem)
if err != nil {
return err
}
}
case arrow.LIST:
lb := b.(*array.ListBuilder)
l := pv.List().Len()
if l == 0 {
lb.AppendEmptyValue()
break
}
lb.ValueBuilder().Reserve(l)
lb.Append(true)
child := ProtobufMessageFieldReflection{
parent: f.parent,
Field: f.Field.Type.(*arrow.ListType).ElemField(),
}
for li := range f.asList().generateListItems() {
child.protobufReflection = &li
err := child.AppendValueOrNull(lb.ValueBuilder(), mem)
if err != nil {
return err
}
}
case arrow.MAP:
mb := b.(*array.MapBuilder)
l := pv.Map().Len()
if l == 0 {
mb.AppendEmptyValue()
break
}
mb.KeyBuilder().Reserve(l)
mb.ItemBuilder().Reserve(l)
mb.Append(true)
k := ProtobufMessageFieldReflection{
parent: f.parent,
Field: f.Field.Type.(*arrow.MapType).KeyField(),
}
v := ProtobufMessageFieldReflection{
parent: f.parent,
Field: f.Field.Type.(*arrow.MapType).ItemField(),
}
for kvp := range f.asMap().generateKeyValuePairs() {
k.protobufReflection = &kvp.k
err := k.AppendValueOrNull(mb.KeyBuilder(), mem)
if err != nil {
return err
}
v.protobufReflection = &kvp.v
err = v.AppendValueOrNull(mb.ItemBuilder(), mem)
if err != nil {
return err
}
}
default:
return fmt.Errorf("not able to appendValueOrNull for type %s", b.Type().ID())
}
return nil
}