Skip to content

Commit fe0454f

Browse files
jnthntatumcopybara-github
authored andcommitted
Update LegacyRuntimeTypeProvider to use modern ValueBuilder.
PiperOrigin-RevId: 962225090
1 parent a2265a8 commit fe0454f

4 files changed

Lines changed: 56 additions & 78 deletions

File tree

runtime/internal/BUILD

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -185,20 +185,14 @@ cc_library(
185185
hdrs = ["legacy_runtime_type_provider.h"],
186186
deps = [
187187
"//common:legacy_value",
188-
"//common:memory",
189188
"//common:type",
190189
"//common:value",
191190
"//eval/public:message_wrapper",
192-
"//eval/public/structs:legacy_type_adapter",
193191
"//eval/public/structs:legacy_type_info_apis",
194-
"//eval/public/structs:proto_message_type_adapter",
195192
"//eval/public/structs:protobuf_descriptor_type_provider",
196-
"//extensions/protobuf:memory_manager",
197193
"//internal:status_macros",
198194
"@com_google_absl//absl/base:nullability",
199-
"@com_google_absl//absl/status",
200195
"@com_google_absl//absl/status:statusor",
201-
"@com_google_absl//absl/strings",
202196
"@com_google_absl//absl/strings:string_view",
203197
"@com_google_absl//absl/types:optional",
204198
"@com_google_protobuf//:protobuf",

runtime/internal/legacy_runtime_type_provider.cc

Lines changed: 26 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,15 @@
2020
#include <utility>
2121

2222
#include "absl/base/nullability.h"
23-
#include "absl/status/status.h"
2423
#include "absl/status/statusor.h"
25-
#include "absl/strings/str_cat.h"
2624
#include "absl/strings/string_view.h"
27-
#include "absl/types/optional.h"
2825
#include "common/legacy_value.h"
29-
#include "common/memory.h"
3026
#include "common/type.h"
3127
#include "common/type_introspector.h"
3228
#include "common/value.h"
29+
#include "common/values/value_builder.h"
3330
#include "eval/public/message_wrapper.h"
34-
#include "eval/public/structs/legacy_type_adapter.h"
3531
#include "eval/public/structs/legacy_type_info_apis.h"
36-
#include "eval/public/structs/proto_message_type_adapter.h"
37-
#include "extensions/protobuf/memory_manager.h"
3832
#include "internal/status_macros.h"
3933
#include "google/protobuf/arena.h"
4034
#include "google/protobuf/descriptor.h"
@@ -44,61 +38,43 @@ namespace cel::runtime_internal {
4438

4539
namespace {
4640

47-
using google::api::expr::runtime::LegacyTypeAdapter;
4841
using google::api::expr::runtime::LegacyTypeInfoApis;
4942
using google::api::expr::runtime::MessageWrapper;
5043

5144
class LegacyValueBuilder final : public cel::ValueBuilder {
5245
public:
53-
LegacyValueBuilder(cel::MemoryManagerRef memory_manager,
54-
LegacyTypeAdapter adapter, MessageWrapper::Builder builder)
55-
: memory_manager_(memory_manager),
56-
adapter_(adapter),
57-
builder_(std::move(builder)) {}
46+
LegacyValueBuilder(google::protobuf::Arena* absl_nonnull arena,
47+
cel::ValueBuilderPtr builder)
48+
: arena_(arena), builder_(std::move(builder)) {}
5849

59-
absl::StatusOr<absl::optional<cel::ErrorValue>> SetFieldByName(
50+
absl::StatusOr<std::optional<cel::ErrorValue>> SetFieldByName(
6051
absl::string_view name, cel::Value value) override {
61-
CEL_ASSIGN_OR_RETURN(
62-
auto legacy_value,
63-
LegacyValue(cel::extensions::ProtoMemoryManagerArena(memory_manager_),
64-
value),
65-
_.With(cel::ErrorValueReturn()));
66-
CEL_RETURN_IF_ERROR(adapter_.mutation_apis()->SetField(
67-
name, legacy_value, memory_manager_, builder_))
68-
.With(cel::ErrorValueReturn());
69-
return std::nullopt;
52+
return builder_->SetFieldByName(name, std::move(value));
7053
}
7154

72-
absl::StatusOr<absl::optional<cel::ErrorValue>> SetFieldByNumber(
55+
absl::StatusOr<std::optional<cel::ErrorValue>> SetFieldByNumber(
7356
int64_t number, cel::Value value) override {
74-
CEL_ASSIGN_OR_RETURN(
75-
auto legacy_value,
76-
LegacyValue(cel::extensions::ProtoMemoryManagerArena(memory_manager_),
77-
value),
78-
_.With(cel::ErrorValueReturn()));
79-
CEL_RETURN_IF_ERROR(adapter_.mutation_apis()->SetFieldByNumber(
80-
number, legacy_value, memory_manager_, builder_))
81-
.With(cel::ErrorValueReturn());
82-
return std::nullopt;
57+
return builder_->SetFieldByNumber(number, std::move(value));
8358
}
8459

8560
absl::StatusOr<cel::Value> Build() && override {
86-
CEL_ASSIGN_OR_RETURN(auto value,
87-
adapter_.mutation_apis()->AdaptFromWellKnownType(
88-
memory_manager_, std::move(builder_)),
61+
CEL_ASSIGN_OR_RETURN(auto value, std::move(*builder_).Build(),
8962
_.With(cel::ErrorValueReturn()));
90-
CEL_ASSIGN_OR_RETURN(
91-
auto result,
92-
cel::ModernValue(
93-
cel::extensions::ProtoMemoryManagerArena(memory_manager_), value),
94-
_.With(cel::ErrorValueReturn()));
95-
return result;
63+
if (value.Is<MessageValue>()) {
64+
// Make the value behave like a legacy message. Minimizes further
65+
// legacy/modern conversions (e.g. on return and when accessing fields).
66+
CEL_ASSIGN_OR_RETURN(auto legacy_value, LegacyValue(arena_, value),
67+
_.With(cel::ErrorValueReturn()));
68+
CEL_ASSIGN_OR_RETURN(auto result, ModernValue(arena_, legacy_value),
69+
_.With(cel::ErrorValueReturn()));
70+
return result;
71+
}
72+
return value;
9673
}
9774

9875
private:
99-
cel::MemoryManagerRef memory_manager_;
100-
LegacyTypeAdapter adapter_;
101-
MessageWrapper::Builder builder_;
76+
google::protobuf::Arena* const arena_;
77+
cel::ValueBuilderPtr builder_;
10278
};
10379

10480
} // namespace
@@ -108,26 +84,12 @@ LegacyRuntimeTypeProvider::NewValueBuilder(
10884
absl::string_view name,
10985
google::protobuf::MessageFactory* absl_nonnull message_factory,
11086
google::protobuf::Arena* absl_nonnull arena) const {
111-
auto type_adapter = ProvideLegacyType(name);
112-
113-
if (!type_adapter.has_value()) {
87+
auto builder = common_internal::NewValueBuilder(arena, descriptor_pool_,
88+
message_factory, name);
89+
if (builder == nullptr) {
11490
return nullptr;
11591
}
116-
117-
// We know the implementation should not do this, but can't prove it to type
118-
// system.
119-
// Defensive checks but impractical to exercise.
120-
const auto* mutation_apis = type_adapter->mutation_apis();
121-
if (mutation_apis == nullptr) {
122-
return absl::FailedPreconditionError(
123-
absl::StrCat("LegacyTypeMutationApis missing for type: ", name));
124-
}
125-
126-
CEL_ASSIGN_OR_RETURN(
127-
auto builder,
128-
mutation_apis->NewInstance(cel::MemoryManagerRef::Pooling(arena)));
129-
return std::make_unique<LegacyValueBuilder>(
130-
cel::MemoryManagerRef::Pooling(arena), *type_adapter, std::move(builder));
92+
return std::make_unique<LegacyValueBuilder>(arena, std::move(builder));
13193
}
13294

13395
absl::StatusOr<std::optional<Type>> LegacyRuntimeTypeProvider::FindTypeImpl(
@@ -175,12 +137,7 @@ LegacyRuntimeTypeProvider::FindStructTypeFieldByNameImpl(
175137
field_desc->name, field_desc->number, cel::DynType{});
176138
}
177139

178-
const auto* mutation_apis = (*type_info)->GetMutationApis(MessageWrapper());
179-
if (mutation_apis == nullptr || !mutation_apis->DefinesField(name)) {
180-
return std::nullopt;
181-
}
182-
183-
return cel::common_internal::BasicStructTypeField(name, 0, cel::DynType{});
140+
return std::nullopt;
184141
}
185142

186143
} // namespace cel::runtime_internal

runtime/internal/legacy_runtime_type_provider.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,9 @@ class LegacyRuntimeTypeProvider final
3737
LegacyRuntimeTypeProvider(
3838
const google::protobuf::DescriptorPool* absl_nonnull descriptor_pool,
3939
google::protobuf::MessageFactory* absl_nullable message_factory)
40-
: google::api::expr::runtime::ProtobufDescriptorProvider(
41-
descriptor_pool, message_factory) {}
40+
: google::api::expr::runtime::ProtobufDescriptorProvider(descriptor_pool,
41+
message_factory),
42+
descriptor_pool_(descriptor_pool) {}
4243

4344
absl::StatusOr<absl_nullable ValueBuilderPtr> NewValueBuilder(
4445
absl::string_view name,
@@ -51,6 +52,9 @@ class LegacyRuntimeTypeProvider final
5152

5253
absl::StatusOr<std::optional<StructTypeField>> FindStructTypeFieldByNameImpl(
5354
absl::string_view type, absl::string_view name) const override;
55+
56+
private:
57+
const google::protobuf::DescriptorPool* absl_nonnull descriptor_pool_;
5458
};
5559

5660
} // namespace cel::runtime_internal

runtime/internal/legacy_runtime_type_provider_test.cc

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ TEST(LegacyRuntimeTypeProviderTest, FindStructTypeFieldByNameNotFound) {
8686
EXPECT_FALSE(field2.has_value());
8787
}
8888

89-
TEST(LegacyRuntimeTypeProviderTest, NewValueBuilder) {
89+
TEST(LegacyRuntimeTypeProviderTest, NewValueBuilderMessage) {
9090
LegacyRuntimeTypeProvider provider(cel::internal::GetTestingDescriptorPool(),
9191
cel::internal::GetTestingMessageFactory());
9292
google::protobuf::Arena arena;
@@ -100,10 +100,33 @@ TEST(LegacyRuntimeTypeProviderTest, NewValueBuilder) {
100100
builder->SetFieldByName("single_int64", IntValue(42)));
101101
EXPECT_FALSE(field_result.has_value());
102102

103+
ASSERT_OK_AND_ASSIGN(auto field_result2,
104+
builder->SetFieldByNumber(1, IntValue(100)));
105+
EXPECT_FALSE(field_result2.has_value());
106+
103107
ASSERT_OK_AND_ASSIGN(auto value, std::move(*builder).Build());
104108
EXPECT_TRUE(value.Is<StructValue>());
105109
}
106110

111+
TEST(LegacyRuntimeTypeProviderTest, NewValueBuilderWellKnownType) {
112+
LegacyRuntimeTypeProvider provider(cel::internal::GetTestingDescriptorPool(),
113+
cel::internal::GetTestingMessageFactory());
114+
google::protobuf::Arena arena;
115+
ASSERT_OK_AND_ASSIGN(auto builder,
116+
provider.NewValueBuilder(
117+
"google.protobuf.Int64Value",
118+
cel::internal::GetTestingMessageFactory(), &arena));
119+
ASSERT_NE(builder, nullptr);
120+
121+
ASSERT_OK_AND_ASSIGN(auto field_result,
122+
builder->SetFieldByName("value", IntValue(42)));
123+
EXPECT_FALSE(field_result.has_value());
124+
125+
ASSERT_OK_AND_ASSIGN(auto value, std::move(*builder).Build());
126+
ASSERT_TRUE(value.Is<IntValue>());
127+
EXPECT_EQ(value.As<IntValue>()->NativeValue(), 42);
128+
}
129+
107130
TEST(LegacyRuntimeTypeProviderTest, NewValueBuilderNotFound) {
108131
LegacyRuntimeTypeProvider provider(
109132
google::protobuf::DescriptorPool::generated_pool(),

0 commit comments

Comments
 (0)