summaryrefslogtreecommitdiff
path: root/src/mongo/db/query/datetime
diff options
context:
space:
mode:
authorMindaugas Malinauskas <mindaugas.malinauskas@mongodb.com>2020-12-02 18:30:40 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2021-01-13 12:58:36 +0000
commitb59db98b6d214ee177f7fa4c08b2081bac46cb8a (patch)
tree954a3bb983e546cad82c7ea4d1953de5e45e4343 /src/mongo/db/query/datetime
parent136d56daf7206d20679c49b34c080d3842c2dce5 (diff)
downloadmongo-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.cpp37
-rw-r--r--src/mongo/db/query/datetime/date_time_support.h11
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.