in arrow/scalar/scalar.go [468:560]
func GetScalar(arr array.Interface, idx int) (Scalar, error) {
switch arr := arr.(type) {
case *array.Binary:
buf := memory.NewBufferBytes(arr.Value(idx))
defer buf.Release()
return NewBinaryScalar(buf, arr.DataType()), nil
case *array.Boolean:
return NewBooleanScalar(arr.Value(idx)), nil
case *array.Date32:
return NewDate32Scalar(arr.Value(idx)), nil
case *array.Date64:
return NewDate64Scalar(arr.Value(idx)), nil
case *array.DayTimeInterval:
return NewDayTimeIntervalScalar(arr.Value(idx)), nil
case *array.Decimal128:
return NewDecimal128Scalar(arr.Value(idx), arr.DataType()), nil
case *array.Duration:
return NewDurationScalar(arr.Value(idx), arr.DataType()), nil
case array.ExtensionArray:
storage, err := GetScalar(arr.Storage(), idx)
if err != nil {
return nil, err
}
return NewExtensionScalar(storage, arr.DataType()), nil
case *array.FixedSizeBinary:
buf := memory.NewBufferBytes(arr.Value(idx))
defer buf.Release()
return NewFixedSizeBinaryScalar(buf, arr.DataType()), nil
case *array.FixedSizeList:
size := int(arr.DataType().(*arrow.FixedSizeListType).Len())
slice := array.NewSlice(arr.ListValues(), int64(idx*size), int64((idx+1)*size))
defer slice.Release()
return NewFixedSizeListScalarWithType(slice, arr.DataType()), nil
case *array.Float16:
return NewFloat16Scalar(arr.Value(idx)), nil
case *array.Float32:
return NewFloat32Scalar(arr.Value(idx)), nil
case *array.Float64:
return NewFloat64Scalar(arr.Value(idx)), nil
case *array.Int8:
return NewInt8Scalar(arr.Value(idx)), nil
case *array.Int16:
return NewInt16Scalar(arr.Value(idx)), nil
case *array.Int32:
return NewInt32Scalar(arr.Value(idx)), nil
case *array.Int64:
return NewInt64Scalar(arr.Value(idx)), nil
case *array.Uint8:
return NewUint8Scalar(arr.Value(idx)), nil
case *array.Uint16:
return NewUint16Scalar(arr.Value(idx)), nil
case *array.Uint32:
return NewUint32Scalar(arr.Value(idx)), nil
case *array.Uint64:
return NewUint64Scalar(arr.Value(idx)), nil
case *array.List:
offsets := arr.Offsets()
slice := array.NewSlice(arr.ListValues(), int64(offsets[idx]), int64(offsets[idx+1]))
defer slice.Release()
return NewListScalar(slice), nil
case *array.Map:
offsets := arr.Offsets()
slice := array.NewSlice(arr.ListValues(), int64(offsets[idx]), int64(offsets[idx+1]))
defer slice.Release()
return NewMapScalar(slice), nil
case *array.MonthInterval:
return NewMonthIntervalScalar(arr.Value(idx)), nil
case *array.MonthDayNanoInterval:
return NewMonthDayNanoIntervalScalar(arr.Value(idx)), nil
case *array.Null:
return ScalarNull, nil
case *array.String:
return NewStringScalar(arr.Value(idx)), nil
case *array.Struct:
children := make(Vector, arr.NumField())
for i := range children {
child, err := GetScalar(arr.Field(i), idx)
if err != nil {
return nil, err
}
children[i] = child
}
return NewStructScalar(children, arr.DataType()), nil
case *array.Time32:
return NewTime32Scalar(arr.Value(idx), arr.DataType()), nil
case *array.Time64:
return NewTime64Scalar(arr.Value(idx), arr.DataType()), nil
case *array.Timestamp:
return NewTimestampScalar(arr.Value(idx), arr.DataType()), nil
}
return nil, xerrors.Errorf("cannot create scalar from array of type %s", arr.DataType())
}