@@ -246,7 +246,13 @@ class ProtoToPredicateBuilder final : private ExprFactory {
246246 const FieldDescriptor* const value_field =
247247 field->message_type ()->FindFieldByName (" value" );
248248
249- Expr map_path = NewSelect (NextId (), base_expr, field->name ());
249+ std::string match_path_val = GetMatchPath (field);
250+ Expr map_path;
251+ if (!match_path_val.empty ()) {
252+ map_path = ParseAndBuildPath (match_path_val);
253+ } else {
254+ map_path = NewSelect (NextId (), base_expr, field->name ());
255+ }
250256
251257 struct MapEntry {
252258 const Message* message;
@@ -355,7 +361,13 @@ class ProtoToPredicateBuilder final : private ExprFactory {
355361 const Message& sub_message =
356362 reflection->GetRepeatedMessage (message, field, i);
357363 std::vector<Expr> sub_predicates;
358- Expr sub_base = NewSelect (NextId (), base_expr, field->name ());
364+ std::string match_path_val = GetMatchPath (field);
365+ Expr sub_base;
366+ if (!match_path_val.empty ()) {
367+ sub_base = ParseAndBuildPath (match_path_val);
368+ } else {
369+ sub_base = NewSelect (NextId (), base_expr, field->name ());
370+ }
359371 CEL_RETURN_IF_ERROR (Walk (sub_message, sub_base, sub_predicates));
360372 message_asts.push_back (LogicalAnd (sub_predicates));
361373 }
@@ -426,11 +438,23 @@ class ProtoToPredicateBuilder final : private ExprFactory {
426438 }
427439 } else if (field->cpp_type () == FieldDescriptor::CPPTYPE_MESSAGE ) {
428440 const Message& sub_message = reflection->GetMessage (message, field);
429- Expr field_path = NewSelect (NextId (), base_expr, field->name ());
441+ std::string match_path_val = GetMatchPath (field);
442+ Expr field_path;
443+ if (!match_path_val.empty ()) {
444+ field_path = ParseAndBuildPath (match_path_val);
445+ } else {
446+ field_path = NewSelect (NextId (), base_expr, field->name ());
447+ }
430448 CEL_RETURN_IF_ERROR (Walk (sub_message, field_path, predicates));
431449 } else {
432450 // Primitive field: base_expr.field == <value>
433- Expr field_path = NewSelect (NextId (), base_expr, field->name ());
451+ std::string match_path_val = GetMatchPath (field);
452+ Expr field_path;
453+ if (!match_path_val.empty ()) {
454+ field_path = ParseAndBuildPath (match_path_val);
455+ } else {
456+ field_path = NewSelect (NextId (), base_expr, field->name ());
457+ }
434458 predicates.push_back (
435459 ConstructEquality (std::move (field_path),
436460 PrimitiveToExpr (message, reflection, field)));
0 commit comments