Skip to content

Commit e8079d0

Browse files
l46kokcopybara-github
authored andcommitted
Implement optionals for planner
PiperOrigin-RevId: 874895299
1 parent ffc708a commit e8079d0

21 files changed

Lines changed: 945 additions & 258 deletions

bundle/BUILD.bazel

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@ package(
77

88
java_library(
99
name = "cel",
10-
exports = ["//bundle/src/main/java/dev/cel/bundle:cel"],
10+
exports = [
11+
"//bundle/src/main/java/dev/cel/bundle:cel",
12+
"//bundle/src/main/java/dev/cel/bundle:cel_factory",
13+
],
1114
)
1215

1316
java_library(
@@ -29,3 +32,10 @@ java_library(
2932
name = "environment_exporter",
3033
exports = ["//bundle/src/main/java/dev/cel/bundle:environment_exporter"],
3134
)
35+
36+
java_library(
37+
name = "cel_impl",
38+
testonly = 1,
39+
visibility = ["//:internal"],
40+
exports = ["//bundle/src/main/java/dev/cel/bundle:cel_impl"],
41+
)

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

Lines changed: 48 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@ package(
1111
CEL_SOURCES = [
1212
"Cel.java",
1313
"CelBuilder.java",
14-
"CelFactory.java",
15-
"CelImpl.java",
1614
]
1715

1816
java_library(
@@ -21,31 +19,74 @@ java_library(
2119
tags = [
2220
],
2321
deps = [
22+
"//checker:checker_legacy_environment",
23+
"//checker:proto_type_mask",
24+
"//checker:standard_decl",
25+
"//common:compiler_common",
26+
"//common:container",
27+
"//common:options",
28+
"//common/types:type_providers",
29+
"//common/values:cel_value_provider",
30+
"//compiler:compiler_builder",
31+
"//parser:macro",
32+
"//runtime",
33+
"//runtime:function_binding",
34+
"//runtime:standard_functions",
35+
"@cel_spec//proto/cel/expr:checked_java_proto",
36+
"@maven//:com_google_code_findbugs_annotations",
37+
"@maven//:com_google_errorprone_error_prone_annotations",
38+
"@maven//:com_google_guava_guava",
39+
"@maven//:com_google_protobuf_protobuf_java",
40+
],
41+
)
42+
43+
java_library(
44+
name = "cel_factory",
45+
srcs = ["CelFactory.java"],
46+
tags = [
47+
],
48+
deps = [
49+
":cel",
50+
":cel_impl",
2451
"//checker",
52+
"//common:options",
53+
"//compiler",
54+
"//compiler:compiler_builder",
55+
"//parser",
56+
"//runtime",
57+
],
58+
)
59+
60+
java_library(
61+
name = "cel_impl",
62+
srcs = ["CelImpl.java"],
63+
tags = [
64+
],
65+
deps = [
66+
":cel",
2567
"//checker:checker_builder",
26-
"//checker:checker_legacy_environment",
2768
"//checker:proto_type_mask",
2869
"//checker:standard_decl",
70+
"//checker:type_provider_legacy",
2971
"//common:cel_ast",
3072
"//common:cel_source",
3173
"//common:compiler_common",
3274
"//common:container",
3375
"//common:options",
76+
"//common/annotations",
3477
"//common/internal:env_visitor",
3578
"//common/internal:file_descriptor_converter",
3679
"//common/types:cel_proto_types",
3780
"//common/types:type_providers",
3881
"//common/values:cel_value_provider",
39-
"//compiler",
4082
"//compiler:compiler_builder",
41-
"//parser",
4283
"//parser:macro",
4384
"//parser:parser_builder",
4485
"//runtime",
4586
"//runtime:function_binding",
87+
"//runtime:runtime_planner_impl",
4688
"//runtime:standard_functions",
4789
"@cel_spec//proto/cel/expr:checked_java_proto",
48-
"@maven//:com_google_code_findbugs_annotations",
4990
"@maven//:com_google_errorprone_error_prone_annotations",
5091
"@maven//:com_google_guava_guava",
5192
"@maven//:com_google_protobuf_protobuf_java",
@@ -60,6 +101,7 @@ java_library(
60101
tags = [
61102
],
62103
deps = [
104+
":cel_factory",
63105
":environment_exception",
64106
":required_fields_checker",
65107
"//:auto_value",

bundle/src/main/java/dev/cel/bundle/CelImpl.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import dev.cel.common.CelSource;
3939
import dev.cel.common.CelValidationResult;
4040
import dev.cel.common.CelVarDecl;
41+
import dev.cel.common.annotations.Internal;
4142
import dev.cel.common.internal.EnvVisitable;
4243
import dev.cel.common.internal.EnvVisitor;
4344
import dev.cel.common.internal.FileDescriptorSetConverter;
@@ -54,6 +55,7 @@
5455
import dev.cel.runtime.CelEvaluationException;
5556
import dev.cel.runtime.CelRuntime;
5657
import dev.cel.runtime.CelRuntimeBuilder;
58+
import dev.cel.runtime.CelRuntimeImpl;
5759
import dev.cel.runtime.CelRuntimeLibrary;
5860
import dev.cel.runtime.CelStandardFunctions;
5961
import java.util.Arrays;
@@ -63,9 +65,14 @@
6365
* Implementation of the synchronous CEL stack.
6466
*
6567
* <p>Note, the underlying {@link CelCompiler} and {@link CelRuntime} values are constructed lazily.
68+
*
69+
* <p>CEL Library Internals. Do Not Use. Consumers should use {@code CelFactory} instead.
70+
*
71+
* <p>TODO: Restrict visibility once factory is introduced
6672
*/
6773
@Immutable
68-
final class CelImpl implements Cel, EnvVisitable {
74+
@Internal
75+
public final class CelImpl implements Cel, EnvVisitable {
6976

7077
// The lazily constructed compiler and runtime values are memoized and guaranteed to be
7178
// constructed only once without side effects, thus making them effectively immutable.
@@ -142,8 +149,13 @@ static CelImpl combine(CelCompiler compiler, CelRuntime runtime) {
142149
* Create a new builder for constructing a {@code CelImpl} instance.
143150
*
144151
* <p>By default, {@link CelOptions#DEFAULT} are enabled, as is the CEL standard environment.
152+
*
153+
* <p>CEL Library Internals. Do Not Use. Consumers should use {@code CelFactory} instead.
154+
*
155+
* <p>TODO: Restrict visibility once factory is introduced
145156
*/
146-
static CelBuilder newBuilder(
157+
@Internal
158+
public static CelBuilder newBuilder(
147159
CelCompilerBuilder compilerBuilder, CelRuntimeBuilder celRuntimeBuilder) {
148160
return new CelImpl.Builder(compilerBuilder, celRuntimeBuilder);
149161
}
@@ -199,6 +211,10 @@ public CelContainer container() {
199211
@Override
200212
public CelBuilder setContainer(CelContainer container) {
201213
compilerBuilder.setContainer(container);
214+
if (runtimeBuilder instanceof CelRuntimeImpl.Builder) {
215+
runtimeBuilder.setContainer(container);
216+
}
217+
202218
return this;
203219
}
204220

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ java_library(
1717
deps = [
1818
"//:java_truth",
1919
"//bundle:cel",
20+
"//bundle:cel_impl",
2021
"//bundle:environment",
2122
"//bundle:environment_exception",
2223
"//bundle:environment_exporter",

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

Lines changed: 63 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717
import static com.google.common.base.Preconditions.checkArgument;
1818
import static com.google.common.base.Preconditions.checkNotNull;
1919
import static com.google.common.collect.ImmutableList.toImmutableList;
20+
import static dev.cel.common.Operator.INDEX;
21+
import static dev.cel.common.Operator.OPTIONAL_INDEX;
22+
import static dev.cel.common.Operator.OPTIONAL_SELECT;
2023
import static dev.cel.extensions.CelOptionalLibrary.Function.FIRST;
2124
import static dev.cel.extensions.CelOptionalLibrary.Function.HAS_VALUE;
2225
import static dev.cel.extensions.CelOptionalLibrary.Function.LAST;
@@ -342,54 +345,69 @@ public void setRuntimeOptions(
342345
"optional_hasValue", Object.class, val -> ((Optional<?>) val).isPresent())));
343346

344347
runtimeBuilder.addFunctionBindings(
345-
CelFunctionBinding.from(
346-
"select_optional_field", // This only handles map selection. Proto selection is
347-
// special cased inside the interpreter.
348-
Map.class,
349-
String.class,
350-
runtimeEquality::findInMap),
351-
CelFunctionBinding.from(
352-
"map_optindex_optional_value", Map.class, Object.class, runtimeEquality::findInMap),
353-
CelFunctionBinding.from(
354-
"optional_map_optindex_optional_value",
355-
Optional.class,
356-
Object.class,
357-
(Optional optionalMap, Object key) ->
358-
indexOptionalMap(optionalMap, key, runtimeEquality)),
359-
CelFunctionBinding.from(
360-
"optional_map_index_value",
361-
Optional.class,
362-
Object.class,
363-
(Optional optionalMap, Object key) ->
364-
indexOptionalMap(optionalMap, key, runtimeEquality)),
365-
CelFunctionBinding.from(
366-
"optional_list_index_int",
367-
Optional.class,
368-
Long.class,
369-
CelOptionalLibrary::indexOptionalList),
370-
CelFunctionBinding.from(
371-
"list_optindex_optional_int",
372-
List.class,
373-
Long.class,
374-
(List list, Long index) -> {
375-
int castIndex = Ints.checkedCast(index);
376-
if (castIndex < 0 || castIndex >= list.size()) {
377-
return Optional.empty();
378-
}
379-
return Optional.of(list.get(castIndex));
380-
}),
381-
CelFunctionBinding.from(
382-
"optional_list_optindex_optional_int",
383-
Optional.class,
384-
Long.class,
385-
CelOptionalLibrary::indexOptionalList));
348+
fromOverloads(
349+
OPTIONAL_SELECT.getFunction(),
350+
CelFunctionBinding.from(
351+
"select_optional_field", // This only handles map selection. Proto selection is
352+
// special cased inside the interpreter.
353+
Map.class,
354+
String.class,
355+
runtimeEquality::findInMap)));
356+
357+
runtimeBuilder.addFunctionBindings(
358+
fromOverloads(
359+
OPTIONAL_INDEX.getFunction(),
360+
CelFunctionBinding.from(
361+
"list_optindex_optional_int",
362+
List.class,
363+
Long.class,
364+
(List list, Long index) -> {
365+
int castIndex = Ints.checkedCast(index);
366+
if (castIndex < 0 || castIndex >= list.size()) {
367+
return Optional.empty();
368+
}
369+
return Optional.of(list.get(castIndex));
370+
}),
371+
CelFunctionBinding.from(
372+
"optional_list_optindex_optional_int",
373+
Optional.class,
374+
Long.class,
375+
CelOptionalLibrary::indexOptionalList),
376+
CelFunctionBinding.from(
377+
"map_optindex_optional_value", Map.class, Object.class, runtimeEquality::findInMap),
378+
CelFunctionBinding.from(
379+
"optional_map_optindex_optional_value",
380+
Optional.class,
381+
Object.class,
382+
(Optional optionalMap, Object key) ->
383+
indexOptionalMap(optionalMap, key, runtimeEquality))));
384+
385+
runtimeBuilder.addFunctionBindings(
386+
fromOverloads(
387+
INDEX.getFunction(),
388+
CelFunctionBinding.from(
389+
"optional_list_index_int",
390+
Optional.class,
391+
Long.class,
392+
CelOptionalLibrary::indexOptionalList),
393+
CelFunctionBinding.from(
394+
"optional_map_index_value",
395+
Optional.class,
396+
Object.class,
397+
(Optional optionalMap, Object key) ->
398+
indexOptionalMap(optionalMap, key, runtimeEquality))));
386399

387400
if (version >= 2) {
388401
runtimeBuilder.addFunctionBindings(
389-
CelFunctionBinding.from(
390-
"optional_list_first", Collection.class, CelOptionalLibrary::listOptionalFirst),
391-
CelFunctionBinding.from(
392-
"optional_list_last", Collection.class, CelOptionalLibrary::listOptionalLast));
402+
fromOverloads(
403+
"first",
404+
CelFunctionBinding.from(
405+
"optional_list_first", Collection.class, CelOptionalLibrary::listOptionalFirst)));
406+
runtimeBuilder.addFunctionBindings(
407+
fromOverloads(
408+
"last",
409+
CelFunctionBinding.from(
410+
"optional_list_last", Collection.class, CelOptionalLibrary::listOptionalLast)));
393411
}
394412
}
395413

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ java_library(
1010
deps = [
1111
"//:java_truth",
1212
"//bundle:cel",
13+
"//bundle:cel_impl",
14+
"//checker",
1315
"//common:cel_ast",
1416
"//common:compiler_common",
1517
"//common:container",
@@ -30,13 +32,15 @@ java_library(
3032
"//extensions:sets",
3133
"//extensions:sets_function",
3234
"//extensions:strings",
35+
"//parser",
3336
"//parser:macro",
3437
"//parser:unparser",
3538
"//runtime",
3639
"//runtime:function_binding",
3740
"//runtime:interpreter_util",
3841
"//runtime:lite_runtime",
3942
"//runtime:lite_runtime_factory",
43+
"//runtime:runtime_planner_impl",
4044
"@cel_spec//proto/cel/expr/conformance/proto2:test_all_types_java_proto",
4145
"@cel_spec//proto/cel/expr/conformance/proto3:test_all_types_java_proto",
4246
"@cel_spec//proto/cel/expr/conformance/test:simple_java_proto",

0 commit comments

Comments
 (0)