@@ -913,6 +913,123 @@ void BM_HasProto(benchmark::State& state) {
913913
914914BENCHMARK (BM_HasProto);
915915
916+ // has(request.headers.create_time) && !has(request.headers.update_time)
917+ constexpr char kHasProtoMap [] = R"(
918+ call_expr: <
919+ function: "_&&_"
920+ args: <
921+ select_expr: <
922+ operand: <
923+ select_expr: <
924+ operand: <
925+ ident_expr: <
926+ name: "request"
927+ >
928+ >
929+ field: "headers"
930+ >
931+ >
932+ field: "create_time"
933+ test_only: true
934+ >
935+ >
936+ args: <
937+ call_expr: <
938+ function: "!_"
939+ args: <
940+ select_expr: <
941+ operand: <
942+ select_expr: <
943+ operand: <
944+ ident_expr: <
945+ name: "request"
946+ >
947+ >
948+ field: "headers"
949+ >
950+ >
951+ field: "update_time"
952+ test_only: true
953+ >
954+ >
955+ >
956+ >
957+ >)" ;
958+
959+ void BM_HasProtoMap (benchmark::State& state) {
960+ google::protobuf::Arena arena;
961+ Expr expr;
962+ Activation activation;
963+ ASSERT_TRUE (google::protobuf::TextFormat::ParseFromString (kHasProtoMap , &expr));
964+ auto builder = CreateCelExpressionBuilder ();
965+ ASSERT_OK (RegisterBuiltinFunctions (builder->GetRegistry ()));
966+ auto expr_plan = builder->CreateExpression (&expr, nullptr );
967+
968+ RequestContext request;
969+ request.mutable_headers ()->insert ({" create_time" , " 2021-01-01" });
970+ activation.InsertValue (" request" ,
971+ CelProtoWrapper::CreateMessage (&request, &arena));
972+ ASSERT_OK (expr_plan.status ());
973+ for (auto _ : state) {
974+ auto result = expr_plan.value ()->Evaluate (activation, &arena);
975+ ASSERT_OK (result.status ());
976+ ASSERT_TRUE (result->IsBool ());
977+ ASSERT_TRUE (result->BoolOrDie ());
978+ }
979+ }
980+
981+ BENCHMARK (BM_HasProtoMap);
982+
983+ // has(request.headers.create_time) && !has(request.headers.update_time)
984+ constexpr char kReadProtoMap [] = R"(
985+ call_expr: <
986+ function: "_==_"
987+ args: <
988+ select_expr: <
989+ operand: <
990+ select_expr: <
991+ operand: <
992+ ident_expr: <
993+ name: "request"
994+ >
995+ >
996+ field: "headers"
997+ >
998+ >
999+ field: "create_time"
1000+ >
1001+ >
1002+ args: <
1003+ const_expr: <
1004+ string_value: "2021-01-01"
1005+ >
1006+ >
1007+ >)" ;
1008+
1009+ void BM_ReadProtoMap (benchmark::State& state) {
1010+ google::protobuf::Arena arena;
1011+ Expr expr;
1012+ Activation activation;
1013+ ASSERT_TRUE (google::protobuf::TextFormat::ParseFromString (kReadProtoMap , &expr));
1014+ auto builder = CreateCelExpressionBuilder ();
1015+ ASSERT_OK (RegisterBuiltinFunctions (builder->GetRegistry ()));
1016+ auto expr_plan = builder->CreateExpression (&expr, nullptr );
1017+
1018+ RequestContext request;
1019+ request.mutable_headers ()->insert ({" create_time" , " 2021-01-01" });
1020+ activation.InsertValue (" request" ,
1021+ CelProtoWrapper::CreateMessage (&request, &arena));
1022+ ASSERT_OK (expr_plan.status ());
1023+ for (auto _ : state) {
1024+ auto result = expr_plan.value ()->Evaluate (activation, &arena);
1025+ ASSERT_OK (result.status ());
1026+ ASSERT_TRUE (result->IsBool ());
1027+ ASSERT_TRUE (result->BoolOrDie ());
1028+ }
1029+ }
1030+
1031+ BENCHMARK (BM_ReadProtoMap);
1032+
9161033// Sum a square with a nested comprehension
9171034constexpr char kNestedListSum [] = R"(
9181035id: 1
0 commit comments