in arrow/scalar/parse.go [657:777]
func ParseScalar(dt arrow.DataType, val string) (Scalar, error) {
switch dt.ID() {
case arrow.STRING:
return NewStringScalar(val), nil
case arrow.BINARY:
buf := memory.NewBufferBytes([]byte(val))
defer buf.Release()
return NewBinaryScalar(buf, dt), nil
case arrow.FIXED_SIZE_BINARY:
if len(val) != dt.(*arrow.FixedSizeBinaryType).ByteWidth {
return nil, fmt.Errorf("invalid value %s for scalar of type %s", val, dt)
}
buf := memory.NewBufferBytes([]byte(val))
defer buf.Release()
return NewFixedSizeBinaryScalar(buf, dt), nil
case arrow.BOOL:
val, err := strconv.ParseBool(val)
if err != nil {
return nil, err
}
return NewBooleanScalar(val), nil
case arrow.INT8, arrow.INT16, arrow.INT32, arrow.INT64:
width := dt.(arrow.FixedWidthDataType).BitWidth()
val, err := strconv.ParseInt(val, 0, width)
if err != nil {
return nil, err
}
return MakeIntegerScalar(val, width)
case arrow.UINT8, arrow.UINT16, arrow.UINT32, arrow.UINT64:
width := dt.(arrow.FixedWidthDataType).BitWidth()
val, err := strconv.ParseUint(val, 0, width)
if err != nil {
return nil, err
}
return MakeUnsignedIntegerScalar(val, width)
case arrow.FLOAT16:
val, err := strconv.ParseFloat(val, 32)
if err != nil {
return nil, err
}
return NewFloat16ScalarFromFloat32(float32(val)), nil
case arrow.FLOAT32, arrow.FLOAT64:
width := dt.(arrow.FixedWidthDataType).BitWidth()
val, err := strconv.ParseFloat(val, width)
if err != nil {
return nil, err
}
switch width {
case 32:
return NewFloat32Scalar(float32(val)), nil
case 64:
return NewFloat64Scalar(float64(val)), nil
}
case arrow.TIMESTAMP:
value, err := arrow.TimestampFromString(val, dt.(*arrow.TimestampType).Unit)
if err != nil {
return nil, err
}
return NewTimestampScalar(value, dt), nil
case arrow.DURATION:
value, err := time.ParseDuration(val)
if err != nil {
return nil, err
}
unit := dt.(*arrow.DurationType).Unit
var out arrow.Duration
switch unit {
case arrow.Nanosecond:
out = arrow.Duration(value.Nanoseconds())
case arrow.Microsecond:
out = arrow.Duration(value.Microseconds())
case arrow.Millisecond:
out = arrow.Duration(value.Milliseconds())
case arrow.Second:
out = arrow.Duration(value.Seconds())
}
return NewDurationScalar(out, dt), nil
case arrow.DATE32, arrow.DATE64:
out, err := time.ParseInLocation("2006-01-02", val, time.UTC)
if err != nil {
return nil, err
}
if dt.ID() == arrow.DATE32 {
return NewDate32Scalar(arrow.Date32FromTime(out)), nil
} else {
return NewDate64Scalar(arrow.Date64FromTime(out)), nil
}
case arrow.TIME32:
tm, err := arrow.Time32FromString(val, dt.(*arrow.Time32Type).Unit)
if err != nil {
return nil, err
}
return NewTime32Scalar(tm, dt), nil
case arrow.TIME64:
tm, err := arrow.Time64FromString(val, dt.(*arrow.Time64Type).Unit)
if err != nil {
return nil, err
}
return NewTime64Scalar(tm, dt), nil
case arrow.DICTIONARY:
return ParseScalar(dt.(*arrow.DictionaryType).ValueType, val)
case arrow.DECIMAL128:
typ := dt.(*arrow.Decimal128Type)
n, err := decimal128.FromString(val, typ.Precision, typ.Scale)
if err != nil {
return nil, err
}
return NewDecimal128Scalar(n, typ), nil
case arrow.DECIMAL256:
typ := dt.(*arrow.Decimal256Type)
n, err := decimal256.FromString(val, typ.Precision, typ.Scale)
if err != nil {
return nil, err
}
return NewDecimal256Scalar(n, typ), nil
}
return nil, fmt.Errorf("parsing of scalar for type %s not implemented", dt)
}