diff options
author | Mindaugas Malinauskas <mindaugas.malinauskas@mongodb.com> | 2020-12-02 18:30:40 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2021-01-13 12:58:36 +0000 |
commit | b59db98b6d214ee177f7fa4c08b2081bac46cb8a (patch) | |
tree | 954a3bb983e546cad82c7ea4d1953de5e45e4343 /src/mongo/db/query/datetime | |
parent | 136d56daf7206d20679c49b34c080d3842c2dce5 (diff) | |
download | mongo-b59db98b6d214ee177f7fa4c08b2081bac46cb8a.tar.gz |
SERVER-51665 Implement $dateDiff expression in SBE
Diffstat (limited to 'src/mongo/db/query/datetime')
-rw-r--r-- | src/mongo/db/query/datetime/date_time_support.cpp | 37 | ||||
-rw-r--r-- | src/mongo/db/query/datetime/date_time_support.h | 11 |
2 files changed, 31 insertions, 17 deletions
diff --git a/src/mongo/db/query/datetime/date_time_support.cpp b/src/mongo/db/query/datetime/date_time_support.cpp index dc73c52485f..425a4349abc 100644 --- a/src/mongo/db/query/datetime/date_time_support.cpp +++ b/src/mongo/db/query/datetime/date_time_support.cpp @@ -677,6 +677,19 @@ inline long long dateDiffMillisecond(Date_t startDate, Date_t endDate) { !overflow::sub(endDate.toMillisSinceEpoch(), startDate.toMillisSinceEpoch(), &result)); return result; } + +// A mapping from a string expression of TimeUnit to TimeUnit. +static const StringMap<TimeUnit> timeUnitNameToTimeUnitMap{ + {"year", TimeUnit::year}, + {"quarter", TimeUnit::quarter}, + {"month", TimeUnit::month}, + {"week", TimeUnit::week}, + {"day", TimeUnit::day}, + {"hour", TimeUnit::hour}, + {"minute", TimeUnit::minute}, + {"second", TimeUnit::second}, + {"millisecond", TimeUnit::millisecond}, +}; } // namespace long long dateDiff(Date_t startDate, Date_t endDate, TimeUnit unit, const TimeZone& timezone) { @@ -709,25 +722,20 @@ long long dateDiff(Date_t startDate, Date_t endDate, TimeUnit unit, const TimeZo } } -TimeUnit parseTimeUnit(const std::string& unitName) { - static const StringMap<TimeUnit> timeUnitNameToTimeUnitMap{ - {"year", TimeUnit::year}, - {"quarter", TimeUnit::quarter}, - {"month", TimeUnit::month}, - {"week", TimeUnit::week}, - {"day", TimeUnit::day}, - {"hour", TimeUnit::hour}, - {"minute", TimeUnit::minute}, - {"second", TimeUnit::second}, - {"millisecond", TimeUnit::millisecond}, - }; - auto iterator = timeUnitNameToTimeUnitMap.find(unitName); +TimeUnit parseTimeUnit(const std::string_view unitName) { + const StringData unitNameAsStringData{unitName.data(), unitName.length()}; + auto iterator = timeUnitNameToTimeUnitMap.find(unitNameAsStringData); uassert(ErrorCodes::FailedToParse, - str::stream() << "unknown time unit value: " << unitName, + str::stream() << "unknown time unit value: " << unitNameAsStringData, iterator != timeUnitNameToTimeUnitMap.end()); return iterator->second; } +bool isValidTimeUnit(const std::string_view unitName) { + return timeUnitNameToTimeUnitMap.find(StringData{unitName.data(), unitName.length()}) != + timeUnitNameToTimeUnitMap.end(); +} + void TimelibRelTimeDeleter::operator()(timelib_rel_time* relTime) { timelib_rel_time_dtor(relTime); } @@ -894,5 +902,4 @@ Date_t dateAdd(Date_t date, TimeUnit unit, long long amount, const TimeZone& tim timelib_time_dtor(newTime); return returnDate; } - } // namespace mongo diff --git a/src/mongo/db/query/datetime/date_time_support.h b/src/mongo/db/query/datetime/date_time_support.h index dee5bcb56f6..640ba01c5a6 100644 --- a/src/mongo/db/query/datetime/date_time_support.h +++ b/src/mongo/db/query/datetime/date_time_support.h @@ -451,7 +451,7 @@ public: /** * Returns a TimeZone object representing the zone given by 'timeZoneId', or throws an exception - * if the 'timeZoneId' was not recognized. + * if it is not a recognized time zone. */ TimeZone getTimeZone(StringData timeZoneId) const; @@ -496,7 +496,14 @@ private: * TimeUnit. Throws an exception with error code ErrorCodes::FailedToParse when passed an invalid * name. */ -TimeUnit parseTimeUnit(const std::string& unitName); +TimeUnit parseTimeUnit(const std::string_view unitName); + +/** + * Returns true if 'unitName' is a valid time unit, meaning that it can be parsed by the + * 'parseTimeUnit()' function into one of the units represented by the 'TimeUnit' enum. Otherwise + * returns 'false'. + */ +bool isValidTimeUnit(const std::string_view unitName); /** * A custom-deleter which destructs a timelib_rel_time* when it goes out of scope. |