Skip to content

Commit 58397d7

Browse files
jnthntatumcopybara-github
authored andcommitted
Split flat expression evaluator implementation from implementation of the legacy CelExpression interface.
PiperOrigin-RevId: 537376126
1 parent 30bfb80 commit 58397d7

28 files changed

+508
-278
lines changed

eval/compiler/BUILD

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -79,12 +79,10 @@ cc_library(
7979
"//eval/internal:interop",
8080
"//eval/public:ast_traverse_native",
8181
"//eval/public:ast_visitor_native",
82-
"//eval/public:cel_expression",
8382
"//eval/public:source_position_native",
8483
"//internal:status_macros",
8584
"//runtime:function_registry",
8685
"//runtime:runtime_options",
87-
"@com_google_absl//absl/base:core_headers",
8886
"@com_google_absl//absl/container:flat_hash_map",
8987
"@com_google_absl//absl/container:node_hash_map",
9088
"@com_google_absl//absl/log:check",
@@ -187,6 +185,7 @@ cc_library(
187185
deps = [
188186
":flat_expr_builder",
189187
"//base:ast",
188+
"//eval/eval:cel_expression_flat_impl",
190189
"//eval/eval:evaluator_core",
191190
"//eval/public:cel_expression",
192191
"//extensions/protobuf:ast_converters",
@@ -232,6 +231,7 @@ cc_library(
232231
":flat_expr_builder_extensions",
233232
":resolver",
234233
"//base:ast_internal",
234+
"//base:builtins",
235235
"//base:data",
236236
"//base:function",
237237
"//base:handle",
@@ -241,13 +241,11 @@ cc_library(
241241
"//eval/eval:evaluator_core",
242242
"//eval/internal:errors",
243243
"//eval/internal:interop",
244-
"//eval/public:activation",
245-
"//eval/public:cel_builtins",
246-
"//eval/public:cel_expression",
247244
"//eval/public:cel_value",
248245
"//eval/public/containers:container_backed_list_impl",
249246
"//extensions/protobuf:memory_manager",
250247
"//internal:status_macros",
248+
"//runtime:activation",
251249
"//runtime:function_overload_reference",
252250
"//runtime:function_registry",
253251
"@com_google_absl//absl/container:flat_hash_map",
@@ -438,6 +436,7 @@ cc_test(
438436
"//base:data",
439437
"//base:memory",
440438
"//base/internal:ast_impl",
439+
"//eval/eval:cel_expression_flat_impl",
441440
"//eval/eval:evaluator_core",
442441
"//eval/public:builtin_func_registrar",
443442
"//eval/public:cel_options",

eval/compiler/cel_expression_builder_flat_impl.cc

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include "absl/status/status.h"
2828
#include "absl/status/statusor.h"
2929
#include "base/ast.h"
30+
#include "eval/eval/cel_expression_flat_impl.h"
3031
#include "eval/eval/evaluator_core.h"
3132
#include "extensions/protobuf/ast_converters.h"
3233
#include "internal/status_macros.h"
@@ -46,8 +47,10 @@ CelExpressionBuilderFlatImpl::CreateExpression(
4647
CEL_ASSIGN_OR_RETURN(
4748
std::unique_ptr<Ast> converted_ast,
4849
cel::extensions::CreateAstFromParsedExpr(*expr, source_info));
49-
return flat_expr_builder_.CreateExpressionImpl(std::move(converted_ast),
50-
warnings);
50+
CEL_ASSIGN_OR_RETURN(FlatExpression impl,
51+
flat_expr_builder_.CreateExpressionImpl(
52+
std::move(converted_ast), warnings));
53+
return std::make_unique<CelExpressionFlatImpl>(std::move(impl));
5154
}
5255

5356
absl::StatusOr<std::unique_ptr<CelExpression>>
@@ -65,8 +68,11 @@ CelExpressionBuilderFlatImpl::CreateExpression(
6568
CEL_ASSIGN_OR_RETURN(
6669
std::unique_ptr<Ast> converted_ast,
6770
cel::extensions::CreateAstFromCheckedExpr(*checked_expr));
68-
return flat_expr_builder_.CreateExpressionImpl(std::move(converted_ast),
69-
warnings);
71+
72+
CEL_ASSIGN_OR_RETURN(FlatExpression impl,
73+
flat_expr_builder_.CreateExpressionImpl(
74+
std::move(converted_ast), warnings));
75+
return std::make_unique<CelExpressionFlatImpl>(std::move(impl));
7076
}
7177

7278
absl::StatusOr<std::unique_ptr<CelExpression>>

eval/compiler/constant_folding.cc

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@
1010
#include "absl/types/span.h"
1111
#include "absl/types/variant.h"
1212
#include "base/ast_internal.h"
13+
#include "base/builtins.h"
1314
#include "base/function.h"
1415
#include "base/handle.h"
1516
#include "base/internal/ast_impl.h"
1617
#include "base/kind.h"
18+
#include "base/type_provider.h"
1719
#include "base/value.h"
1820
#include "base/values/bytes_value.h"
1921
#include "base/values/error_value.h"
@@ -25,38 +27,36 @@
2527
#include "eval/eval/evaluator_core.h"
2628
#include "eval/internal/errors.h"
2729
#include "eval/internal/interop.h"
28-
#include "eval/public/activation.h"
29-
#include "eval/public/cel_builtins.h"
30-
#include "eval/public/cel_expression.h"
3130
#include "eval/public/cel_value.h"
3231
#include "eval/public/containers/container_backed_list_impl.h"
3332
#include "extensions/protobuf/memory_manager.h"
3433
#include "internal/status_macros.h"
34+
#include "runtime/activation.h"
3535
#include "runtime/function_overload_reference.h"
3636
#include "runtime/function_registry.h"
3737

3838
namespace cel::ast::internal {
3939

4040
namespace {
4141

42+
using ::cel::builtin::kAnd;
43+
using ::cel::builtin::kOr;
44+
using ::cel::builtin::kTernary;
45+
using ::cel::extensions::ProtoMemoryManager;
4246
using ::cel::interop_internal::CreateErrorValueFromView;
4347
using ::cel::interop_internal::CreateLegacyListValue;
4448
using ::cel::interop_internal::CreateNoMatchingOverloadError;
4549
using ::cel::interop_internal::ModernValueToLegacyValueOrDie;
46-
using ::google::api::expr::runtime::Activation;
47-
using ::google::api::expr::runtime::CelEvaluationListener;
48-
using ::google::api::expr::runtime::CelExpressionFlatEvaluationState;
4950
using ::google::api::expr::runtime::CelValue;
5051
using ::google::api::expr::runtime::ContainerBackedListImpl;
52+
using ::google::api::expr::runtime::EvaluationListener;
5153
using ::google::api::expr::runtime::ExecutionFrame;
5254
using ::google::api::expr::runtime::ExecutionPath;
5355
using ::google::api::expr::runtime::ExecutionPathView;
56+
using ::google::api::expr::runtime::FlatExpressionEvaluatorState;
5457
using ::google::api::expr::runtime::PlannerContext;
5558
using ::google::api::expr::runtime::ProgramOptimizer;
5659
using ::google::api::expr::runtime::Resolver;
57-
using ::google::api::expr::runtime::builtin::kAnd;
58-
using ::google::api::expr::runtime::builtin::kOr;
59-
using ::google::api::expr::runtime::builtin::kTernary;
6060

6161
using ::google::protobuf::Arena;
6262

@@ -201,11 +201,8 @@ class ConstantFoldingTransform {
201201
}
202202
// short-circuiting affects evaluation of logic combinators, so we do
203203
// not fold them here
204-
if (!all_constant ||
205-
call_expr.function() == google::api::expr::runtime::builtin::kAnd ||
206-
call_expr.function() == google::api::expr::runtime::builtin::kOr ||
207-
call_expr.function() ==
208-
google::api::expr::runtime::builtin::kTernary) {
204+
if (!all_constant || call_expr.function() == cel::builtin::kAnd ||
205+
call_expr.function() == kOr || call_expr.function() == kTernary) {
209206
return false;
210207
}
211208

@@ -392,8 +389,11 @@ bool ConstantFoldingTransform::Transform(const Expr& expr, Expr& out_) {
392389

393390
class ConstantFoldingExtension : public ProgramOptimizer {
394391
public:
395-
explicit ConstantFoldingExtension(google::protobuf::Arena* arena)
396-
: arena_(arena), state_(kDefaultStackLimit, arena) {}
392+
explicit ConstantFoldingExtension(google::protobuf::Arena* arena,
393+
const TypeProvider& type_provider)
394+
: arena_(arena),
395+
memory_manager_(arena),
396+
state_(kDefaultStackLimit, type_provider, memory_manager_) {}
397397

398398
absl::Status OnPreVisit(google::api::expr::runtime::PlannerContext& context,
399399
const Expr& node) override;
@@ -410,9 +410,10 @@ class ConstantFoldingExtension : public ProgramOptimizer {
410410
static constexpr size_t kDefaultStackLimit = 4;
411411

412412
google::protobuf::Arena* arena_;
413+
ProtoMemoryManager memory_manager_;
413414
Activation empty_;
414-
CelEvaluationListener null_listener_;
415-
CelExpressionFlatEvaluationState state_;
415+
EvaluationListener null_listener_;
416+
FlatExpressionEvaluatorState state_;
416417

417418
std::vector<IsConst> is_const_;
418419
};
@@ -498,7 +499,7 @@ absl::Status ConstantFoldingExtension::OnPostVisit(PlannerContext& context,
498499
node.const_expr().constant_kind());
499500
} else {
500501
ExecutionPathView subplan = context.GetSubplan(node);
501-
ExecutionFrame frame(subplan, empty_, context.options(), &state_);
502+
ExecutionFrame frame(subplan, empty_, context.options(), state_);
502503
state_.Reset();
503504
// Update stack size to accommodate sub expression.
504505
// This only results in a vector resize if the new maxsize is greater than
@@ -531,8 +532,9 @@ void FoldConstants(
531532

532533
google::api::expr::runtime::ProgramOptimizerFactory
533534
CreateConstantFoldingExtension(google::protobuf::Arena* arena) {
534-
return [=](PlannerContext&, const AstImpl&) {
535-
return std::make_unique<ConstantFoldingExtension>(arena);
535+
return [=](PlannerContext& ctx, const AstImpl&) {
536+
return std::make_unique<ConstantFoldingExtension>(
537+
arena, ctx.type_registry().GetTypeProvider());
536538
};
537539
}
538540

eval/compiler/flat_expr_builder.cc

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
#include <utility>
2727
#include <vector>
2828

29-
#include "absl/base/macros.h"
3029
#include "absl/container/flat_hash_map.h"
3130
#include "absl/container/node_hash_map.h"
3231
#include "absl/log/check.h"
@@ -1121,8 +1120,7 @@ void ComprehensionVisitor::PostVisit(const cel::ast::internal::Expr* expr) {
11211120

11221121
// TODO(uncreated-issue/31): move ast conversion to client responsibility and
11231122
// update pre-processing steps to work without mutating the input AST.
1124-
absl::StatusOr<std::unique_ptr<CelExpression>>
1125-
FlatExprBuilder::CreateExpressionImpl(
1123+
absl::StatusOr<FlatExpression> FlatExprBuilder::CreateExpressionImpl(
11261124
std::unique_ptr<Ast> ast, std::vector<absl::Status>* warnings) const {
11271125
ExecutionPath execution_path;
11281126

@@ -1179,14 +1177,12 @@ FlatExprBuilder::CreateExpressionImpl(
11791177
return visitor.progress_status();
11801178
}
11811179

1182-
std::unique_ptr<CelExpression> expression_impl =
1183-
std::make_unique<CelExpressionFlatImpl>(std::move(execution_path),
1184-
options_);
1185-
11861180
if (warnings != nullptr) {
11871181
*warnings = std::move(warnings_builder).warnings();
11881182
}
1189-
return expression_impl;
1183+
1184+
return FlatExpression(std::move(execution_path),
1185+
type_registry_.GetTypeProvider(), options_);
11901186
}
11911187

11921188
} // namespace google::api::expr::runtime

eval/compiler/flat_expr_builder.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
#include "absl/status/statusor.h"
2626
#include "base/ast.h"
2727
#include "eval/compiler/flat_expr_builder_extensions.h"
28-
#include "eval/public/cel_expression.h"
2928
#include "runtime/function_registry.h"
3029
#include "runtime/runtime_options.h"
3130
#include "google/protobuf/arena.h"
@@ -85,7 +84,7 @@ class FlatExprBuilder {
8584

8685
// TODO(uncreated-issue/45): Add overload for cref AST. At the moment, all the users
8786
// can pass ownership of a freshly converted AST.
88-
absl::StatusOr<std::unique_ptr<CelExpression>> CreateExpressionImpl(
87+
absl::StatusOr<FlatExpression> CreateExpressionImpl(
8988
std::unique_ptr<cel::ast::Ast> ast,
9089
std::vector<absl::Status>* warnings) const;
9190

eval/compiler/regex_precompilation_optimization_test.cc

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include "eval/compiler/cel_expression_builder_flat_impl.h"
2929
#include "eval/compiler/flat_expr_builder.h"
3030
#include "eval/compiler/flat_expr_builder_extensions.h"
31+
#include "eval/eval/cel_expression_flat_impl.h"
3132
#include "eval/eval/evaluator_core.h"
3233
#include "eval/public/builtin_func_registrar.h"
3334
#include "eval/public/cel_options.h"
@@ -99,8 +100,8 @@ MATCHER_P(ExpressionPlanSizeIs, size, "") {
99100
dynamic_cast<CelExpressionFlatImpl*>(plan.get());
100101

101102
if (impl == nullptr) return false;
102-
*result_listener << "got size " << impl->path().size();
103-
return impl->path().size() == size;
103+
*result_listener << "got size " << impl->flat_expression().path().size();
104+
return impl->flat_expression().path().size() == size;
104105
}
105106

106107
TEST_F(RegexPrecompilationExtensionTest, OptimizeableExpression) {

0 commit comments

Comments
 (0)