in arrow/ipc/metadata.go [682:865]
func concreteTypeFromFB(typ flatbuf.Type, data flatbuffers.Table, children []arrow.Field) (arrow.DataType, error) {
switch typ {
case flatbuf.TypeNONE:
return nil, fmt.Errorf("arrow/ipc: Type metadata cannot be none")
case flatbuf.TypeNull:
return arrow.Null, nil
case flatbuf.TypeInt:
var dt flatbuf.Int
dt.Init(data.Bytes, data.Pos)
return intFromFB(dt)
case flatbuf.TypeFloatingPoint:
var dt flatbuf.FloatingPoint
dt.Init(data.Bytes, data.Pos)
return floatFromFB(dt)
case flatbuf.TypeDecimal:
var dt flatbuf.Decimal
dt.Init(data.Bytes, data.Pos)
return decimalFromFB(dt)
case flatbuf.TypeBinary:
return arrow.BinaryTypes.Binary, nil
case flatbuf.TypeFixedSizeBinary:
var dt flatbuf.FixedSizeBinary
dt.Init(data.Bytes, data.Pos)
return &arrow.FixedSizeBinaryType{ByteWidth: int(dt.ByteWidth())}, nil
case flatbuf.TypeUtf8:
return arrow.BinaryTypes.String, nil
case flatbuf.TypeLargeBinary:
return arrow.BinaryTypes.LargeBinary, nil
case flatbuf.TypeLargeUtf8:
return arrow.BinaryTypes.LargeString, nil
case flatbuf.TypeUtf8View:
return arrow.BinaryTypes.StringView, nil
case flatbuf.TypeBinaryView:
return arrow.BinaryTypes.BinaryView, nil
case flatbuf.TypeBool:
return arrow.FixedWidthTypes.Boolean, nil
case flatbuf.TypeList:
if len(children) != 1 {
return nil, fmt.Errorf("arrow/ipc: List must have exactly 1 child field (got=%d)", len(children))
}
dt := arrow.ListOfField(children[0])
return dt, nil
case flatbuf.TypeLargeList:
if len(children) != 1 {
return nil, fmt.Errorf("arrow/ipc: LargeList must have exactly 1 child field (got=%d)", len(children))
}
dt := arrow.LargeListOfField(children[0])
return dt, nil
case flatbuf.TypeListView:
if len(children) != 1 {
return nil, fmt.Errorf("arrow/ipc: ListView must have exactly 1 child field (got=%d)", len(children))
}
dt := arrow.ListViewOfField(children[0])
return dt, nil
case flatbuf.TypeLargeListView:
if len(children) != 1 {
return nil, fmt.Errorf("arrow/ipc: LargeListView must have exactly 1 child field (got=%d)", len(children))
}
dt := arrow.LargeListViewOfField(children[0])
return dt, nil
case flatbuf.TypeFixedSizeList:
var dt flatbuf.FixedSizeList
dt.Init(data.Bytes, data.Pos)
if len(children) != 1 {
return nil, fmt.Errorf("arrow/ipc: FixedSizeList must have exactly 1 child field (got=%d)", len(children))
}
ret := arrow.FixedSizeListOfField(dt.ListSize(), children[0])
return ret, nil
case flatbuf.TypeStruct_:
return arrow.StructOf(children...), nil
case flatbuf.TypeUnion:
var dt flatbuf.Union
dt.Init(data.Bytes, data.Pos)
var (
mode arrow.UnionMode
typeIDs []arrow.UnionTypeCode
)
switch dt.Mode() {
case flatbuf.UnionModeSparse:
mode = arrow.SparseMode
case flatbuf.UnionModeDense:
mode = arrow.DenseMode
}
typeIDLen := dt.TypeIdsLength()
if typeIDLen == 0 {
for i := range children {
typeIDs = append(typeIDs, int8(i))
}
} else {
for i := 0; i < typeIDLen; i++ {
id := dt.TypeIds(i)
code := arrow.UnionTypeCode(id)
if int32(code) != id {
return nil, errors.New("union type id out of bounds")
}
typeIDs = append(typeIDs, code)
}
}
return arrow.UnionOf(mode, children, typeIDs), nil
case flatbuf.TypeTime:
var dt flatbuf.Time
dt.Init(data.Bytes, data.Pos)
return timeFromFB(dt)
case flatbuf.TypeTimestamp:
var dt flatbuf.Timestamp
dt.Init(data.Bytes, data.Pos)
return timestampFromFB(dt)
case flatbuf.TypeDate:
var dt flatbuf.Date
dt.Init(data.Bytes, data.Pos)
return dateFromFB(dt)
case flatbuf.TypeInterval:
var dt flatbuf.Interval
dt.Init(data.Bytes, data.Pos)
return intervalFromFB(dt)
case flatbuf.TypeDuration:
var dt flatbuf.Duration
dt.Init(data.Bytes, data.Pos)
return durationFromFB(dt)
case flatbuf.TypeMap:
if len(children) != 1 {
return nil, fmt.Errorf("arrow/ipc: Map must have exactly 1 child field")
}
if children[0].Nullable || children[0].Type.ID() != arrow.STRUCT || len(children[0].Type.(*arrow.StructType).Fields()) != 2 {
return nil, fmt.Errorf("arrow/ipc: Map's key-item pairs must be non-nullable structs")
}
pairType := children[0].Type.(*arrow.StructType)
if pairType.Field(0).Nullable {
return nil, fmt.Errorf("arrow/ipc: Map's keys must be non-nullable")
}
var dt flatbuf.Map
dt.Init(data.Bytes, data.Pos)
ret := arrow.MapOf(pairType.Field(0).Type, pairType.Field(1).Type)
ret.SetItemNullable(pairType.Field(1).Nullable)
ret.KeysSorted = dt.KeysSorted()
return ret, nil
case flatbuf.TypeRunEndEncoded:
if len(children) != 2 {
return nil, fmt.Errorf("%w: arrow/ipc: RunEndEncoded must have exactly 2 child fields", arrow.ErrInvalid)
}
switch children[0].Type.ID() {
case arrow.INT16, arrow.INT32, arrow.INT64:
default:
return nil, fmt.Errorf("%w: arrow/ipc: run-end encoded run_ends field must be one of int16, int32, or int64 type", arrow.ErrInvalid)
}
return arrow.RunEndEncodedOf(children[0].Type, children[1].Type), nil
default:
panic(fmt.Errorf("arrow/ipc: type %v not implemented", flatbuf.EnumNamesType[typ]))
}
}