Skip to content

Commit

Permalink
getMicroseconds/getNanoseconds time functions.
Browse files Browse the repository at this point in the history
PiperOrigin-RevId: 577869158
  • Loading branch information
CEL Dev Team authored and copybara-github committed Oct 30, 2023
1 parent cec2bf1 commit b9586f1
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 1 deletion.
2 changes: 2 additions & 0 deletions base/builtins.h
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,8 @@ constexpr char kHours[] = "getHours";
constexpr char kMinutes[] = "getMinutes";
constexpr char kSeconds[] = "getSeconds";
constexpr char kMilliseconds[] = "getMilliseconds";
constexpr char kMicroseonds[] = "getMicroseconds";
constexpr char kNanoseconds[] = "getNanoseconds";

// Type conversions
// TODO(issues/23): Add other type conversion methods.
Expand Down
37 changes: 37 additions & 0 deletions runtime/standard/time_functions.cc
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#include "absl/strings/match.h"
#include "absl/strings/str_replace.h"
#include "absl/strings/string_view.h"
#include "absl/time/time.h"
#include "base/builtins.h"
#include "base/function_adapter.h"
#include "base/handle.h"
Expand Down Expand Up @@ -169,6 +170,24 @@ Handle<Value> GetMilliseconds(ValueFactory& value_factory, absl::Time timestamp,
});
}

Handle<Value> GetMicroseconds(ValueFactory& value_factory, absl::Time timestamp,
absl::string_view tz) {
return GetTimeBreakdownPart(
value_factory, timestamp, tz,
[](const absl::TimeZone::CivilInfo& breakdown) {
return absl::ToInt64Microseconds(breakdown.subsecond);
});
}

Handle<Value> GetNanoseconds(ValueFactory& value_factory, absl::Time timestamp,
absl::string_view tz) {
return GetTimeBreakdownPart(
value_factory, timestamp, tz,
[](const absl::TimeZone::CivilInfo& breakdown) {
return absl::ToInt64Nanoseconds(breakdown.subsecond);
});
}

absl::Status RegisterTimestampFunctions(FunctionRegistry& registry,
const RuntimeOptions& options) {
CEL_RETURN_IF_ERROR(registry.Register(
Expand Down Expand Up @@ -333,6 +352,24 @@ absl::Status RegisterTimestampFunctions(FunctionRegistry& registry,
return GetMilliseconds(value_factory, ts, tz.ToString());
})));

CEL_RETURN_IF_ERROR(registry.Register(
BinaryFunctionAdapter<Handle<Value>, absl::Time, const StringValue&>::
CreateDescriptor(builtin::kMicroseonds, true),
BinaryFunctionAdapter<Handle<Value>, absl::Time, const StringValue&>::
WrapFunction([](ValueFactory& value_factory, absl::Time ts,
const StringValue& tz) -> Handle<Value> {
return GetMicroseconds(value_factory, ts, tz.ToString());
})));

CEL_RETURN_IF_ERROR(registry.Register(
BinaryFunctionAdapter<Handle<Value>, absl::Time, const StringValue&>::
CreateDescriptor(builtin::kNanoseconds, true),
BinaryFunctionAdapter<Handle<Value>, absl::Time, const StringValue&>::
WrapFunction([](ValueFactory& value_factory, absl::Time ts,
const StringValue& tz) -> Handle<Value> {
return GetNanoseconds(value_factory, ts, tz.ToString());
})));

return registry.Register(
UnaryFunctionAdapter<Handle<Value>, absl::Time>::CreateDescriptor(
builtin::kMilliseconds, true),
Expand Down
4 changes: 4 additions & 0 deletions runtime/standard/time_functions.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,15 @@ namespace cel {
// (timestamp).getMinutes(<timezone:string>) -> int
// (timestamp).getSeconds(<timezone:string>) -> int
// (timestamp).getMilliseconds(<timezone:string>) -> int
// (timestamp).getMicroseconds(<timezone:string>) -> int
// (timestamp).getNanoseconds(<timezone:string>) -> int
//
// (duration).getHours() -> int
// (duration).getMinutes() -> int
// (duration).getSeconds() -> int
// (duration).getMilliseconds() -> int
// (duration).getMicroseconds() -> int
// (duration).getNanoseconds() -> int
//
// _+_(timestamp, duration) -> timestamp
// _+_(duration, timestamp) -> timestamp
Expand Down
6 changes: 5 additions & 1 deletion runtime/standard_runtime_builder_factory_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -392,7 +392,11 @@ INSTANTIATE_TEST_SUITE_P(
"60",
true},
{"duration_get_milliseconds",
"duration('10h20m30s40ms').getMilliseconds() == 40", true},
"duration('10h20m30s40ms50us60ns').getMilliseconds() == 40", true},
{"duration_get_milliseconds",
"duration('10h20m30s40ms50us60ns').getMicroseconds() == 50", true},
{"duration_get_milliseconds",
"duration('10h20m30s40ms50us60ns').getNanoseconds() == 60", true},
}),
TestCaseName);

Expand Down

0 comments on commit b9586f1

Please sign in to comment.