in arrow/array/dictionary.go [495:605]
func NewDictionaryBuilderWithDict(mem memory.Allocator, dt *arrow.DictionaryType, init arrow.Array) DictionaryBuilder {
if init != nil && !arrow.TypeEqual(dt.ValueType, init.DataType()) {
panic(fmt.Errorf("arrow/array: cannot initialize dictionary type %T with array of type %T", dt.ValueType, init.DataType()))
}
idxbldr, err := createIndexBuilder(mem, dt.IndexType.(arrow.FixedWidthDataType))
if err != nil {
panic(fmt.Errorf("arrow/array: unsupported builder for index type of %T", dt))
}
memo, err := createMemoTable(mem, dt.ValueType)
if err != nil {
panic(fmt.Errorf("arrow/array: unsupported builder for value type of %T", dt))
}
switch dt.ValueType.ID() {
case arrow.NULL:
ret := &NullDictionaryBuilder{
dictionaryBuilder: dictionaryBuilder{
builder: builder{mem: mem},
idxBuilder: idxbldr,
memoTable: memo,
dt: dt,
},
}
ret.builder.refCount.Add(1)
debug.Assert(init == nil, "arrow/array: doesn't make sense to init a null dictionary")
return ret
case arrow.UINT8:
return createDictBuilder[uint8](mem, idxbldr, memo, dt, init)
case arrow.INT8:
return createDictBuilder[int8](mem, idxbldr, memo, dt, init)
case arrow.UINT16:
return createDictBuilder[uint16](mem, idxbldr, memo, dt, init)
case arrow.INT16:
return createDictBuilder[int16](mem, idxbldr, memo, dt, init)
case arrow.UINT32:
return createDictBuilder[uint32](mem, idxbldr, memo, dt, init)
case arrow.INT32:
return createDictBuilder[int32](mem, idxbldr, memo, dt, init)
case arrow.UINT64:
return createDictBuilder[uint64](mem, idxbldr, memo, dt, init)
case arrow.INT64:
return createDictBuilder[int64](mem, idxbldr, memo, dt, init)
case arrow.FLOAT16:
return createDictBuilder[float16.Num](mem, idxbldr, memo, dt, init)
case arrow.FLOAT32:
return createDictBuilder[float32](mem, idxbldr, memo, dt, init)
case arrow.FLOAT64:
return createDictBuilder[float64](mem, idxbldr, memo, dt, init)
case arrow.STRING, arrow.BINARY:
return createBinaryDictBuilder(mem, idxbldr, memo, dt, init)
case arrow.FIXED_SIZE_BINARY:
ret := &FixedSizeBinaryDictionaryBuilder{
dictionaryBuilder: dictionaryBuilder{
builder: builder{mem: mem},
idxBuilder: idxbldr,
memoTable: memo,
dt: dt,
},
byteWidth: dt.ValueType.(*arrow.FixedSizeBinaryType).ByteWidth,
}
ret.builder.refCount.Add(1)
if init != nil {
if err = ret.InsertDictValues(init.(*FixedSizeBinary)); err != nil {
panic(err)
}
}
return ret
case arrow.DATE32:
return createDictBuilder[arrow.Date32](mem, idxbldr, memo, dt, init)
case arrow.DATE64:
return createDictBuilder[arrow.Date64](mem, idxbldr, memo, dt, init)
case arrow.TIMESTAMP:
return createDictBuilder[arrow.Timestamp](mem, idxbldr, memo, dt, init)
case arrow.TIME32:
return createDictBuilder[arrow.Time32](mem, idxbldr, memo, dt, init)
case arrow.TIME64:
return createDictBuilder[arrow.Time64](mem, idxbldr, memo, dt, init)
case arrow.INTERVAL_MONTHS:
return createDictBuilder[arrow.MonthInterval](mem, idxbldr, memo, dt, init)
case arrow.INTERVAL_DAY_TIME:
return createFixedSizeDictBuilder[arrow.DayTimeInterval](mem, idxbldr, memo, dt, init)
case arrow.DECIMAL32:
return createFixedSizeDictBuilder[decimal.Decimal32](mem, idxbldr, memo, dt, init)
case arrow.DECIMAL64:
return createFixedSizeDictBuilder[decimal.Decimal64](mem, idxbldr, memo, dt, init)
case arrow.DECIMAL128:
return createFixedSizeDictBuilder[decimal.Decimal128](mem, idxbldr, memo, dt, init)
case arrow.DECIMAL256:
return createFixedSizeDictBuilder[decimal.Decimal256](mem, idxbldr, memo, dt, init)
case arrow.LIST:
case arrow.STRUCT:
case arrow.SPARSE_UNION:
case arrow.DENSE_UNION:
case arrow.DICTIONARY:
case arrow.MAP:
case arrow.EXTENSION:
case arrow.FIXED_SIZE_LIST:
case arrow.DURATION:
return createDictBuilder[arrow.Duration](mem, idxbldr, memo, dt, init)
case arrow.LARGE_STRING:
case arrow.LARGE_BINARY:
case arrow.LARGE_LIST:
case arrow.INTERVAL_MONTH_DAY_NANO:
return createFixedSizeDictBuilder[arrow.MonthDayNanoInterval](mem, idxbldr, memo, dt, init)
}
panic("arrow/array: unimplemented dictionary key type")
}