in arrow/scalar/temporal.go [154:223]
func castTemporal(from TemporalScalar, to arrow.DataType) (Scalar, error) {
if arrow.TypeEqual(from.DataType(), to) {
return from, nil
}
if !from.IsValid() {
return MakeNullScalar(to), nil
}
if r, ok := numericMap[to.ID()]; ok {
return convertToNumeric(reflect.ValueOf(from.value()), r.valueType, r.scalarFunc), nil
}
if to.ID() == arrow.STRING {
return NewStringScalar(temporalToString(from)), nil
}
switch s := from.(type) {
case DateScalar:
if to.ID() == arrow.TIMESTAMP {
var newValue int64
switch s := s.(type) {
case *Date32:
newValue = int64(s.Value) * int64(millisecondsInDay)
case *Date64:
newValue = int64(s.Value)
}
return NewTimestampScalar(arrow.Timestamp(ConvertTimestampValue(arrow.Millisecond, to.(*arrow.TimestampType).Unit, newValue)), to), nil
}
switch s := s.(type) {
case *Date32:
if to.ID() == arrow.DATE64 {
return NewDate64Scalar(arrow.Date64(s.Value) * arrow.Date64(millisecondsInDay)), nil
}
case *Date64:
if to.ID() == arrow.DATE32 {
return NewDate32Scalar(arrow.Date32(s.Value / arrow.Date64(millisecondsInDay))), nil
}
}
case *Timestamp:
switch to := to.(type) {
case *arrow.TimestampType:
return NewTimestampScalar(arrow.Timestamp(ConvertTimestampValue(s.Unit(), to.Unit, int64(s.Value))), to), nil
case *arrow.Date32Type:
millis := ConvertTimestampValue(s.Unit(), arrow.Millisecond, int64(s.Value))
return NewDate32Scalar(arrow.Date32(millis / int64(millisecondsInDay))), nil
case *arrow.Date64Type:
millis := ConvertTimestampValue(s.Unit(), arrow.Millisecond, int64(s.Value))
return NewDate64Scalar(arrow.Date64(millis - millis%int64(millisecondsInDay))), nil
}
case TimeScalar:
switch to := to.(type) {
case *arrow.Time32Type:
return NewTime32Scalar(arrow.Time32(ConvertTimestampValue(s.Unit(), to.Unit, int64(s.value().(arrow.Time64)))), to), nil
case *arrow.Time64Type:
return NewTime64Scalar(arrow.Time64(ConvertTimestampValue(s.Unit(), to.Unit, int64(s.value().(arrow.Time32)))), to), nil
}
case *Duration:
switch to := to.(type) {
case *arrow.StringType:
case *arrow.DurationType:
return NewDurationScalar(arrow.Duration(ConvertTimestampValue(s.Unit(), to.Unit, int64(s.Value))), to), nil
}
}
return nil, xerrors.Errorf("")
}