in arrow/ipc/metadata.go [573:678]
func concreteTypeFromFB(typ flatbuf.Type, data flatbuffers.Table, children []arrow.Field) (arrow.DataType, error) {
switch typ {
case flatbuf.TypeNONE:
return nil, xerrors.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.TypeBool:
return arrow.FixedWidthTypes.Boolean, nil
case flatbuf.TypeList:
if len(children) != 1 {
return nil, xerrors.Errorf("arrow/ipc: List must have exactly 1 child field (got=%d)", len(children))
}
dt := arrow.ListOfField(children[0])
return dt, nil
case flatbuf.TypeFixedSizeList:
var dt flatbuf.FixedSizeList
dt.Init(data.Bytes, data.Pos)
if len(children) != 1 {
return nil, xerrors.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.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, xerrors.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, xerrors.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, xerrors.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.KeysSorted = dt.KeysSorted()
return ret, nil
default:
// FIXME(sbinet): implement all the other types.
panic(xerrors.Errorf("arrow/ipc: type %v not implemented", flatbuf.EnumNamesType[typ]))
}
}