func()

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.
	}
}