3737#include " arrow/util/logging.h"
3838#include " arrow/util/macros.h"
3939#include " arrow/util/parsing.h" // IWYU pragma: keep
40+ #include " arrow/util/time.h"
4041#include " arrow/util/utf8.h"
4142#include " arrow/visitor_inline.h"
4243
@@ -407,16 +408,17 @@ struct CastFunctor<
407408// From one timestamp to another
408409
409410template <typename in_type, typename out_type>
410- void ShiftTime (FunctionContext* ctx, const CastOptions& options, const bool is_multiply,
411- const int64_t factor, const ArrayData& input, ArrayData* output) {
411+ void ShiftTime (FunctionContext* ctx, const CastOptions& options,
412+ const util::DivideOrMultiply factor_op, const int64_t factor,
413+ const ArrayData& input, ArrayData* output) {
412414 const in_type* in_data = input.GetValues <in_type>(1 );
413415 auto out_data = output->GetMutableValues <out_type>(1 );
414416
415417 if (factor == 1 ) {
416418 for (int64_t i = 0 ; i < input.length ; i++) {
417419 out_data[i] = static_cast <out_type>(in_data[i]);
418420 }
419- } else if (is_multiply ) {
421+ } else if (factor_op == util:: MULTIPLY ) {
420422 if (options.allow_time_overflow ) {
421423 for (int64_t i = 0 ; i < input.length ; i++) {
422424 out_data[i] = static_cast <out_type>(in_data[i] * factor);
@@ -488,18 +490,6 @@ void ShiftTime(FunctionContext* ctx, const CastOptions& options, const bool is_m
488490 }
489491}
490492
491- namespace {
492-
493- // {is_multiply, factor}
494- const std::pair<bool , int64_t > kTimeConversionTable [4 ][4 ] = {
495- {{true , 1 }, {true , 1000 }, {true , 1000000 }, {true , 1000000000L }}, // SECOND
496- {{false , 1000 }, {true , 1 }, {true , 1000 }, {true , 1000000 }}, // MILLI
497- {{false , 1000000 }, {false , 1000 }, {true , 1 }, {true , 1000 }}, // MICRO
498- {{false , 1000000000L }, {false , 1000000 }, {false , 1000 }, {true , 1 }}, // NANO
499- };
500-
501- } // namespace
502-
503493// <TimestampType, TimestampType> and <DurationType, DurationType>
504494template <typename O, typename I>
505495struct CastFunctor <
@@ -517,10 +507,8 @@ struct CastFunctor<
517507 return ;
518508 }
519509
520- std::pair<bool , int64_t > conversion =
521- kTimeConversionTable [static_cast <int >(in_type.unit ())]
522- [static_cast <int >(out_type.unit ())];
523-
510+ auto conversion = util::kTimestampConversionTable [static_cast <int >(in_type.unit ())]
511+ [static_cast <int >(out_type.unit ())];
524512 ShiftTime<int64_t , int64_t >(ctx, options, conversion.first , conversion.second , input,
525513 output);
526514 }
@@ -540,7 +528,7 @@ struct CastFunctor<Date32Type, TimestampType> {
540528 };
541529
542530 const int64_t factor = kTimestampToDateFactors [static_cast <int >(in_type.unit ())];
543- ShiftTime<int64_t , int32_t >(ctx, options, false , factor, input, output);
531+ ShiftTime<int64_t , int32_t >(ctx, options, util:: DIVIDE , factor, input, output);
544532 }
545533};
546534
@@ -550,10 +538,8 @@ struct CastFunctor<Date64Type, TimestampType> {
550538 const ArrayData& input, ArrayData* output) {
551539 const auto & in_type = checked_cast<const TimestampType&>(*input.type );
552540
553- std::pair<bool , int64_t > conversion =
554- kTimeConversionTable [static_cast <int >(in_type.unit ())]
555- [static_cast <int >(TimeUnit::MILLI )];
556-
541+ auto conversion = util::kTimestampConversionTable [static_cast <int >(in_type.unit ())]
542+ [static_cast <int >(TimeUnit::MILLI )];
557543 ShiftTime<int64_t , int64_t >(ctx, options, conversion.first , conversion.second , input,
558544 output);
559545 if (!ctx->status ().ok ()) {
@@ -611,9 +597,8 @@ struct CastFunctor<O, I, enable_if_t<is_time_type<I>::value && is_time_type<O>::
611597 return ;
612598 }
613599
614- std::pair<bool , int64_t > conversion =
615- kTimeConversionTable [static_cast <int >(in_type.unit ())]
616- [static_cast <int >(out_type.unit ())];
600+ auto conversion = util::kTimestampConversionTable [static_cast <int >(in_type.unit ())]
601+ [static_cast <int >(out_type.unit ())];
617602
618603 ShiftTime<in_t , out_t >(ctx, options, conversion.first , conversion.second , input,
619604 output);
@@ -627,15 +612,17 @@ template <>
627612struct CastFunctor <Date64Type, Date32Type> {
628613 void operator ()(FunctionContext* ctx, const CastOptions& options,
629614 const ArrayData& input, ArrayData* output) {
630- ShiftTime<int32_t , int64_t >(ctx, options, true , kMillisecondsInDay , input, output);
615+ ShiftTime<int32_t , int64_t >(ctx, options, util::MULTIPLY , kMillisecondsInDay , input,
616+ output);
631617 }
632618};
633619
634620template <>
635621struct CastFunctor <Date32Type, Date64Type> {
636622 void operator ()(FunctionContext* ctx, const CastOptions& options,
637623 const ArrayData& input, ArrayData* output) {
638- ShiftTime<int64_t , int32_t >(ctx, options, false , kMillisecondsInDay , input, output);
624+ ShiftTime<int64_t , int32_t >(ctx, options, util::DIVIDE , kMillisecondsInDay , input,
625+ output);
639626 }
640627};
641628
0 commit comments