Skip to content

Commit 65a4ca2

Browse files
l46kokcopybara-github
authored andcommitted
Change lite runtime to directly accept a list of standard function
PiperOrigin-RevId: 769746973
1 parent e41f2bb commit 65a4ca2

51 files changed

Lines changed: 361 additions & 34 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -629,6 +629,7 @@ java_library(
629629
"//runtime/standard:not_equals",
630630
"//runtime/standard:optional",
631631
"//runtime/standard:size",
632+
"//runtime/standard:standard_function",
632633
"//runtime/standard:starts_with",
633634
"//runtime/standard:string",
634635
"//runtime/standard:subtract",
@@ -690,6 +691,7 @@ cel_android_library(
690691
"//runtime/standard:not_equals_android",
691692
"//runtime/standard:optional_android",
692693
"//runtime/standard:size_android",
694+
"//runtime/standard:standard_function_android",
693695
"//runtime/standard:starts_with_android",
694696
"//runtime/standard:string_android",
695697
"//runtime/standard:subtract_android",
@@ -827,11 +829,11 @@ java_library(
827829
":evaluation_exception",
828830
":function_binding",
829831
":function_resolver",
830-
":standard_functions",
831832
"//:auto_value",
832833
"//common:cel_ast",
833834
"//common:options",
834835
"//common/values:cel_value_provider",
836+
"//runtime/standard:standard_function",
835837
"@maven//:com_google_code_findbugs_annotations",
836838
"@maven//:com_google_errorprone_error_prone_annotations",
837839
"@maven//:com_google_guava_guava",
@@ -862,6 +864,7 @@ java_library(
862864
"//common:cel_ast",
863865
"//common:options",
864866
"//common/values:cel_value_provider",
867+
"//runtime/standard:standard_function",
865868
"@maven//:com_google_code_findbugs_annotations",
866869
"@maven//:com_google_errorprone_error_prone_annotations",
867870
"@maven//:com_google_guava_guava",
@@ -892,6 +895,7 @@ cel_android_library(
892895
"//common:cel_ast_android",
893896
"//common:options",
894897
"//common/values:cel_value_provider_android",
898+
"//runtime/standard:standard_function_android",
895899
"@maven//:com_google_code_findbugs_annotations",
896900
"@maven//:com_google_errorprone_error_prone_annotations",
897901
"@maven//:com_google_guava_guava",
@@ -1087,6 +1091,7 @@ cel_android_library(
10871091
"//common:cel_ast_android",
10881092
"//common:options",
10891093
"//common/values:cel_value_provider_android",
1094+
"//runtime/standard:standard_function_android",
10901095
"@maven//:com_google_code_findbugs_annotations",
10911096
"@maven//:com_google_errorprone_error_prone_annotations",
10921097
"@maven_android//:com_google_guava_guava",

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

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import com.google.errorprone.annotations.CheckReturnValue;
1919
import dev.cel.common.CelOptions;
2020
import dev.cel.common.values.CelValueProvider;
21+
import dev.cel.runtime.standard.CelStandardFunction;
2122

2223
/** Interface for building an instance of {@link CelLiteRuntime} */
2324
public interface CelLiteRuntimeBuilder {
@@ -27,11 +28,16 @@ public interface CelLiteRuntimeBuilder {
2728
CelLiteRuntimeBuilder setOptions(CelOptions options);
2829

2930
/**
30-
* Override the standard functions for the runtime. This can be used to subset the standard
31-
* environment to only expose the desired function overloads to the runtime.
31+
* Set the standard functions to enable in the runtime. These can be found in {@code
32+
* dev.cel.runtime.standard} package. By default, lite runtime does not include any standard
33+
* functions on its own.
3234
*/
3335
@CanIgnoreReturnValue
34-
CelLiteRuntimeBuilder setStandardFunctions(CelStandardFunctions standardFunctions);
36+
CelLiteRuntimeBuilder setStandardFunctions(CelStandardFunction... standardFunctions);
37+
38+
@CanIgnoreReturnValue
39+
CelLiteRuntimeBuilder setStandardFunctions(
40+
Iterable<? extends CelStandardFunction> standardFunctions);
3541

3642
/** Add one or more {@link CelFunctionBinding} objects to the CEL runtime. */
3743
@CanIgnoreReturnValue

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

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,45 +32,86 @@
3232
import dev.cel.runtime.CelStandardFunctions.StandardFunction.Overload.Relation;
3333
import dev.cel.runtime.CelStandardFunctions.StandardFunction.Overload.Size;
3434
import dev.cel.runtime.CelStandardFunctions.StandardFunction.Overload.StringMatchers;
35+
import dev.cel.runtime.standard.AddOperator;
3536
import dev.cel.runtime.standard.AddOperator.AddOverload;
37+
import dev.cel.runtime.standard.BoolFunction;
3638
import dev.cel.runtime.standard.BoolFunction.BoolOverload;
39+
import dev.cel.runtime.standard.BytesFunction;
3740
import dev.cel.runtime.standard.BytesFunction.BytesOverload;
41+
import dev.cel.runtime.standard.CelStandardFunction;
42+
import dev.cel.runtime.standard.ContainsFunction;
3843
import dev.cel.runtime.standard.ContainsFunction.ContainsOverload;
44+
import dev.cel.runtime.standard.DivideOperator;
3945
import dev.cel.runtime.standard.DivideOperator.DivideOverload;
46+
import dev.cel.runtime.standard.DoubleFunction;
4047
import dev.cel.runtime.standard.DoubleFunction.DoubleOverload;
48+
import dev.cel.runtime.standard.DurationFunction;
4149
import dev.cel.runtime.standard.DurationFunction.DurationOverload;
50+
import dev.cel.runtime.standard.DynFunction;
4251
import dev.cel.runtime.standard.DynFunction.DynOverload;
52+
import dev.cel.runtime.standard.EndsWithFunction;
4353
import dev.cel.runtime.standard.EndsWithFunction.EndsWithOverload;
54+
import dev.cel.runtime.standard.EqualsOperator;
4455
import dev.cel.runtime.standard.EqualsOperator.EqualsOverload;
56+
import dev.cel.runtime.standard.GetDateFunction;
4557
import dev.cel.runtime.standard.GetDateFunction.GetDateOverload;
58+
import dev.cel.runtime.standard.GetDayOfMonthFunction;
4659
import dev.cel.runtime.standard.GetDayOfMonthFunction.GetDayOfMonthOverload;
60+
import dev.cel.runtime.standard.GetDayOfWeekFunction;
4761
import dev.cel.runtime.standard.GetDayOfWeekFunction.GetDayOfWeekOverload;
62+
import dev.cel.runtime.standard.GetDayOfYearFunction;
4863
import dev.cel.runtime.standard.GetDayOfYearFunction.GetDayOfYearOverload;
64+
import dev.cel.runtime.standard.GetFullYearFunction;
4965
import dev.cel.runtime.standard.GetFullYearFunction.GetFullYearOverload;
66+
import dev.cel.runtime.standard.GetHoursFunction;
5067
import dev.cel.runtime.standard.GetHoursFunction.GetHoursOverload;
68+
import dev.cel.runtime.standard.GetMillisecondsFunction;
5169
import dev.cel.runtime.standard.GetMillisecondsFunction.GetMillisecondsOverload;
70+
import dev.cel.runtime.standard.GetMinutesFunction;
5271
import dev.cel.runtime.standard.GetMinutesFunction.GetMinutesOverload;
72+
import dev.cel.runtime.standard.GetMonthFunction;
5373
import dev.cel.runtime.standard.GetMonthFunction.GetMonthOverload;
74+
import dev.cel.runtime.standard.GetSecondsFunction;
5475
import dev.cel.runtime.standard.GetSecondsFunction.GetSecondsOverload;
76+
import dev.cel.runtime.standard.GreaterEqualsOperator;
5577
import dev.cel.runtime.standard.GreaterEqualsOperator.GreaterEqualsOverload;
78+
import dev.cel.runtime.standard.GreaterOperator;
5679
import dev.cel.runtime.standard.GreaterOperator.GreaterOverload;
80+
import dev.cel.runtime.standard.InOperator;
5781
import dev.cel.runtime.standard.InOperator.InOverload;
82+
import dev.cel.runtime.standard.IndexOperator;
5883
import dev.cel.runtime.standard.IndexOperator.IndexOverload;
84+
import dev.cel.runtime.standard.IntFunction;
5985
import dev.cel.runtime.standard.IntFunction.IntOverload;
86+
import dev.cel.runtime.standard.LessEqualsOperator;
6087
import dev.cel.runtime.standard.LessEqualsOperator.LessEqualsOverload;
88+
import dev.cel.runtime.standard.LessOperator;
6189
import dev.cel.runtime.standard.LessOperator.LessOverload;
90+
import dev.cel.runtime.standard.LogicalNotOperator;
6291
import dev.cel.runtime.standard.LogicalNotOperator.LogicalNotOverload;
92+
import dev.cel.runtime.standard.MatchesFunction;
6393
import dev.cel.runtime.standard.MatchesFunction.MatchesOverload;
94+
import dev.cel.runtime.standard.ModuloOperator;
6495
import dev.cel.runtime.standard.ModuloOperator.ModuloOverload;
96+
import dev.cel.runtime.standard.MultiplyOperator;
6597
import dev.cel.runtime.standard.MultiplyOperator.MultiplyOverload;
98+
import dev.cel.runtime.standard.NegateOperator;
6699
import dev.cel.runtime.standard.NegateOperator.NegateOverload;
100+
import dev.cel.runtime.standard.NotEqualsOperator;
67101
import dev.cel.runtime.standard.NotEqualsOperator.NotEqualsOverload;
102+
import dev.cel.runtime.standard.OptionalFunction;
68103
import dev.cel.runtime.standard.OptionalFunction.OptionalOverload;
104+
import dev.cel.runtime.standard.SizeFunction;
69105
import dev.cel.runtime.standard.SizeFunction.SizeOverload;
106+
import dev.cel.runtime.standard.StartsWithFunction;
70107
import dev.cel.runtime.standard.StartsWithFunction.StartsWithOverload;
108+
import dev.cel.runtime.standard.StringFunction;
71109
import dev.cel.runtime.standard.StringFunction.StringOverload;
110+
import dev.cel.runtime.standard.SubtractOperator;
72111
import dev.cel.runtime.standard.SubtractOperator.SubtractOverload;
112+
import dev.cel.runtime.standard.TimestampFunction;
73113
import dev.cel.runtime.standard.TimestampFunction.TimestampOverload;
114+
import dev.cel.runtime.standard.UintFunction;
74115
import dev.cel.runtime.standard.UintFunction.UintOverload;
75116

76117
/** Runtime function bindings for the standard functions in CEL. */
@@ -79,6 +120,49 @@ public final class CelStandardFunctions {
79120

80121
private final ImmutableSet<StandardOverload> standardOverloads;
81122

123+
public static final ImmutableSet<CelStandardFunction> ALL_STANDARD_FUNCTIONS =
124+
ImmutableSet.of(
125+
AddOperator.create(),
126+
BoolFunction.create(),
127+
BytesFunction.create(),
128+
ContainsFunction.create(),
129+
DivideOperator.create(),
130+
DoubleFunction.create(),
131+
DurationFunction.create(),
132+
DynFunction.create(),
133+
EndsWithFunction.create(),
134+
EqualsOperator.create(),
135+
GetDateFunction.create(),
136+
GetDayOfMonthFunction.create(),
137+
GetDayOfWeekFunction.create(),
138+
GetDayOfYearFunction.create(),
139+
GetFullYearFunction.create(),
140+
GetHoursFunction.create(),
141+
GetMillisecondsFunction.create(),
142+
GetMinutesFunction.create(),
143+
GetMonthFunction.create(),
144+
GetSecondsFunction.create(),
145+
GreaterEqualsOperator.create(),
146+
GreaterOperator.create(),
147+
IndexOperator.create(),
148+
InOperator.create(),
149+
IntFunction.create(),
150+
LessEqualsOperator.create(),
151+
LessOperator.create(),
152+
LogicalNotOperator.create(),
153+
MatchesFunction.create(),
154+
ModuloOperator.create(),
155+
MultiplyOperator.create(),
156+
NegateOperator.create(),
157+
NotEqualsOperator.create(),
158+
OptionalFunction.create(),
159+
SizeFunction.create(),
160+
StartsWithFunction.create(),
161+
StringFunction.create(),
162+
SubtractOperator.create(),
163+
TimestampFunction.create(),
164+
UintFunction.create());
165+
82166
/**
83167
* Enumeration of Standard Function bindings.
84168
*

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

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import dev.cel.common.CelAbstractSyntaxTree;
2626
import dev.cel.common.CelOptions;
2727
import dev.cel.common.values.CelValueProvider;
28+
import dev.cel.runtime.standard.CelStandardFunction;
2829
import java.util.Arrays;
2930
import java.util.HashMap;
3031
import java.util.Optional;
@@ -34,7 +35,7 @@ final class LiteRuntimeImpl implements CelLiteRuntime {
3435
private final Interpreter interpreter;
3536
private final CelOptions celOptions;
3637
private final ImmutableList<CelFunctionBinding> customFunctionBindings;
37-
private final CelStandardFunctions celStandardFunctions;
38+
private final ImmutableSet<CelStandardFunction> celStandardFunctions;
3839
private final CelValueProvider celValueProvider;
3940

4041
// This does not affect the evaluation behavior in any manner.
@@ -69,7 +70,7 @@ static final class Builder implements CelLiteRuntimeBuilder {
6970
@VisibleForTesting CelOptions celOptions;
7071
@VisibleForTesting final HashMap<String, CelFunctionBinding> customFunctionBindings;
7172
@VisibleForTesting final ImmutableSet.Builder<CelLiteRuntimeLibrary> runtimeLibrariesBuilder;
72-
@VisibleForTesting CelStandardFunctions celStandardFunctions;
73+
@VisibleForTesting final ImmutableSet.Builder<CelStandardFunction> standardFunctionBuilder;
7374
@VisibleForTesting CelValueProvider celValueProvider;
7475

7576
@Override
@@ -79,8 +80,14 @@ public CelLiteRuntimeBuilder setOptions(CelOptions celOptions) {
7980
}
8081

8182
@Override
82-
public CelLiteRuntimeBuilder setStandardFunctions(CelStandardFunctions standardFunctions) {
83-
this.celStandardFunctions = standardFunctions;
83+
public CelLiteRuntimeBuilder setStandardFunctions(CelStandardFunction... standardFunctions) {
84+
return setStandardFunctions(Arrays.asList(standardFunctions));
85+
}
86+
87+
@Override
88+
public CelLiteRuntimeBuilder setStandardFunctions(
89+
Iterable<? extends CelStandardFunction> standardFunctions) {
90+
standardFunctionBuilder.addAll(standardFunctions);
8491
return this;
8592
}
8693

@@ -153,13 +160,17 @@ public CelLiteRuntime build() {
153160

154161
ImmutableMap.Builder<String, CelFunctionBinding> functionBindingsBuilder =
155162
ImmutableMap.builder();
156-
if (celStandardFunctions != null) {
163+
164+
ImmutableSet<CelStandardFunction> standardFunctions = standardFunctionBuilder.build();
165+
if (!standardFunctions.isEmpty()) {
157166
RuntimeHelpers runtimeHelpers = RuntimeHelpers.create();
158167
RuntimeEquality runtimeEquality = RuntimeEquality.create(runtimeHelpers, celOptions);
159-
ImmutableSet<CelFunctionBinding> standardFunctionBinding =
160-
celStandardFunctions.newFunctionBindings(runtimeEquality, celOptions);
161-
for (CelFunctionBinding func : standardFunctionBinding) {
162-
functionBindingsBuilder.put(func.getOverloadId(), func);
168+
for (CelStandardFunction standardFunction : standardFunctions) {
169+
ImmutableSet<CelFunctionBinding> standardFunctionBinding =
170+
standardFunction.newFunctionBindings(celOptions, runtimeEquality);
171+
for (CelFunctionBinding func : standardFunctionBinding) {
172+
functionBindingsBuilder.put(func.getOverloadId(), func);
173+
}
163174
}
164175
}
165176

@@ -184,7 +195,7 @@ public CelLiteRuntime build() {
184195
interpreter,
185196
celOptions,
186197
customFunctionBindings.values(),
187-
celStandardFunctions,
198+
standardFunctions,
188199
runtimeLibs,
189200
celValueProvider);
190201
}
@@ -193,6 +204,7 @@ private Builder() {
193204
this.celOptions = CelOptions.current().enableCelValue(true).build();
194205
this.celValueProvider = (structType, fields) -> Optional.empty();
195206
this.customFunctionBindings = new HashMap<>();
207+
this.standardFunctionBuilder = ImmutableSet.builder();
196208
this.runtimeLibrariesBuilder = ImmutableSet.builder();
197209
}
198210
}
@@ -205,7 +217,7 @@ private LiteRuntimeImpl(
205217
Interpreter interpreter,
206218
CelOptions celOptions,
207219
Iterable<CelFunctionBinding> customFunctionBindings,
208-
CelStandardFunctions celStandardFunctions,
220+
ImmutableSet<CelStandardFunction> celStandardFunctions,
209221
ImmutableSet<CelLiteRuntimeLibrary> runtimeLibraries,
210222
CelValueProvider celValueProvider) {
211223
this.interpreter = interpreter;

runtime/src/main/java/dev/cel/runtime/standard/AddOperator.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@
3232

3333
/** Standard function for the addition (+) operator. */
3434
public final class AddOperator extends CelStandardFunction {
35+
private static final AddOperator ALL_OVERLOADS = create(AddOverload.values());
36+
37+
public static AddOperator create() {
38+
return ALL_OVERLOADS;
39+
}
3540

3641
public static AddOperator create(AddOverload... overloads) {
3742
return create(Arrays.asList(overloads));

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ java_library(
1919
"//common:options",
2020
"//runtime:function_binding",
2121
"//runtime:runtime_equality",
22+
"@maven//:com_google_errorprone_error_prone_annotations",
2223
"@maven//:com_google_guava_guava",
2324
],
2425
)
@@ -33,6 +34,7 @@ cel_android_library(
3334
"//common:options",
3435
"//runtime:function_binding_android",
3536
"//runtime:runtime_equality_android",
37+
"@maven//:com_google_errorprone_error_prone_annotations",
3638
"@maven_android//:com_google_guava_guava",
3739
],
3840
)

runtime/src/main/java/dev/cel/runtime/standard/BoolFunction.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@
2525

2626
/** Standard function for {@code bool} conversion function. */
2727
public final class BoolFunction extends CelStandardFunction {
28+
private static final BoolFunction ALL_OVERLOADS = create(BoolOverload.values());
29+
30+
public static BoolFunction create() {
31+
return ALL_OVERLOADS;
32+
}
2833

2934
public static BoolFunction create(BoolFunction.BoolOverload... overloads) {
3035
return create(Arrays.asList(overloads));

runtime/src/main/java/dev/cel/runtime/standard/BytesFunction.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@
2323

2424
/** Standard function for {@code bytes} conversion function. */
2525
public final class BytesFunction extends CelStandardFunction {
26+
private static final BytesFunction ALL_OVERLOADS = create(BytesOverload.values());
27+
28+
public static BytesFunction create() {
29+
return ALL_OVERLOADS;
30+
}
2631

2732
public static BytesFunction create(BytesFunction.BytesOverload... overloads) {
2833
return create(Arrays.asList(overloads));

runtime/src/main/java/dev/cel/runtime/standard/CelStandardFunction.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import static com.google.common.base.Preconditions.checkState;
1818

1919
import com.google.common.collect.ImmutableSet;
20+
import com.google.errorprone.annotations.Immutable;
2021
import dev.cel.common.CelOptions;
2122
import dev.cel.runtime.CelFunctionBinding;
2223
import dev.cel.runtime.RuntimeEquality;
@@ -25,6 +26,7 @@
2526
* An abstract class that describes a CEL standard function. An implementation should provide a set
2627
* of overloads for the standard function
2728
*/
29+
@Immutable
2830
public abstract class CelStandardFunction {
2931
private final ImmutableSet<CelStandardOverload> overloads;
3032

runtime/src/main/java/dev/cel/runtime/standard/CelStandardOverload.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
* implementation should produce a concrete {@link CelFunctionBinding} for the standard function's
2525
* overload.
2626
*/
27+
@Immutable
2728
interface CelStandardOverload {
2829

2930
CelFunctionBinding newFunctionBinding(CelOptions celOptions, RuntimeEquality runtimeEquality);

0 commit comments

Comments
 (0)