You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by yi...@apache.org on 2022/07/23 14:59:04 UTC
[doris] branch master updated: [Improvement] Replace `switch` with `constexpr` to boost date functions (#11134)
This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new 829d534e12 [Improvement] Replace `switch` with `constexpr` to boost date functions (#11134)
829d534e12 is described below
commit 829d534e12ca0e76f836868eeac6378e8c4f801e
Author: Gabriel <ga...@gmail.com>
AuthorDate: Sat Jul 23 22:58:59 2022 +0800
[Improvement] Replace `switch` with `constexpr` to boost date functions (#11134)
---
be/src/exprs/cast_functions.cpp | 17 +-
be/src/runtime/datetime_value.h | 33 +++-
.../aggregate_function_window_funnel.h | 2 +-
.../function_date_or_datetime_computation.h | 4 +-
.../vec/functions/function_datetime_floor_ceil.cpp | 2 +-
be/src/vec/functions/function_timestamp.cpp | 4 +-
be/src/vec/runtime/vdatetime_value.cpp | 195 +++++++--------------
be/src/vec/runtime/vdatetime_value.h | 25 ++-
be/test/vec/core/block_test.cpp | 8 +-
9 files changed, 112 insertions(+), 178 deletions(-)
diff --git a/be/src/exprs/cast_functions.cpp b/be/src/exprs/cast_functions.cpp
index 2b6d4c8a08..9885d9941e 100644
--- a/be/src/exprs/cast_functions.cpp
+++ b/be/src/exprs/cast_functions.cpp
@@ -34,15 +34,6 @@
#include "vec/data_types/data_type_decimal.h"
#include "vec/runtime/vdatetime_value.h"
-namespace doris::vectorized {
-template <>
-void doris::vectorized::DateV2Value<doris::vectorized::DateV2ValueType>::convert_date_v2_to_dt(
- doris::DateTimeValue* dt);
-template <>
-void doris::vectorized::DateV2Value<doris::vectorized::DateTimeV2ValueType>::convert_date_v2_to_dt(
- doris::DateTimeValue* dt);
-} // namespace doris::vectorized
-
namespace doris {
void CastFunctions::init() {}
@@ -626,7 +617,7 @@ DateTimeVal CastFunctions::cast_to_date_val(FunctionContext* ctx, const DateV2Va
vectorized::DateV2Value<doris::vectorized::DateV2ValueType> datev2_val =
vectorized::DateV2Value<doris::vectorized::DateV2ValueType>::from_datev2_val(val);
DateTimeValue datetime_value;
- datev2_val.convert_date_v2_to_dt(&datetime_value);
+ datetime_value.convert_from_date_v2<doris::vectorized::DateV2ValueType>(&datev2_val);
DateTimeVal result;
datetime_value.to_datetime_val(&result);
return result;
@@ -640,7 +631,7 @@ DateTimeVal CastFunctions::cast_to_date_val(FunctionContext* ctx, const DateTime
vectorized::DateV2Value<doris::vectorized::DateTimeV2ValueType>::from_datetimev2_val(
val);
DateTimeValue datetime_value;
- datev2_val.convert_date_v2_to_dt(&datetime_value);
+ datetime_value.convert_from_date_v2<doris::vectorized::DateTimeV2ValueType>(&datev2_val);
DateTimeVal result;
datetime_value.to_datetime_val(&result);
return result;
@@ -653,7 +644,7 @@ DateTimeVal CastFunctions::cast_to_datetime_val(FunctionContext* ctx, const Date
vectorized::DateV2Value<doris::vectorized::DateV2ValueType> datev2_val =
vectorized::DateV2Value<doris::vectorized::DateV2ValueType>::from_datev2_val(val);
DateTimeValue datetime_value;
- datev2_val.convert_date_v2_to_dt(&datetime_value);
+ datetime_value.convert_from_date_v2<doris::vectorized::DateV2ValueType>(&datev2_val);
datetime_value.set_type(TYPE_DATETIME);
DateTimeVal result;
datetime_value.to_datetime_val(&result);
@@ -668,7 +659,7 @@ DateTimeVal CastFunctions::cast_to_datetime_val(FunctionContext* ctx, const Date
vectorized::DateV2Value<doris::vectorized::DateTimeV2ValueType>::from_datetimev2_val(
val);
DateTimeValue datetime_value;
- datev2_val.convert_date_v2_to_dt(&datetime_value);
+ datetime_value.convert_from_date_v2<doris::vectorized::DateTimeV2ValueType>(&datev2_val);
datetime_value.set_type(TYPE_DATETIME);
DateTimeVal result;
datetime_value.to_datetime_val(&result);
diff --git a/be/src/runtime/datetime_value.h b/be/src/runtime/datetime_value.h
index 91e0f83c62..36c63df045 100644
--- a/be/src/runtime/datetime_value.h
+++ b/be/src/runtime/datetime_value.h
@@ -565,19 +565,36 @@ public:
_month > 0 && _day > 0;
}
+ template <typename T>
+ void convert_from_date_v2(doris::vectorized::DateV2Value<T>* dt) {
+ if constexpr (doris::vectorized::DateV2Value<T>::is_datetime) {
+ this->_type = TIME_DATETIME;
+ this->_hour = dt->hour();
+ this->_minute = dt->minute();
+ this->_second = dt->second();
+ } else {
+ this->_type = TIME_DATE;
+ this->_hour = 0;
+ this->_minute = 0;
+ this->_second = 0;
+ }
+ this->_neg = 0;
+ this->_year = dt->year();
+ this->_month = dt->month();
+ this->_day = dt->day();
+ this->_microsecond = 0;
+ }
+
+ template <typename T>
+ void convert_to_date_v2(doris::vectorized::DateV2Value<T>* dt) {
+ dt->set_time(dt->year(), dt->month(), dt->_day, dt->hour(), dt->minute(), dt->second(), 0);
+ }
+
private:
// Used to make sure sizeof DateTimeValue
friend class UnusedClass;
friend void doris::vectorized::VecDateTimeValue::convert_vec_dt_to_dt(DateTimeValue* dt);
friend void doris::vectorized::VecDateTimeValue::convert_dt_to_vec_dt(DateTimeValue* dt);
- friend void doris::vectorized::DateV2Value<
- doris::vectorized::DateV2ValueType>::convert_date_v2_to_dt(DateTimeValue* dt);
- friend void doris::vectorized::DateV2Value<
- doris::vectorized::DateV2ValueType>::convert_dt_to_date_v2(DateTimeValue* dt);
- friend void doris::vectorized::DateV2Value<
- doris::vectorized::DateTimeV2ValueType>::convert_date_v2_to_dt(DateTimeValue* dt);
- friend void doris::vectorized::DateV2Value<
- doris::vectorized::DateTimeV2ValueType>::convert_dt_to_date_v2(DateTimeValue* dt);
void from_packed_time(int64_t packed_time) {
_microsecond = packed_time % (1LL << 24);
diff --git a/be/src/vec/aggregate_functions/aggregate_function_window_funnel.h b/be/src/vec/aggregate_functions/aggregate_function_window_funnel.h
index 92eb8d99f0..09f07236b2 100644
--- a/be/src/vec/aggregate_functions/aggregate_function_window_funnel.h
+++ b/be/src/vec/aggregate_functions/aggregate_function_window_funnel.h
@@ -82,7 +82,7 @@ struct WindowFunnelState {
const DateValueType& first_timestamp = events_timestamp[event_idx - 1].value();
DateValueType last_timestamp = first_timestamp;
TimeInterval interval(SECOND, window, false);
- last_timestamp.date_add_interval(interval, SECOND);
+ last_timestamp.template date_add_interval<SECOND>(interval);
if (timestamp <= last_timestamp) {
events_timestamp[event_idx] = first_timestamp;
diff --git a/be/src/vec/functions/function_date_or_datetime_computation.h b/be/src/vec/functions/function_date_or_datetime_computation.h
index 107d8db493..ad03133b31 100644
--- a/be/src/vec/functions/function_date_or_datetime_computation.h
+++ b/be/src/vec/functions/function_date_or_datetime_computation.h
@@ -39,12 +39,12 @@ inline ResultType date_time_add(const Arg& t, Int64 delta, bool& is_null) {
TimeInterval interval(unit, delta, false);
if constexpr (std::is_same_v<VecDateTimeValue, DateValueType> ||
std::is_same_v<DateValueType, ResultDateValueType>) {
- is_null = !ts_value.date_add_interval(interval, unit);
+ is_null = !(ts_value.template date_add_interval<unit>(interval));
return binary_cast<ResultDateValueType, ResultType>(ts_value);
} else {
ResultDateValueType res;
- is_null = !ts_value.date_add_interval(interval, unit, res);
+ is_null = !(ts_value.template date_add_interval<unit>(interval, res));
return binary_cast<ResultDateValueType, ResultType>(res);
}
diff --git a/be/src/vec/functions/function_datetime_floor_ceil.cpp b/be/src/vec/functions/function_datetime_floor_ceil.cpp
index 9003b932df..45d1514b49 100644
--- a/be/src/vec/functions/function_datetime_floor_ceil.cpp
+++ b/be/src/vec/functions/function_datetime_floor_ceil.cpp
@@ -239,7 +239,7 @@ struct TimeRound {
: count);
bool is_neg = step < 0;
TimeInterval interval(Impl::Unit, is_neg ? -step : step, is_neg);
- is_null = !ts1.date_add_interval(interval, Impl::Unit);
+ is_null = !ts1.date_add_interval<Impl::Unit>(interval);
return;
}
diff --git a/be/src/vec/functions/function_timestamp.cpp b/be/src/vec/functions/function_timestamp.cpp
index 4c3786dfba..ea6defb0dd 100644
--- a/be/src/vec/functions/function_timestamp.cpp
+++ b/be/src/vec/functions/function_timestamp.cpp
@@ -113,7 +113,7 @@ struct MakeDateImpl {
TimeInterval interval(DAY, r - 1, false);
res_val = VecDateTimeValue::from_datetime_val(ts_val);
- if (!res_val.date_add_interval(interval, DAY)) {
+ if (!res_val.date_add_interval<DAY>(interval)) {
null_map[i] = 1;
continue;
}
@@ -122,7 +122,7 @@ struct MakeDateImpl {
DateV2Value<DateV2ValueType>* value = new (&res[i]) DateV2Value<DateV2ValueType>();
value->set_time(l, 1, 1);
TimeInterval interval(DAY, r - 1, false);
- if (!value->date_add_interval(interval, DAY, *value)) {
+ if (!value->date_add_interval<DAY>(interval, *value)) {
null_map[i] = 1;
}
}
diff --git a/be/src/vec/runtime/vdatetime_value.cpp b/be/src/vec/runtime/vdatetime_value.cpp
index 1b3bcfdb37..880ca20449 100644
--- a/be/src/vec/runtime/vdatetime_value.cpp
+++ b/be/src/vec/runtime/vdatetime_value.cpp
@@ -1465,24 +1465,17 @@ int64_t VecDateTimeValue::second_diff(const DateV2Value<T>& rhs) const {
return day_diff * 3600 * 24 + time_diff;
}
-bool VecDateTimeValue::date_add_interval(const TimeInterval& interval, TimeUnit unit) {
+template <TimeUnit unit>
+bool VecDateTimeValue::date_add_interval(const TimeInterval& interval) {
if (!is_valid_date()) return false;
int sign = interval.is_neg ? -1 : 1;
- switch (unit) {
- case SECOND:
- case MINUTE:
- case HOUR:
- case SECOND_MICROSECOND:
- case MINUTE_MICROSECOND:
- case MINUTE_SECOND:
- case HOUR_MICROSECOND:
- case HOUR_SECOND:
- case HOUR_MINUTE:
- case DAY_MICROSECOND:
- case DAY_SECOND:
- case DAY_MINUTE:
- case DAY_HOUR: {
+
+ if constexpr ((unit == SECOND) || (unit == MINUTE) || (unit == HOUR) ||
+ (unit == SECOND_MICROSECOND) || (unit == MINUTE_MICROSECOND) ||
+ (unit == MINUTE_SECOND) || (unit == HOUR_MICROSECOND) || (unit == HOUR_SECOND) ||
+ (unit == HOUR_MINUTE) || (unit == DAY_MICROSECOND) || (unit == DAY_SECOND) ||
+ (unit == DAY_MINUTE) || (unit == DAY_HOUR)) {
// This may change the day information
int64_t seconds = (_day - 1) * 86400L + _hour * 3600L + _minute * 60 + _second +
@@ -1502,18 +1495,13 @@ bool VecDateTimeValue::date_add_interval(const TimeInterval& interval, TimeUnit
return false;
}
_type = TIME_DATETIME;
- break;
- }
- case DAY:
- case WEEK: {
+ } else if constexpr ((unit == DAY) || (unit == WEEK)) {
// This only change day information, not change second information
int64_t day_nr = daynr() + interval.day * sign;
if (!get_date_from_daynr(day_nr)) {
return false;
}
- break;
- }
- case YEAR: {
+ } else if constexpr (unit == YEAR) {
// This only change year information
_year += sign * interval.year;
if (_year > 9999) {
@@ -1522,11 +1510,7 @@ bool VecDateTimeValue::date_add_interval(const TimeInterval& interval, TimeUnit
if (_month == 2 && _day == 29 && !doris::is_leap(_year)) {
_day = 28;
}
- break;
- }
- case MONTH:
- case QUARTER:
- case YEAR_MONTH: {
+ } else if constexpr (unit == QUARTER || unit == MONTH || unit == YEAR_MONTH) {
// This will change month and year information, maybe date.
int64_t months = _year * 12 + _month - 1 + sign * (12 * interval.year + interval.month);
_year = months / 12;
@@ -1540,9 +1524,8 @@ bool VecDateTimeValue::date_add_interval(const TimeInterval& interval, TimeUnit
_day++;
}
}
- break;
- }
}
+
return true;
}
@@ -2385,61 +2368,20 @@ bool DateV2Value<T>::get_date_from_daynr(uint64_t daynr) {
}
template <typename T>
-template <typename TO>
-bool DateV2Value<T>::date_add_interval(const TimeInterval& interval, TimeUnit unit,
- DateV2Value<TO>& to_value) {
+template <TimeUnit unit, typename TO>
+bool DateV2Value<T>::date_add_interval(const TimeInterval& interval, DateV2Value<TO>& to_value) {
if (!is_valid_date()) return false;
- switch (unit) {
- case SECOND:
- case MINUTE:
- case HOUR:
- case SECOND_MICROSECOND:
- case MINUTE_MICROSECOND:
- case MINUTE_SECOND:
- case HOUR_MICROSECOND:
- case HOUR_SECOND:
- case HOUR_MINUTE:
- case DAY_MICROSECOND:
- case DAY_SECOND:
- case DAY_MINUTE:
- case DAY_HOUR: {
- if constexpr (DateV2Value<TO>::is_datetime) {
- // This may change the day information
- int64_t seconds = (this->day() - 1) * 86400L + this->hour() * 3600L +
- this->minute() * 60 + this->second() + interval.day * 86400 +
- interval.hour * 3600 + interval.minute * 60 + interval.second;
- uint64_t microsecond = interval.microsecond + this->microsecond();
- if (microsecond > 1000000) {
- seconds += 1;
- microsecond %= 1000000;
- }
- int64_t days = seconds / 86400;
- seconds %= 86400L;
- if (seconds < 0) {
- seconds += 86400L;
- days--;
- }
- to_value.set_time(seconds / 3600, (seconds / 60) % 60, seconds % 60, microsecond);
- int64_t day_nr = doris::calc_daynr(this->year(), this->month(), 1) + days;
- if (!to_value.get_date_from_daynr(day_nr)) {
- return false;
- }
- break;
- } else {
- LOG(FATAL) << "Invalid interval to add " << int(unit) << " for date!";
- }
- }
- case DAY:
- case WEEK: {
- // This only change day information, not change second information
+ if constexpr ((unit == SECOND) || (unit == MINUTE) || (unit == HOUR) ||
+ (unit == SECOND_MICROSECOND) || (unit == MINUTE_MICROSECOND) ||
+ (unit == MINUTE_SECOND) || (unit == HOUR_MICROSECOND) || (unit == HOUR_SECOND) ||
+ (unit == HOUR_MINUTE) || (unit == DAY_MICROSECOND) || (unit == DAY_SECOND) ||
+ (unit == DAY_MINUTE) || (unit == DAY_HOUR) || (unit == DAY) || (unit == WEEK)) {
uint32_t day_nr = daynr() + interval.day;
if (!to_value.get_date_from_daynr(day_nr)) {
return false;
}
- break;
- }
- case YEAR: {
+ } else if constexpr (unit == YEAR) {
// This only change year information
to_value.template set_time_unit<TimeUnit::YEAR>(date_v2_value_.year_ + interval.year);
if (to_value.year() > 9999) {
@@ -2449,11 +2391,7 @@ bool DateV2Value<T>::date_add_interval(const TimeInterval& interval, TimeUnit un
!doris::is_leap(to_value.year())) {
to_value.template set_time_unit<TimeUnit::DAY>(28);
}
- break;
- }
- case MONTH:
- case QUARTER:
- case YEAR_MONTH: {
+ } else if constexpr (unit == QUARTER || unit == MONTH || unit == YEAR_MONTH) {
// This will change month and year information, maybe date.
int64_t months = date_v2_value_.year_ * 12 + date_v2_value_.month_ - 1 +
12 * interval.year + interval.month;
@@ -2468,8 +2406,6 @@ bool DateV2Value<T>::date_add_interval(const TimeInterval& interval, TimeUnit un
to_value.template set_time_unit<TimeUnit::DAY>(date_v2_value_.day_ + 1);
}
}
- break;
- }
}
return true;
}
@@ -2569,38 +2505,6 @@ void DateV2Value<T>::set_time(uint8_t hour, uint8_t minute, uint8_t second, uint
}
}
-template <typename T>
-void DateV2Value<T>::convert_date_v2_to_dt(doris::DateTimeValue* dt) {
- if constexpr (is_datetime) {
- dt->_type = TIME_DATETIME;
- dt->_hour = this->hour();
- dt->_minute = this->minute();
- dt->_second = this->second();
- } else {
- dt->_type = TIME_DATE;
- dt->_hour = 0;
- dt->_minute = 0;
- dt->_second = 0;
- }
- dt->_neg = 0;
- dt->_year = date_v2_value_.year_;
- dt->_month = date_v2_value_.month_;
- dt->_day = date_v2_value_.day_;
- dt->_microsecond = 0;
-}
-
-template <typename T>
-void DateV2Value<T>::convert_dt_to_date_v2(doris::DateTimeValue* dt) {
- date_v2_value_.year_ = dt->_year;
- date_v2_value_.month_ = dt->_month;
- date_v2_value_.day_ = dt->_day;
- if constexpr (is_datetime) {
- date_v2_value_.hour_ = dt->hour();
- date_v2_value_.minute_ = dt->minute();
- date_v2_value_.second_ = dt->second();
- }
-}
-
template <typename T>
bool DateV2Value<T>::to_format_string(const char* format, int len, char* to) const {
char buf[64];
@@ -3022,21 +2926,44 @@ template int64_t VecDateTimeValue::second_diff<DateV2ValueType>(
template int64_t VecDateTimeValue::second_diff<DateTimeV2ValueType>(
const DateV2Value<DateTimeV2ValueType>& rhs) const;
-template bool doris::vectorized::DateV2Value<doris::vectorized::DateV2ValueType>::date_add_interval<
- doris::vectorized::DateTimeV2ValueType>(
- doris::vectorized::TimeInterval const&, doris::vectorized::TimeUnit,
- doris::vectorized::DateV2Value<doris::vectorized::DateTimeV2ValueType>&);
-template bool doris::vectorized::DateV2Value<doris::vectorized::DateV2ValueType>::date_add_interval<
- doris::vectorized::DateV2ValueType>(
- doris::vectorized::TimeInterval const&, doris::vectorized::TimeUnit,
- doris::vectorized::DateV2Value<doris::vectorized::DateV2ValueType>&);
-
-template bool doris::vectorized::DateV2Value<doris::vectorized::DateTimeV2ValueType>::
- date_add_interval<doris::vectorized::DateTimeV2ValueType>(
- doris::vectorized::TimeInterval const&, doris::vectorized::TimeUnit,
- doris::vectorized::DateV2Value<doris::vectorized::DateTimeV2ValueType>&);
-template bool doris::vectorized::DateV2Value<doris::vectorized::DateTimeV2ValueType>::
- date_add_interval<doris::vectorized::DateV2ValueType>(
- doris::vectorized::TimeInterval const&, doris::vectorized::TimeUnit,
- doris::vectorized::DateV2Value<doris::vectorized::DateV2ValueType>&);
+#define DELARE_DATE_ADD_INTERVAL(DateValueType1, DateValueType2) \
+ template bool doris::vectorized::DateV2Value<DateValueType1>::date_add_interval< \
+ TimeUnit::SECOND, DateValueType2>(doris::vectorized::TimeInterval const&, \
+ doris::vectorized::DateV2Value<DateValueType2>&); \
+ template bool doris::vectorized::DateV2Value<DateValueType1>::date_add_interval< \
+ TimeUnit::MINUTE, DateValueType2>(doris::vectorized::TimeInterval const&, \
+ doris::vectorized::DateV2Value<DateValueType2>&); \
+ template bool doris::vectorized::DateV2Value<DateValueType1>::date_add_interval< \
+ TimeUnit::HOUR, DateValueType2>(doris::vectorized::TimeInterval const&, \
+ doris::vectorized::DateV2Value<DateValueType2>&); \
+ template bool doris::vectorized::DateV2Value<DateValueType1>::date_add_interval< \
+ TimeUnit::DAY, DateValueType2>(doris::vectorized::TimeInterval const&, \
+ doris::vectorized::DateV2Value<DateValueType2>&); \
+ template bool doris::vectorized::DateV2Value<DateValueType1>::date_add_interval< \
+ TimeUnit::MONTH, DateValueType2>(doris::vectorized::TimeInterval const&, \
+ doris::vectorized::DateV2Value<DateValueType2>&); \
+ template bool doris::vectorized::DateV2Value<DateValueType1>::date_add_interval< \
+ TimeUnit::YEAR, DateValueType2>(doris::vectorized::TimeInterval const&, \
+ doris::vectorized::DateV2Value<DateValueType2>&); \
+ template bool doris::vectorized::DateV2Value<DateValueType1>::date_add_interval< \
+ TimeUnit::QUARTER, DateValueType2>(doris::vectorized::TimeInterval const&, \
+ doris::vectorized::DateV2Value<DateValueType2>&); \
+ template bool doris::vectorized::DateV2Value<DateValueType1>::date_add_interval< \
+ TimeUnit::WEEK, DateValueType2>(doris::vectorized::TimeInterval const&, \
+ doris::vectorized::DateV2Value<DateValueType2>&);
+
+DELARE_DATE_ADD_INTERVAL(DateV2ValueType, DateV2ValueType)
+DELARE_DATE_ADD_INTERVAL(DateV2ValueType, DateTimeV2ValueType)
+DELARE_DATE_ADD_INTERVAL(DateTimeV2ValueType, DateV2ValueType)
+DELARE_DATE_ADD_INTERVAL(DateTimeV2ValueType, DateTimeV2ValueType)
+
+template bool VecDateTimeValue::date_add_interval<TimeUnit::SECOND>(const TimeInterval& interval);
+template bool VecDateTimeValue::date_add_interval<TimeUnit::MINUTE>(const TimeInterval& interval);
+template bool VecDateTimeValue::date_add_interval<TimeUnit::HOUR>(const TimeInterval& interval);
+template bool VecDateTimeValue::date_add_interval<TimeUnit::DAY>(const TimeInterval& interval);
+template bool VecDateTimeValue::date_add_interval<TimeUnit::MONTH>(const TimeInterval& interval);
+template bool VecDateTimeValue::date_add_interval<TimeUnit::YEAR>(const TimeInterval& interval);
+template bool VecDateTimeValue::date_add_interval<TimeUnit::QUARTER>(const TimeInterval& interval);
+template bool VecDateTimeValue::date_add_interval<TimeUnit::WEEK>(const TimeInterval& interval);
+
} // namespace doris::vectorized
diff --git a/be/src/vec/runtime/vdatetime_value.h b/be/src/vec/runtime/vdatetime_value.h
index 83a37803b5..350b8b7373 100644
--- a/be/src/vec/runtime/vdatetime_value.h
+++ b/be/src/vec/runtime/vdatetime_value.h
@@ -458,7 +458,8 @@ public:
uint32_t year_week(uint8_t mode) const;
// Add interval
- bool date_add_interval(const TimeInterval& interval, TimeUnit unit);
+ template <TimeUnit unit>
+ bool date_add_interval(const TimeInterval& interval);
//unix_timestamp is called with a timezone argument,
//it returns seconds of the value of date literal since '1970-01-01 00:00:00' UTC
@@ -526,17 +527,17 @@ public:
switch (_type) {
case TIME_DATE: {
TimeInterval interval(DAY, 1, false);
- date_add_interval(interval, DAY);
+ date_add_interval<DAY>(interval);
break;
}
case TIME_DATETIME: {
TimeInterval interval(SECOND, 1, false);
- date_add_interval(interval, SECOND);
+ date_add_interval<SECOND>(interval);
break;
}
case TIME_TIME: {
TimeInterval interval(SECOND, 1, false);
- date_add_interval(interval, SECOND);
+ date_add_interval<SECOND>(interval);
break;
}
}
@@ -907,11 +908,12 @@ public:
uint32_t year_week(uint8_t mode) const;
// Add interval
- template <typename TO>
- bool date_add_interval(const TimeInterval& interval, TimeUnit unit, DateV2Value<TO>& to_value);
+ template <TimeUnit unit, typename TO>
+ bool date_add_interval(const TimeInterval& interval, DateV2Value<TO>& to_value);
- bool date_add_interval(const TimeInterval& interval, TimeUnit unit) {
- return this->date_add_interval(interval, unit, *this);
+ template <TimeUnit unit>
+ bool date_add_interval(const TimeInterval& interval) {
+ return this->date_add_interval<unit>(interval, *this);
}
//unix_timestamp is called with a timezone argument,
@@ -1006,10 +1008,10 @@ public:
DateV2Value<T>& operator++() {
if constexpr (is_datetime) {
TimeInterval interval(SECOND, 1, false);
- date_add_interval(interval, SECOND, *this);
+ date_add_interval<SECOND>(interval, *this);
} else {
TimeInterval interval(DAY, 1, false);
- date_add_interval(interval, DAY, *this);
+ date_add_interval<DAY>(interval, *this);
}
return *this;
}
@@ -1052,9 +1054,6 @@ public:
return time_diff;
}
- void convert_date_v2_to_dt(doris::DateTimeValue* dt);
- void convert_dt_to_date_v2(doris::DateTimeValue* dt);
-
bool can_cast_to_date_without_loss_accuracy() {
return this->hour() == 0 && this->minute() == 0 && this->second() == 0 &&
this->microsecond() == 0;
diff --git a/be/test/vec/core/block_test.cpp b/be/test/vec/core/block_test.cpp
index 546e120245..a18db4e1e5 100644
--- a/be/test/vec/core/block_test.cpp
+++ b/be/test/vec/core/block_test.cpp
@@ -110,14 +110,14 @@ TEST(BlockTest, RowBatchCovertToBlock) {
std::string now_time("2020-12-02");
k7.from_date_str(now_time.c_str(), now_time.size());
vectorized::TimeInterval time_interval(vectorized::TimeUnit::DAY, k1, false);
- k7.date_add_interval(time_interval, vectorized::TimeUnit::DAY);
+ k7.date_add_interval<vectorized::TimeUnit::DAY>(time_interval);
memcpy(tuple->get_slot(slot_desc->tuple_offset()), &k7, column_descs[6].size);
slot_desc = tuple_desc->slots()[7];
vectorized::DateV2Value<doris::vectorized::DateV2ValueType> k8;
std::string now_date("2020-12-02");
k8.from_date_str(now_date.c_str(), now_date.size());
- k8.date_add_interval(time_interval, vectorized::TimeUnit::DAY, k8);
+ k8.date_add_interval<vectorized::TimeUnit::DAY>(time_interval);
memcpy(tuple->get_slot(slot_desc->tuple_offset()), &k8, column_descs[7].size);
tuple_row->set_tuple(0, tuple);
@@ -161,7 +161,7 @@ TEST(BlockTest, RowBatchCovertToBlock) {
std::string now_time("2020-12-02");
date_time_value.from_date_str(now_time.c_str(), now_time.size());
vectorized::TimeInterval time_interval(vectorized::TimeUnit::DAY, k1, false);
- date_time_value.date_add_interval(time_interval, vectorized::TimeUnit::DAY);
+ date_time_value.date_add_interval<vectorized::TimeUnit::DAY>(time_interval);
EXPECT_EQ(k7, date_time_value);
@@ -171,7 +171,7 @@ TEST(BlockTest, RowBatchCovertToBlock) {
vectorized::DateV2Value<doris::vectorized::DateV2ValueType> date_v2_value;
std::string now_date("2020-12-02");
date_v2_value.from_date_str(now_date.c_str(), now_date.size());
- date_v2_value.date_add_interval(time_interval, vectorized::TimeUnit::DAY, date_v2_value);
+ date_v2_value.date_add_interval<vectorized::TimeUnit::DAY>(time_interval);
EXPECT_EQ(k8, date_v2_value);
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org