Skip to content

Commit fdb9b70

Browse files
l46kokcopybara-github
authored andcommitted
Add async execution engine and AsyncDriver
PiperOrigin-RevId: 983346214
1 parent b4977d9 commit fdb9b70

19 files changed

Lines changed: 2515 additions & 103 deletions

common/src/main/java/dev/cel/common/values/ErrorValue.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public abstract class ErrorValue extends CelValue {
3636
public abstract long exprId();
3737

3838
@Override
39-
public abstract Exception value();
39+
public abstract RuntimeException value();
4040

4141
@Override
4242
public boolean isZeroValue() {
@@ -48,7 +48,9 @@ public CelType celType() {
4848
return SimpleType.ERROR;
4949
}
5050

51-
public static ErrorValue create(long exprId, Exception value) {
51+
public static ErrorValue create(long exprId, RuntimeException value) {
5252
return new AutoValue_ErrorValue(exprId, value);
5353
}
54+
55+
ErrorValue() {}
5456
}

runtime/src/main/java/dev/cel/runtime/CelRuntimeImpl.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,8 +191,11 @@ public ListenableFuture<Object> evalAsync(PartialVars partialVars) {
191191

192192
@Override
193193
public ListenableFuture<Object> evalAsync(Message message) {
194-
throw new UnsupportedOperationException(
195-
"evalAsync is not supported by this Program implementation.");
194+
checkNotNull(message, "message");
195+
return program.evalAsync(
196+
ProtoMessageActivationFactory.fromProto(message, program.options()),
197+
CelFunctionResolver.EMPTY,
198+
/* partialVars= */ null);
196199
}
197200

198201
@Override
@@ -580,6 +583,7 @@ public CelRuntime build() {
580583
container(),
581584
options(),
582585
lateBoundFunctionNamesBuilder().build(),
586+
runtimeEquality,
583587
asyncEvaluationOptions(),
584588
asyncExecutor().orElse(null));
585589
setPlanner(planner);

runtime/src/main/java/dev/cel/runtime/LiteRuntimeImpl.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -183,10 +183,10 @@ public CelLiteRuntime build() {
183183
ImmutableMap.Builder<String, CelFunctionBinding> functionBindingsBuilder =
184184
ImmutableMap.builder();
185185

186+
RuntimeHelpers runtimeHelpers = RuntimeHelpers.create();
187+
RuntimeEquality runtimeEquality = RuntimeEquality.create(runtimeHelpers, celOptions);
186188
ImmutableSet<CelStandardFunction> standardFunctions = standardFunctionBuilder.build();
187189
if (!standardFunctions.isEmpty()) {
188-
RuntimeHelpers runtimeHelpers = RuntimeHelpers.create();
189-
RuntimeEquality runtimeEquality = RuntimeEquality.create(runtimeHelpers, celOptions);
190190
for (CelStandardFunction standardFunction : standardFunctions) {
191191
ImmutableSet<CelFunctionBinding> standardFunctionBinding =
192192
standardFunction.newFunctionBindings(celOptions, runtimeEquality);
@@ -230,6 +230,7 @@ public CelLiteRuntime build() {
230230
container,
231231
celOptions,
232232
lateBoundFunctionNamesBuilder.build(),
233+
runtimeEquality,
233234
// TODO: Support async eval in lite runtime.
234235
CelAsyncEvaluationOptions.defaultOptions(),
235236
/* asyncExecutor= */ null);

runtime/src/main/java/dev/cel/runtime/planner/BUILD.bazel

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ java_library(
6161
"//runtime:evaluation_exception_builder",
6262
"//runtime:function_overload",
6363
"//runtime:resolved_overload",
64+
"//runtime:runtime_equality",
6465
"@maven//:com_google_code_findbugs_annotations",
6566
"@maven//:com_google_errorprone_error_prone_annotations",
6667
"@maven//:com_google_guava_guava",
@@ -74,6 +75,9 @@ java_library(
7475
tags = [
7576
],
7677
deps = [
78+
":async_call_state_tracker",
79+
":async_completion_coordinator",
80+
":async_gate",
7781
":error_metadata",
7882
":localized_evaluation_exception",
7983
":planned_interpretable",
@@ -82,6 +86,7 @@ java_library(
8286
"//common/annotations",
8387
"//common/exceptions:runtime_exception",
8488
"//common/values",
89+
"//runtime:accumulated_unknowns",
8590
"//runtime:activation",
8691
"//runtime:async_options",
8792
"//runtime:evaluation_exception",
@@ -92,6 +97,7 @@ java_library(
9297
"//runtime:interpreter_util",
9398
"//runtime:partial_vars",
9499
"//runtime:program",
100+
"//runtime:runtime_equality",
95101
"//runtime:variable_resolver",
96102
"@maven//:com_google_errorprone_error_prone_annotations",
97103
"@maven//:com_google_guava_guava",
@@ -250,10 +256,19 @@ java_library(
250256
name = "eval_async_call",
251257
srcs = ["EvalAsyncCall.java"],
252258
deps = [
259+
":eval_helpers",
260+
":localized_evaluation_exception",
253261
":planned_interpretable",
262+
"//common:error_codes",
254263
"//common/ast",
264+
"//common/exceptions:overload_not_found",
265+
"//common/exceptions:runtime_exception",
266+
"//common/values",
267+
"//runtime:accumulated_unknowns",
255268
"//runtime:evaluation_exception",
269+
"//runtime:function_overload",
256270
"//runtime:interpretable",
271+
"//runtime:resolved_overload",
257272
"@maven//:com_google_errorprone_error_prone_annotations",
258273
"@maven//:com_google_guava_guava",
259274
],
@@ -336,6 +351,7 @@ java_library(
336351
name = "eval_conditional",
337352
srcs = ["EvalConditional.java"],
338353
deps = [
354+
":eval_helpers",
339355
":planned_interpretable",
340356
"//common/ast",
341357
"//runtime:accumulated_unknowns",
@@ -373,6 +389,7 @@ java_library(
373389
"//runtime:accumulated_unknowns",
374390
"//runtime:interpretable",
375391
"@maven//:com_google_errorprone_error_prone_annotations",
392+
"@maven//:com_google_guava_guava",
376393
],
377394
)
378395

@@ -383,10 +400,11 @@ java_library(
383400
":eval_helpers",
384401
":planned_interpretable",
385402
"//common/ast",
403+
"//common/values",
386404
"//runtime:accumulated_unknowns",
387-
"//runtime:evaluation_exception",
388405
"//runtime:interpretable",
389406
"@maven//:com_google_errorprone_error_prone_annotations",
407+
"@maven//:com_google_guava_guava",
390408
],
391409
)
392410

@@ -401,6 +419,7 @@ java_library(
401419
"//runtime:accumulated_unknowns",
402420
"//runtime:interpretable",
403421
"@maven//:com_google_errorprone_error_prone_annotations",
422+
"@maven//:com_google_guava_guava",
404423
],
405424
)
406425

@@ -453,6 +472,7 @@ java_library(
453472
"//common/values",
454473
"//runtime:accumulated_unknowns",
455474
"//runtime:evaluation_exception",
475+
"//runtime:function_overload",
456476
"//runtime:interpretable",
457477
"//runtime:resolved_overload",
458478
"@maven//:com_google_guava_guava",
@@ -597,6 +617,7 @@ java_library(
597617
"PlannedInterpretable.java",
598618
],
599619
deps = [
620+
":async_call_state_tracker",
600621
":localized_evaluation_exception",
601622
"//common:options",
602623
"//common/ast",
@@ -609,6 +630,7 @@ java_library(
609630
"//runtime:partial_vars",
610631
"//runtime:resolved_overload",
611632
"@maven//:com_google_errorprone_error_prone_annotations",
633+
"@maven//:com_google_guava_guava",
612634
"@maven//:org_jspecify_jspecify",
613635
],
614636
)
@@ -666,6 +688,7 @@ cel_android_library(
666688
"//runtime:evaluation_exception_builder",
667689
"//runtime:function_overload_android",
668690
"//runtime:resolved_overload_android",
691+
"//runtime:runtime_equality_android",
669692
"@maven//:com_google_errorprone_error_prone_annotations",
670693
"@maven//:org_jspecify_jspecify",
671694
"@maven_android//:com_google_guava_guava",
@@ -678,6 +701,9 @@ cel_android_library(
678701
tags = [
679702
],
680703
deps = [
704+
":async_call_state_tracker_android",
705+
":async_completion_coordinator_android",
706+
":async_gate_android",
681707
":error_metadata_android",
682708
":localized_evaluation_exception_android",
683709
":planned_interpretable_android",
@@ -686,11 +712,13 @@ cel_android_library(
686712
"//common/annotations",
687713
"//common/exceptions:runtime_exception",
688714
"//common/values:values_android",
715+
"//runtime:accumulated_unknowns_android",
689716
"//runtime:activation_android",
690717
"//runtime:async_options_android",
691718
"//runtime:evaluation_exception",
692719
"//runtime:evaluation_exception_builder",
693720
"//runtime:interpretable_android",
721+
"//runtime:runtime_equality_android",
694722
"//runtime:variable_resolver",
695723
"//runtime/src/main/java/dev/cel/runtime:evaluation_listener_android",
696724
"//runtime/src/main/java/dev/cel/runtime:function_resolver_android",
@@ -856,10 +884,19 @@ cel_android_library(
856884
name = "eval_async_call_android",
857885
srcs = ["EvalAsyncCall.java"],
858886
deps = [
887+
":eval_helpers_android",
888+
":localized_evaluation_exception_android",
859889
":planned_interpretable_android",
890+
"//common:error_codes",
860891
"//common/ast:ast_android",
892+
"//common/exceptions:overload_not_found",
893+
"//common/exceptions:runtime_exception",
894+
"//common/values:values_android",
895+
"//runtime:accumulated_unknowns_android",
861896
"//runtime:evaluation_exception",
897+
"//runtime:function_overload_android",
862898
"//runtime:interpretable_android",
899+
"//runtime:resolved_overload_android",
863900
"@maven//:com_google_errorprone_error_prone_annotations",
864901
"@maven_android//:com_google_guava_guava",
865902
],
@@ -942,6 +979,7 @@ cel_android_library(
942979
name = "eval_conditional_android",
943980
srcs = ["EvalConditional.java"],
944981
deps = [
982+
":eval_helpers_android",
945983
":planned_interpretable_android",
946984
"//common/ast:ast_android",
947985
"//runtime:evaluation_exception",
@@ -979,6 +1017,7 @@ cel_android_library(
9791017
"//runtime:interpretable_android",
9801018
"//runtime/src/main/java/dev/cel/runtime:accumulated_unknowns_android",
9811019
"@maven//:com_google_errorprone_error_prone_annotations",
1020+
"@maven_android//:com_google_guava_guava",
9821021
],
9831022
)
9841023

@@ -989,10 +1028,11 @@ cel_android_library(
9891028
":eval_helpers_android",
9901029
":planned_interpretable_android",
9911030
"//common/ast:ast_android",
992-
"//runtime:evaluation_exception",
1031+
"//common/values:values_android",
9931032
"//runtime:interpretable_android",
9941033
"//runtime/src/main/java/dev/cel/runtime:accumulated_unknowns_android",
9951034
"@maven//:com_google_errorprone_error_prone_annotations",
1035+
"@maven_android//:com_google_guava_guava",
9961036
],
9971037
)
9981038

@@ -1007,6 +1047,7 @@ cel_android_library(
10071047
"//runtime:interpretable_android",
10081048
"//runtime/src/main/java/dev/cel/runtime:accumulated_unknowns_android",
10091049
"@maven//:com_google_errorprone_error_prone_annotations",
1050+
"@maven_android//:com_google_guava_guava",
10101051
],
10111052
)
10121053

@@ -1058,6 +1099,7 @@ cel_android_library(
10581099
"//common/exceptions:overload_not_found",
10591100
"//common/values:values_android",
10601101
"//runtime:evaluation_exception",
1102+
"//runtime:function_overload_android",
10611103
"//runtime:interpretable_android",
10621104
"//runtime:resolved_overload_android",
10631105
"//runtime/src/main/java/dev/cel/runtime:accumulated_unknowns_android",
@@ -1198,6 +1240,7 @@ cel_android_library(
11981240
"PlannedInterpretable.java",
11991241
],
12001242
deps = [
1243+
":async_call_state_tracker_android",
12011244
":localized_evaluation_exception_android",
12021245
"//common:options",
12031246
"//common/ast:ast_android",
@@ -1211,5 +1254,6 @@ cel_android_library(
12111254
"//runtime/src/main/java/dev/cel/runtime:partial_vars_android",
12121255
"@maven//:com_google_errorprone_error_prone_annotations",
12131256
"@maven//:org_jspecify_jspecify",
1257+
"@maven_android//:com_google_guava_guava",
12141258
],
12151259
)

runtime/src/main/java/dev/cel/runtime/planner/EvalAnd.java

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
package dev.cel.runtime.planner;
1616

17-
import static dev.cel.runtime.planner.EvalHelpers.evalNonstrictly;
17+
import static dev.cel.runtime.planner.EvalHelpers.evalBooleanNonstrictly;
1818

1919
import com.google.common.base.Preconditions;
2020
import dev.cel.common.ast.CelExpr;
@@ -32,7 +32,7 @@ Object evalInternal(GlobalResolver resolver, ExecutionFrame frame) {
3232
ErrorValue errorValue = null;
3333
AccumulatedUnknowns unknowns = null;
3434
for (PlannedInterpretable arg : args) {
35-
Object argVal = evalNonstrictly(arg, resolver, frame);
35+
Object argVal = evalBooleanNonstrictly(arg, resolver, frame);
3636
if (argVal instanceof Boolean) {
3737
// Short-circuit on false
3838
if (!((boolean) argVal)) {
@@ -45,12 +45,6 @@ Object evalInternal(GlobalResolver resolver, ExecutionFrame frame) {
4545
}
4646
} else if (argVal instanceof AccumulatedUnknowns) {
4747
unknowns = AccumulatedUnknowns.maybeMerge(unknowns, argVal);
48-
} else {
49-
errorValue =
50-
ErrorValue.create(
51-
arg.expr().id(),
52-
new IllegalArgumentException(
53-
String.format("Expected boolean value, found: %s", argVal)));
5448
}
5549
}
5650

0 commit comments

Comments
 (0)