in arrow/ipc/metadata.go [231:500]
func (fv *fieldVisitor) visit(field arrow.Field) {
dt := field.Type
switch dt := dt.(type) {
case *arrow.NullType:
fv.dtype = flatbuf.TypeNull
flatbuf.NullStart(fv.b)
fv.offset = flatbuf.NullEnd(fv.b)
case *arrow.BooleanType:
fv.dtype = flatbuf.TypeBool
flatbuf.BoolStart(fv.b)
fv.offset = flatbuf.BoolEnd(fv.b)
case *arrow.Uint8Type:
fv.dtype = flatbuf.TypeInt
fv.offset = intToFB(fv.b, int32(dt.BitWidth()), false)
case *arrow.Uint16Type:
fv.dtype = flatbuf.TypeInt
fv.offset = intToFB(fv.b, int32(dt.BitWidth()), false)
case *arrow.Uint32Type:
fv.dtype = flatbuf.TypeInt
fv.offset = intToFB(fv.b, int32(dt.BitWidth()), false)
case *arrow.Uint64Type:
fv.dtype = flatbuf.TypeInt
fv.offset = intToFB(fv.b, int32(dt.BitWidth()), false)
case *arrow.Int8Type:
fv.dtype = flatbuf.TypeInt
fv.offset = intToFB(fv.b, int32(dt.BitWidth()), true)
case *arrow.Int16Type:
fv.dtype = flatbuf.TypeInt
fv.offset = intToFB(fv.b, int32(dt.BitWidth()), true)
case *arrow.Int32Type:
fv.dtype = flatbuf.TypeInt
fv.offset = intToFB(fv.b, int32(dt.BitWidth()), true)
case *arrow.Int64Type:
fv.dtype = flatbuf.TypeInt
fv.offset = intToFB(fv.b, int32(dt.BitWidth()), true)
case *arrow.Float16Type:
fv.dtype = flatbuf.TypeFloatingPoint
fv.offset = floatToFB(fv.b, int32(dt.BitWidth()))
case *arrow.Float32Type:
fv.dtype = flatbuf.TypeFloatingPoint
fv.offset = floatToFB(fv.b, int32(dt.BitWidth()))
case *arrow.Float64Type:
fv.dtype = flatbuf.TypeFloatingPoint
fv.offset = floatToFB(fv.b, int32(dt.BitWidth()))
case arrow.DecimalType:
fv.dtype = flatbuf.TypeDecimal
flatbuf.DecimalStart(fv.b)
flatbuf.DecimalAddPrecision(fv.b, dt.GetPrecision())
flatbuf.DecimalAddScale(fv.b, dt.GetScale())
flatbuf.DecimalAddBitWidth(fv.b, int32(dt.BitWidth()))
fv.offset = flatbuf.DecimalEnd(fv.b)
case *arrow.FixedSizeBinaryType:
fv.dtype = flatbuf.TypeFixedSizeBinary
flatbuf.FixedSizeBinaryStart(fv.b)
flatbuf.FixedSizeBinaryAddByteWidth(fv.b, int32(dt.ByteWidth))
fv.offset = flatbuf.FixedSizeBinaryEnd(fv.b)
case *arrow.BinaryType:
fv.dtype = flatbuf.TypeBinary
flatbuf.BinaryStart(fv.b)
fv.offset = flatbuf.BinaryEnd(fv.b)
case *arrow.LargeBinaryType:
fv.dtype = flatbuf.TypeLargeBinary
flatbuf.LargeBinaryStart(fv.b)
fv.offset = flatbuf.LargeBinaryEnd(fv.b)
case *arrow.StringType:
fv.dtype = flatbuf.TypeUtf8
flatbuf.Utf8Start(fv.b)
fv.offset = flatbuf.Utf8End(fv.b)
case *arrow.LargeStringType:
fv.dtype = flatbuf.TypeLargeUtf8
flatbuf.LargeUtf8Start(fv.b)
fv.offset = flatbuf.LargeUtf8End(fv.b)
case *arrow.BinaryViewType:
fv.dtype = flatbuf.TypeBinaryView
flatbuf.BinaryViewStart(fv.b)
fv.offset = flatbuf.BinaryViewEnd(fv.b)
case *arrow.StringViewType:
fv.dtype = flatbuf.TypeUtf8View
flatbuf.Utf8ViewStart(fv.b)
fv.offset = flatbuf.Utf8ViewEnd(fv.b)
case *arrow.Date32Type:
fv.dtype = flatbuf.TypeDate
flatbuf.DateStart(fv.b)
flatbuf.DateAddUnit(fv.b, flatbuf.DateUnitDAY)
fv.offset = flatbuf.DateEnd(fv.b)
case *arrow.Date64Type:
fv.dtype = flatbuf.TypeDate
flatbuf.DateStart(fv.b)
flatbuf.DateAddUnit(fv.b, flatbuf.DateUnitMILLISECOND)
fv.offset = flatbuf.DateEnd(fv.b)
case *arrow.Time32Type:
fv.dtype = flatbuf.TypeTime
flatbuf.TimeStart(fv.b)
flatbuf.TimeAddUnit(fv.b, unitToFB(dt.Unit))
flatbuf.TimeAddBitWidth(fv.b, 32)
fv.offset = flatbuf.TimeEnd(fv.b)
case *arrow.Time64Type:
fv.dtype = flatbuf.TypeTime
flatbuf.TimeStart(fv.b)
flatbuf.TimeAddUnit(fv.b, unitToFB(dt.Unit))
flatbuf.TimeAddBitWidth(fv.b, 64)
fv.offset = flatbuf.TimeEnd(fv.b)
case *arrow.TimestampType:
fv.dtype = flatbuf.TypeTimestamp
unit := unitToFB(dt.Unit)
var tz flatbuffers.UOffsetT
if dt.TimeZone != "" {
tz = fv.b.CreateString(dt.TimeZone)
}
flatbuf.TimestampStart(fv.b)
flatbuf.TimestampAddUnit(fv.b, unit)
flatbuf.TimestampAddTimezone(fv.b, tz)
fv.offset = flatbuf.TimestampEnd(fv.b)
case *arrow.StructType:
fv.dtype = flatbuf.TypeStruct_
offsets := make([]flatbuffers.UOffsetT, dt.NumFields())
for i, field := range dt.Fields() {
offsets[i] = fieldToFB(fv.b, fv.pos.Child(int32(i)), field, fv.memo)
}
flatbuf.Struct_Start(fv.b)
for i := len(offsets) - 1; i >= 0; i-- {
fv.b.PrependUOffsetT(offsets[i])
}
fv.offset = flatbuf.Struct_End(fv.b)
fv.kids = append(fv.kids, offsets...)
case *arrow.ListType:
fv.dtype = flatbuf.TypeList
fv.kids = append(fv.kids, fieldToFB(fv.b, fv.pos.Child(0), dt.ElemField(), fv.memo))
flatbuf.ListStart(fv.b)
fv.offset = flatbuf.ListEnd(fv.b)
case *arrow.LargeListType:
fv.dtype = flatbuf.TypeLargeList
fv.kids = append(fv.kids, fieldToFB(fv.b, fv.pos.Child(0), dt.ElemField(), fv.memo))
flatbuf.LargeListStart(fv.b)
fv.offset = flatbuf.LargeListEnd(fv.b)
case *arrow.ListViewType:
fv.dtype = flatbuf.TypeListView
fv.kids = append(fv.kids, fieldToFB(fv.b, fv.pos.Child(0), dt.ElemField(), fv.memo))
flatbuf.ListViewStart(fv.b)
fv.offset = flatbuf.ListViewEnd(fv.b)
case *arrow.LargeListViewType:
fv.dtype = flatbuf.TypeLargeListView
fv.kids = append(fv.kids, fieldToFB(fv.b, fv.pos.Child(0), dt.ElemField(), fv.memo))
flatbuf.LargeListViewStart(fv.b)
fv.offset = flatbuf.LargeListViewEnd(fv.b)
case *arrow.FixedSizeListType:
fv.dtype = flatbuf.TypeFixedSizeList
fv.kids = append(fv.kids, fieldToFB(fv.b, fv.pos.Child(0), dt.ElemField(), fv.memo))
flatbuf.FixedSizeListStart(fv.b)
flatbuf.FixedSizeListAddListSize(fv.b, dt.Len())
fv.offset = flatbuf.FixedSizeListEnd(fv.b)
case *arrow.MonthIntervalType:
fv.dtype = flatbuf.TypeInterval
flatbuf.IntervalStart(fv.b)
flatbuf.IntervalAddUnit(fv.b, flatbuf.IntervalUnitYEAR_MONTH)
fv.offset = flatbuf.IntervalEnd(fv.b)
case *arrow.DayTimeIntervalType:
fv.dtype = flatbuf.TypeInterval
flatbuf.IntervalStart(fv.b)
flatbuf.IntervalAddUnit(fv.b, flatbuf.IntervalUnitDAY_TIME)
fv.offset = flatbuf.IntervalEnd(fv.b)
case *arrow.MonthDayNanoIntervalType:
fv.dtype = flatbuf.TypeInterval
flatbuf.IntervalStart(fv.b)
flatbuf.IntervalAddUnit(fv.b, flatbuf.IntervalUnitMONTH_DAY_NANO)
fv.offset = flatbuf.IntervalEnd(fv.b)
case *arrow.DurationType:
fv.dtype = flatbuf.TypeDuration
unit := unitToFB(dt.Unit)
flatbuf.DurationStart(fv.b)
flatbuf.DurationAddUnit(fv.b, unit)
fv.offset = flatbuf.DurationEnd(fv.b)
case *arrow.MapType:
fv.dtype = flatbuf.TypeMap
fv.kids = append(fv.kids, fieldToFB(fv.b, fv.pos.Child(0), dt.ElemField(), fv.memo))
flatbuf.MapStart(fv.b)
flatbuf.MapAddKeysSorted(fv.b, dt.KeysSorted)
fv.offset = flatbuf.MapEnd(fv.b)
case *arrow.RunEndEncodedType:
fv.dtype = flatbuf.TypeRunEndEncoded
var offsets [2]flatbuffers.UOffsetT
offsets[0] = fieldToFB(fv.b, fv.pos.Child(0),
arrow.Field{Name: "run_ends", Type: dt.RunEnds()}, fv.memo)
offsets[1] = fieldToFB(fv.b, fv.pos.Child(1),
arrow.Field{Name: "values", Type: dt.Encoded(), Nullable: true}, fv.memo)
flatbuf.RunEndEncodedStart(fv.b)
fv.b.PrependUOffsetT(offsets[1])
fv.b.PrependUOffsetT(offsets[0])
fv.offset = flatbuf.RunEndEncodedEnd(fv.b)
fv.kids = append(fv.kids, offsets[0], offsets[1])
case arrow.ExtensionType:
field.Type = dt.StorageType()
fv.visit(field)
fv.meta[ExtensionTypeKeyName] = dt.ExtensionName()
fv.meta[ExtensionMetadataKeyName] = string(dt.Serialize())
case *arrow.DictionaryType:
field.Type = dt.ValueType
fv.visit(field)
case arrow.UnionType:
fv.dtype = flatbuf.TypeUnion
offsets := make([]flatbuffers.UOffsetT, dt.NumFields())
for i, field := range dt.Fields() {
offsets[i] = fieldToFB(fv.b, fv.pos.Child(int32(i)), field, fv.memo)
}
codes := dt.TypeCodes()
flatbuf.UnionStartTypeIdsVector(fv.b, len(codes))
for i := len(codes) - 1; i >= 0; i-- {
fv.b.PlaceInt32(int32(codes[i]))
}
fbTypeIDs := fv.b.EndVector(len(dt.TypeCodes()))
flatbuf.UnionStart(fv.b)
switch dt.Mode() {
case arrow.SparseMode:
flatbuf.UnionAddMode(fv.b, flatbuf.UnionModeSparse)
case arrow.DenseMode:
flatbuf.UnionAddMode(fv.b, flatbuf.UnionModeDense)
default:
panic("invalid union mode")
}
flatbuf.UnionAddTypeIds(fv.b, fbTypeIDs)
fv.offset = flatbuf.UnionEnd(fv.b)
fv.kids = append(fv.kids, offsets...)
default:
err := fmt.Errorf("arrow/ipc: invalid data type %v", dt)
panic(err) // FIXME(sbinet): implement all data-types.
}
}