Skip to content

Commit 6b6b522

Browse files
l46kokcopybara-github
authored andcommitted
Register parsed-only function bindings for all remaining extensions. Add test coverage for planner runtime.
PiperOrigin-RevId: 894205541
1 parent 63cc846 commit 6b6b522

28 files changed

+1517
-1451
lines changed

bundle/src/test/java/dev/cel/bundle/BUILD.bazel

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ java_library(
1717
deps = [
1818
"//:java_truth",
1919
"//bundle:cel",
20-
"//bundle:cel_experimental_factory",
2120
"//bundle:cel_impl",
2221
"//bundle:environment",
2322
"//bundle:environment_exception",
@@ -56,6 +55,7 @@ java_library(
5655
"//runtime:evaluation_listener",
5756
"//runtime:function_binding",
5857
"//runtime:unknown_attributes",
58+
"//testing:cel_runtime_flavor",
5959
"//testing/protos:single_file_extension_java_proto",
6060
"//testing/protos:single_file_java_proto",
6161
"@cel_spec//proto/cel/expr:checked_java_proto",

bundle/src/test/java/dev/cel/bundle/CelImplTest.java

Lines changed: 26 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@
114114
import dev.cel.runtime.CelUnknownSet;
115115
import dev.cel.runtime.CelVariableResolver;
116116
import dev.cel.runtime.UnknownContext;
117+
import dev.cel.testing.CelRuntimeFlavor;
117118
import dev.cel.testing.testdata.SingleFile;
118119
import dev.cel.testing.testdata.SingleFileExtensionsProto;
119120
import dev.cel.testing.testdata.proto3.StandaloneGlobalEnum;
@@ -2144,8 +2145,9 @@ public void toBuilder_isImmutable() {
21442145
}
21452146

21462147
@Test
2147-
public void eval_withJsonFieldName(@TestParameter RuntimeEnv runtimeEnv) throws Exception {
2148-
Cel cel = runtimeEnv.cel;
2148+
public void eval_withJsonFieldName(@TestParameter CelRuntimeFlavor runtimeFlavor)
2149+
throws Exception {
2150+
Cel cel = setupEnv(runtimeFlavor.builder());
21492151
CelAbstractSyntaxTree ast =
21502152
cel.compile(
21512153
"file.int32_snake_case_json_name == 1 && "
@@ -2176,8 +2178,9 @@ public void eval_withJsonFieldName(@TestParameter RuntimeEnv runtimeEnv) throws
21762178
}
21772179

21782180
@Test
2179-
public void eval_withJsonFieldName_fieldsFallBack(@TestParameter RuntimeEnv runtimeEnv) throws Exception {
2180-
Cel cel = runtimeEnv.cel;
2181+
public void eval_withJsonFieldName_fieldsFallBack(@TestParameter CelRuntimeFlavor runtimeFlavor)
2182+
throws Exception {
2183+
Cel cel = setupEnv(runtimeFlavor.builder());
21812184
CelAbstractSyntaxTree ast =
21822185
cel.compile(
21832186
"dyn(file).int32_snake_case_json_name == 1 && "
@@ -2206,8 +2209,9 @@ public void eval_withJsonFieldName_fieldsFallBack(@TestParameter RuntimeEnv runt
22062209
}
22072210

22082211
@Test
2209-
public void eval_withJsonFieldName_extensionFields(@TestParameter RuntimeEnv runtimeEnv) throws Exception {
2210-
Cel cel = runtimeEnv.cel;
2212+
public void eval_withJsonFieldName_extensionFields(@TestParameter CelRuntimeFlavor runtimeFlavor)
2213+
throws Exception {
2214+
Cel cel = setupEnv(runtimeFlavor.builder());
22112215
CelAbstractSyntaxTree ast =
22122216
cel.compile(
22132217
"proto.getExt(file, dev.cel.testing.testdata.int64CamelCaseJsonName) == 5 &&"
@@ -2317,33 +2321,21 @@ private static TypeProvider aliasingProvider(ImmutableMap<String, Type> typeAlia
23172321
};
23182322
}
23192323

2320-
private enum RuntimeEnv {
2321-
LEGACY(setupEnv(CelFactory.standardCelBuilder())),
2322-
PLANNER(setupEnv(CelExperimentalFactory.plannerCelBuilder()))
2323-
;
2324-
2325-
private final Cel cel;
2326-
2327-
private static Cel setupEnv(CelBuilder celBuilder) {
2328-
ExtensionRegistry extensionRegistry = ExtensionRegistry.newInstance();
2329-
SingleFileExtensionsProto.registerAllExtensions(extensionRegistry);
2330-
return celBuilder
2331-
.addVar("file", StructTypeReference.create(SingleFile.getDescriptor().getFullName()))
2332-
.addMessageTypes(SingleFile.getDescriptor())
2333-
.addFileTypes(SingleFileExtensionsProto.getDescriptor())
2334-
.addCompilerLibraries(CelExtensions.protos())
2335-
.setExtensionRegistry(extensionRegistry)
2336-
.setOptions(
2337-
CelOptions.current()
2338-
.enableJsonFieldNames(true)
2339-
.enableHeterogeneousNumericComparisons(true)
2340-
.enableQuotedIdentifierSyntax(true)
2341-
.build())
2342-
.build();
2343-
}
2344-
2345-
RuntimeEnv(Cel cel) {
2346-
this.cel = cel;
2347-
}
2324+
private static Cel setupEnv(CelBuilder celBuilder) {
2325+
ExtensionRegistry extensionRegistry = ExtensionRegistry.newInstance();
2326+
SingleFileExtensionsProto.registerAllExtensions(extensionRegistry);
2327+
return celBuilder
2328+
.addVar("file", StructTypeReference.create(SingleFile.getDescriptor().getFullName()))
2329+
.addMessageTypes(SingleFile.getDescriptor())
2330+
.addFileTypes(SingleFileExtensionsProto.getDescriptor())
2331+
.addCompilerLibraries(CelExtensions.protos())
2332+
.setExtensionRegistry(extensionRegistry)
2333+
.setOptions(
2334+
CelOptions.current()
2335+
.enableJsonFieldNames(true)
2336+
.enableHeterogeneousNumericComparisons(true)
2337+
.enableQuotedIdentifierSyntax(true)
2338+
.build())
2339+
.build();
23482340
}
23492341
}

extensions/src/main/java/dev/cel/extensions/CelComprehensionsExtensions.java

Lines changed: 12 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -118,29 +118,18 @@ public void setRuntimeOptions(CelRuntimeBuilder runtimeBuilder) {
118118
@Override
119119
public void setRuntimeOptions(
120120
CelRuntimeBuilder runtimeBuilder, RuntimeEquality runtimeEquality, CelOptions celOptions) {
121-
for (Function function : functions) {
122-
for (CelOverloadDecl overload : function.functionDecl.overloads()) {
123-
switch (overload.overloadId()) {
124-
case MAP_INSERT_OVERLOAD_MAP_MAP:
125-
runtimeBuilder.addFunctionBindings(
126-
CelFunctionBinding.from(
127-
MAP_INSERT_OVERLOAD_MAP_MAP,
128-
Map.class,
129-
Map.class,
130-
(map1, map2) -> mapInsertMap(map1, map2, runtimeEquality)));
131-
break;
132-
case MAP_INSERT_OVERLOAD_KEY_VALUE:
133-
runtimeBuilder.addFunctionBindings(
134-
CelFunctionBinding.from(
135-
MAP_INSERT_OVERLOAD_KEY_VALUE,
136-
ImmutableList.of(Map.class, Object.class, Object.class),
137-
args -> mapInsertKeyValue(args, runtimeEquality)));
138-
break;
139-
default:
140-
// Nothing to add.
141-
}
142-
}
143-
}
121+
runtimeBuilder.addFunctionBindings(
122+
CelFunctionBinding.fromOverloads(
123+
MAP_INSERT_FUNCTION,
124+
CelFunctionBinding.from(
125+
MAP_INSERT_OVERLOAD_MAP_MAP,
126+
Map.class,
127+
Map.class,
128+
(map1, map2) -> mapInsertMap(map1, map2, runtimeEquality)),
129+
CelFunctionBinding.from(
130+
MAP_INSERT_OVERLOAD_KEY_VALUE,
131+
ImmutableList.of(Map.class, Object.class, Object.class),
132+
args -> mapInsertKeyValue(args, runtimeEquality))));
144133
}
145134

146135
@Override

extensions/src/main/java/dev/cel/extensions/CelEncoderExtensions.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,9 +135,13 @@ public void setRuntimeOptions(CelRuntimeBuilder runtimeBuilder) {
135135
functions.forEach(
136136
function -> {
137137
if (celOptions.evaluateCanonicalTypesToNativeValues()) {
138-
runtimeBuilder.addFunctionBindings(function.nativeBytesFunctionBinding);
138+
runtimeBuilder.addFunctionBindings(
139+
CelFunctionBinding.fromOverloads(
140+
function.getFunction(), function.nativeBytesFunctionBinding));
139141
} else {
140-
runtimeBuilder.addFunctionBindings(function.protoBytesFunctionBinding);
142+
runtimeBuilder.addFunctionBindings(
143+
CelFunctionBinding.fromOverloads(
144+
function.getFunction(), function.protoBytesFunctionBinding));
141145
}
142146
});
143147
}

extensions/src/main/java/dev/cel/extensions/CelListsExtensions.java

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,10 @@ String getFunction() {
147147

148148
Function(CelFunctionDecl functionDecl, CelFunctionBinding... functionBindings) {
149149
this.functionDecl = functionDecl;
150-
this.functionBindings = ImmutableSet.copyOf(functionBindings);
150+
this.functionBindings =
151+
functionBindings.length == 0
152+
? ImmutableSet.of()
153+
: CelFunctionBinding.fromOverloads(functionDecl.name(), functionBindings);
151154
}
152155
}
153156

@@ -246,20 +249,28 @@ public void setRuntimeOptions(
246249
switch (overload.overloadId()) {
247250
case "list_distinct":
248251
runtimeBuilder.addFunctionBindings(
249-
CelFunctionBinding.from(
250-
"list_distinct", Collection.class, (list) -> distinct(list, runtimeEquality)));
252+
CelFunctionBinding.fromOverloads(
253+
"distinct",
254+
CelFunctionBinding.from(
255+
"list_distinct",
256+
Collection.class,
257+
(list) -> distinct(list, runtimeEquality))));
251258
break;
252259
case "list_sort":
253260
runtimeBuilder.addFunctionBindings(
254-
CelFunctionBinding.from(
255-
"list_sort", Collection.class, (list) -> sort(list, celOptions)));
261+
CelFunctionBinding.fromOverloads(
262+
"sort",
263+
CelFunctionBinding.from(
264+
"list_sort", Collection.class, (list) -> sort(list, celOptions))));
256265
break;
257266
case "list_sortByAssociatedKeys":
258267
runtimeBuilder.addFunctionBindings(
259-
CelFunctionBinding.from(
260-
"list_sortByAssociatedKeys",
261-
Collection.class,
262-
(list) -> sortByAssociatedKeys(list, celOptions)));
268+
CelFunctionBinding.fromOverloads(
269+
"lists.@sortByAssociatedKeys",
270+
CelFunctionBinding.from(
271+
"list_sortByAssociatedKeys",
272+
Collection.class,
273+
(list) -> sortByAssociatedKeys(list, celOptions))));
263274
break;
264275
default:
265276
// Nothing to add

extensions/src/main/java/dev/cel/extensions/CelMathExtensions.java

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -663,19 +663,9 @@ String getFunction() {
663663
ImmutableSet<CelFunctionBinding> functionBindingsULongSigned,
664664
ImmutableSet<CelFunctionBinding> functionBindingsULongUnsigned) {
665665
this.functionDecl = functionDecl;
666-
this.functionBindings =
667-
functionBindings.isEmpty()
668-
? ImmutableSet.of()
669-
: CelFunctionBinding.fromOverloads(functionDecl.name(), functionBindings);
670-
this.functionBindingsULongSigned =
671-
functionBindingsULongSigned.isEmpty()
672-
? ImmutableSet.of()
673-
: CelFunctionBinding.fromOverloads(functionDecl.name(), functionBindingsULongSigned);
674-
this.functionBindingsULongUnsigned =
675-
functionBindingsULongUnsigned.isEmpty()
676-
? ImmutableSet.of()
677-
: CelFunctionBinding.fromOverloads(
678-
functionDecl.name(), functionBindingsULongUnsigned);
666+
this.functionBindings = functionBindings;
667+
this.functionBindingsULongSigned = functionBindingsULongSigned;
668+
this.functionBindingsULongUnsigned = functionBindingsULongUnsigned;
679669
}
680670
}
681671

@@ -788,11 +778,18 @@ public void setCheckerOptions(CelCheckerBuilder checkerBuilder) {
788778
public void setRuntimeOptions(CelRuntimeBuilder runtimeBuilder) {
789779
functions.forEach(
790780
function -> {
791-
runtimeBuilder.addFunctionBindings(function.functionBindings);
792-
runtimeBuilder.addFunctionBindings(
781+
ImmutableSet.Builder<CelFunctionBinding> combinedBindings = ImmutableSet.builder();
782+
combinedBindings.addAll(function.functionBindings);
783+
combinedBindings.addAll(
793784
enableUnsignedLongs
794785
? function.functionBindingsULongUnsigned
795786
: function.functionBindingsULongSigned);
787+
788+
ImmutableSet<CelFunctionBinding> combined = combinedBindings.build();
789+
if (!combined.isEmpty()) {
790+
runtimeBuilder.addFunctionBindings(
791+
CelFunctionBinding.fromOverloads(function.functionDecl.name(), combined));
792+
}
796793
});
797794
}
798795

extensions/src/main/java/dev/cel/extensions/SetsExtensionsRuntimeImpl.java

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -45,28 +45,34 @@ ImmutableSet<CelFunctionBinding> newFunctionBindings() {
4545
for (SetsFunction function : functions) {
4646
switch (function) {
4747
case CONTAINS:
48-
bindingBuilder.add(
49-
CelFunctionBinding.from(
50-
"list_sets_contains_list",
51-
Collection.class,
52-
Collection.class,
53-
this::containsAll));
48+
bindingBuilder.addAll(
49+
CelFunctionBinding.fromOverloads(
50+
function.getFunction(),
51+
CelFunctionBinding.from(
52+
"list_sets_contains_list",
53+
Collection.class,
54+
Collection.class,
55+
this::containsAll)));
5456
break;
5557
case EQUIVALENT:
56-
bindingBuilder.add(
57-
CelFunctionBinding.from(
58-
"list_sets_equivalent_list",
59-
Collection.class,
60-
Collection.class,
61-
(listA, listB) -> containsAll(listA, listB) && containsAll(listB, listA)));
58+
bindingBuilder.addAll(
59+
CelFunctionBinding.fromOverloads(
60+
function.getFunction(),
61+
CelFunctionBinding.from(
62+
"list_sets_equivalent_list",
63+
Collection.class,
64+
Collection.class,
65+
(listA, listB) -> containsAll(listA, listB) && containsAll(listB, listA))));
6266
break;
6367
case INTERSECTS:
64-
bindingBuilder.add(
65-
CelFunctionBinding.from(
66-
"list_sets_intersects_list",
67-
Collection.class,
68-
Collection.class,
69-
this::setIntersects));
68+
bindingBuilder.addAll(
69+
CelFunctionBinding.fromOverloads(
70+
function.getFunction(),
71+
CelFunctionBinding.from(
72+
"list_sets_intersects_list",
73+
Collection.class,
74+
Collection.class,
75+
this::setIntersects)));
7076
break;
7177
}
7278
}

extensions/src/test/java/dev/cel/extensions/BUILD.bazel

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ java_library(
1717
"//common:options",
1818
"//common/exceptions:divide_by_zero",
1919
"//common/exceptions:index_out_of_bounds",
20+
"//common/exceptions:invalid_argument",
2021
"//common/types",
2122
"//common/types:type_providers",
2223
"//common/values",
@@ -40,6 +41,7 @@ java_library(
4041
"//runtime:lite_runtime_factory",
4142
"//runtime:partial_vars",
4243
"//runtime:unknown_attributes",
44+
"//testing:cel_runtime_flavor",
4345
"@cel_spec//proto/cel/expr/conformance/proto2:test_all_types_java_proto",
4446
"@cel_spec//proto/cel/expr/conformance/proto3:test_all_types_java_proto",
4547
"@cel_spec//proto/cel/expr/conformance/test:simple_java_proto",

0 commit comments

Comments
 (0)