in arrow/array/builder.go [257:382]
func NewBuilder(mem memory.Allocator, dtype arrow.DataType) Builder {
// FIXME(sbinet): use a type switch on dtype instead?
switch dtype.ID() {
case arrow.NULL:
return NewNullBuilder(mem)
case arrow.BOOL:
return NewBooleanBuilder(mem)
case arrow.UINT8:
return NewUint8Builder(mem)
case arrow.INT8:
return NewInt8Builder(mem)
case arrow.UINT16:
return NewUint16Builder(mem)
case arrow.INT16:
return NewInt16Builder(mem)
case arrow.UINT32:
return NewUint32Builder(mem)
case arrow.INT32:
return NewInt32Builder(mem)
case arrow.UINT64:
return NewUint64Builder(mem)
case arrow.INT64:
return NewInt64Builder(mem)
case arrow.FLOAT16:
return NewFloat16Builder(mem)
case arrow.FLOAT32:
return NewFloat32Builder(mem)
case arrow.FLOAT64:
return NewFloat64Builder(mem)
case arrow.STRING:
return NewStringBuilder(mem)
case arrow.LARGE_STRING:
return NewLargeStringBuilder(mem)
case arrow.BINARY:
return NewBinaryBuilder(mem, arrow.BinaryTypes.Binary)
case arrow.LARGE_BINARY:
return NewBinaryBuilder(mem, arrow.BinaryTypes.LargeBinary)
case arrow.FIXED_SIZE_BINARY:
typ := dtype.(*arrow.FixedSizeBinaryType)
return NewFixedSizeBinaryBuilder(mem, typ)
case arrow.DATE32:
return NewDate32Builder(mem)
case arrow.DATE64:
return NewDate64Builder(mem)
case arrow.TIMESTAMP:
typ := dtype.(*arrow.TimestampType)
return NewTimestampBuilder(mem, typ)
case arrow.TIME32:
typ := dtype.(*arrow.Time32Type)
return NewTime32Builder(mem, typ)
case arrow.TIME64:
typ := dtype.(*arrow.Time64Type)
return NewTime64Builder(mem, typ)
case arrow.INTERVAL_MONTHS:
return NewMonthIntervalBuilder(mem)
case arrow.INTERVAL_DAY_TIME:
return NewDayTimeIntervalBuilder(mem)
case arrow.INTERVAL_MONTH_DAY_NANO:
return NewMonthDayNanoIntervalBuilder(mem)
case arrow.DECIMAL32:
if typ, ok := dtype.(*arrow.Decimal32Type); ok {
return NewDecimal32Builder(mem, typ)
}
case arrow.DECIMAL64:
if typ, ok := dtype.(*arrow.Decimal64Type); ok {
return NewDecimal64Builder(mem, typ)
}
case arrow.DECIMAL128:
if typ, ok := dtype.(*arrow.Decimal128Type); ok {
return NewDecimal128Builder(mem, typ)
}
case arrow.DECIMAL256:
if typ, ok := dtype.(*arrow.Decimal256Type); ok {
return NewDecimal256Builder(mem, typ)
}
case arrow.LIST:
typ := dtype.(*arrow.ListType)
return NewListBuilderWithField(mem, typ.ElemField())
case arrow.STRUCT:
typ := dtype.(*arrow.StructType)
return NewStructBuilder(mem, typ)
case arrow.SPARSE_UNION:
typ := dtype.(*arrow.SparseUnionType)
return NewSparseUnionBuilder(mem, typ)
case arrow.DENSE_UNION:
typ := dtype.(*arrow.DenseUnionType)
return NewDenseUnionBuilder(mem, typ)
case arrow.DICTIONARY:
typ := dtype.(*arrow.DictionaryType)
return NewDictionaryBuilder(mem, typ)
case arrow.LARGE_LIST:
typ := dtype.(*arrow.LargeListType)
return NewLargeListBuilderWithField(mem, typ.ElemField())
case arrow.MAP:
typ := dtype.(*arrow.MapType)
return NewMapBuilderWithType(mem, typ)
case arrow.LIST_VIEW:
typ := dtype.(*arrow.ListViewType)
return NewListViewBuilderWithField(mem, typ.ElemField())
case arrow.LARGE_LIST_VIEW:
typ := dtype.(*arrow.LargeListViewType)
return NewLargeListViewBuilderWithField(mem, typ.ElemField())
case arrow.EXTENSION:
if custom, ok := dtype.(CustomExtensionBuilder); ok {
return custom.NewBuilder(mem)
}
if typ, ok := dtype.(arrow.ExtensionType); ok {
return NewExtensionBuilder(mem, typ)
}
panic(fmt.Errorf("arrow/array: invalid extension type: %T", dtype))
case arrow.FIXED_SIZE_LIST:
typ := dtype.(*arrow.FixedSizeListType)
return NewFixedSizeListBuilderWithField(mem, typ.Len(), typ.ElemField())
case arrow.DURATION:
typ := dtype.(*arrow.DurationType)
return NewDurationBuilder(mem, typ)
case arrow.RUN_END_ENCODED:
typ := dtype.(*arrow.RunEndEncodedType)
return NewRunEndEncodedBuilder(mem, typ.RunEnds(), typ.Encoded())
case arrow.BINARY_VIEW:
return NewBinaryViewBuilder(mem)
case arrow.STRING_VIEW:
return NewStringViewBuilder(mem)
}
panic(fmt.Errorf("arrow/array: unsupported builder for %T", dtype))
}