in arrow/ipc/metadata.go [217:403]
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.Decimal128Type:
fv.dtype = flatbuf.TypeDecimal
flatbuf.DecimalStart(fv.b)
flatbuf.DecimalAddPrecision(fv.b, dt.Precision)
flatbuf.DecimalAddScale(fv.b, dt.Scale)
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.StringType:
fv.dtype = flatbuf.TypeUtf8
flatbuf.Utf8Start(fv.b)
fv.offset = flatbuf.Utf8End(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, len(dt.Fields()))
for i, field := range dt.Fields() {
offsets[i] = fieldToFB(fv.b, 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, dt.ElemField(), fv.memo))
flatbuf.ListStart(fv.b)
fv.offset = flatbuf.ListEnd(fv.b)
case *arrow.FixedSizeListType:
fv.dtype = flatbuf.TypeFixedSizeList
fv.kids = append(fv.kids, fieldToFB(fv.b, 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, dt.ValueField(), fv.memo))
flatbuf.MapStart(fv.b)
flatbuf.MapAddKeysSorted(fv.b, dt.KeysSorted)
fv.offset = flatbuf.MapEnd(fv.b)
case arrow.ExtensionType:
field.Type = dt.StorageType()
fv.visit(field)
fv.meta[ExtensionTypeKeyName] = dt.ExtensionName()
fv.meta[ExtensionMetadataKeyName] = string(dt.Serialize())
default:
err := xerrors.Errorf("arrow/ipc: invalid data type %v", dt)
panic(err) // FIXME(sbinet): implement all data-types.
}
}