1717#include " eval/public/cel_expr_builder_factory.h"
1818
1919#include < memory>
20- #include < string>
21- #include < utility>
2220
21+ #include " absl/log/absl_log.h"
2322#include " absl/status/status.h"
23+ #include " absl/status/statusor.h"
24+ #include " base/ast_internal/ast_impl.h"
25+ #include " base/kind.h"
26+ #include " common/memory.h"
27+ #include " eval/compiler/cel_expression_builder_flat_impl.h"
28+ #include " eval/compiler/comprehension_vulnerability_check.h"
29+ #include " eval/compiler/constant_folding.h"
2430#include " eval/compiler/flat_expr_builder.h"
31+ #include " eval/compiler/flat_expr_builder_extensions.h"
32+ #include " eval/compiler/qualified_reference_resolver.h"
33+ #include " eval/compiler/regex_precompilation_optimization.h"
34+ #include " eval/public/cel_expression.h"
35+ #include " eval/public/cel_function.h"
2536#include " eval/public/cel_options.h"
26- #include " eval/public/portable_cel_expr_builder_factory.h"
27- #include " eval/public/structs/proto_message_type_adapter.h"
2837#include " eval/public/structs/protobuf_descriptor_type_provider.h"
38+ #include " extensions/protobuf/memory_manager.h"
39+ #include " extensions/select_optimization.h"
2940#include " internal/proto_util.h"
41+ #include " runtime/runtime_options.h"
42+ #include " google/protobuf/descriptor.h"
43+ #include " google/protobuf/message.h"
3044
3145namespace google ::api::expr::runtime {
3246
3347namespace {
48+
49+ using ::cel::MemoryManagerRef;
50+ using ::cel::ast_internal::AstImpl;
51+ using ::cel::extensions::CreateSelectOptimizationProgramOptimizer;
52+ using ::cel::extensions::kCelAttribute ;
53+ using ::cel::extensions::kCelHasField ;
54+ using ::cel::extensions::ProtoMemoryManagerRef;
55+ using ::cel::extensions::SelectOptimizationAstUpdater;
56+ using ::cel::runtime_internal::CreateConstantFoldingOptimizer;
3457using ::google::api::expr::internal::ValidateStandardMessageTypes;
58+
59+ // Adapter for a raw arena* pointer. Manages a MemoryManager object for the
60+ // constant folding extension.
61+ struct ArenaBackedConstfoldingFactory {
62+ MemoryManagerRef memory_manager;
63+
64+ absl::StatusOr<std::unique_ptr<ProgramOptimizer>> operator ()(
65+ PlannerContext& ctx, const AstImpl& ast) const {
66+ return CreateConstantFoldingOptimizer (memory_manager)(ctx, ast);
67+ }
68+ };
69+
3570} // namespace
3671
3772std::unique_ptr<CelExpressionBuilder> CreateCelExpressionBuilder (
@@ -49,10 +84,67 @@ std::unique_ptr<CelExpressionBuilder> CreateCelExpressionBuilder(
4984 return nullptr ;
5085 }
5186
87+ cel::RuntimeOptions runtime_options = ConvertToRuntimeOptions (options);
5288 auto builder =
53- CreatePortableExprBuilder (std::make_unique<ProtobufDescriptorProvider>(
54- descriptor_pool, message_factory),
55- options);
89+ std::make_unique<CelExpressionBuilderFlatImpl>(runtime_options);
90+
91+ builder->GetTypeRegistry ()
92+ ->InternalGetModernRegistry ()
93+ .set_use_legacy_container_builders (options.use_legacy_container_builders );
94+
95+ builder->GetTypeRegistry ()->RegisterTypeProvider (
96+ std::make_unique<ProtobufDescriptorProvider>(descriptor_pool,
97+ message_factory));
98+
99+ FlatExprBuilder& flat_expr_builder = builder->flat_expr_builder ();
100+
101+ flat_expr_builder.AddAstTransform (NewReferenceResolverExtension (
102+ (options.enable_qualified_identifier_rewrites )
103+ ? ReferenceResolverOption::kAlways
104+ : ReferenceResolverOption::kCheckedOnly ));
105+
106+ if (options.enable_comprehension_vulnerability_check ) {
107+ builder->flat_expr_builder ().AddProgramOptimizer (
108+ CreateComprehensionVulnerabilityCheck ());
109+ }
110+
111+ if (options.constant_folding ) {
112+ builder->flat_expr_builder ().AddProgramOptimizer (
113+ ArenaBackedConstfoldingFactory{
114+ ProtoMemoryManagerRef (options.constant_arena )});
115+ }
116+
117+ if (options.enable_regex_precompilation ) {
118+ flat_expr_builder.AddProgramOptimizer (
119+ CreateRegexPrecompilationExtension (options.regex_max_program_size ));
120+ }
121+
122+ if (options.enable_select_optimization ) {
123+ // Add AST transform to update select branches on a stored
124+ // CheckedExpression. This may already be performed by a type checker.
125+ flat_expr_builder.AddAstTransform (
126+ std::make_unique<SelectOptimizationAstUpdater>());
127+ // Add overloads for select optimization signature.
128+ // These are never bound, only used to prevent the builder from failing on
129+ // the overloads check.
130+ absl::Status status =
131+ builder->GetRegistry ()->RegisterLazyFunction (CelFunctionDescriptor (
132+ kCelAttribute , false , {cel::Kind::kAny , cel::Kind::kList }));
133+ if (!status.ok ()) {
134+ ABSL_LOG (ERROR) << " Failed to register " << kCelAttribute << " : "
135+ << status;
136+ }
137+ status = builder->GetRegistry ()->RegisterLazyFunction (CelFunctionDescriptor (
138+ kCelHasField , false , {cel::Kind::kAny , cel::Kind::kList }));
139+ if (!status.ok ()) {
140+ ABSL_LOG (ERROR) << " Failed to register " << kCelHasField << " : "
141+ << status;
142+ }
143+ // Add runtime implementation.
144+ flat_expr_builder.AddProgramOptimizer (
145+ CreateSelectOptimizationProgramOptimizer ());
146+ }
147+
56148 return builder;
57149}
58150
0 commit comments