Skip to content

Commit 92994de

Browse files
jckingcopybara-github
authored andcommitted
Switch to the new unknown and missing attribute implementation which makes cel::Value trivial
PiperOrigin-RevId: 983427647
1 parent ac08541 commit 92994de

54 files changed

Lines changed: 1575 additions & 2409 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎base/attribute.h‎

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,8 @@ class AttributeQualifier {
116116
AttributeQualifier& operator=(const AttributeQualifier&) = default;
117117
AttributeQualifier& operator=(AttributeQualifier&&) = default;
118118

119+
explicit AttributeQualifier(const AttributeQualifierView& other);
120+
119121
Kind kind() const;
120122

121123
ABSL_DEPRECATE_AND_INLINE()
@@ -324,6 +326,10 @@ class AttributeQualifierView {
324326

325327
AttributeQualifierView& operator=(AttributeQualifier&&) = delete;
326328

329+
explicit operator bool() const {
330+
return !std::holds_alternative<std::monostate>(value_);
331+
}
332+
327333
ABSL_DEPRECATE_AND_INLINE()
328334
std::optional<int64_t> GetInt64Key() const { return AsInt(); }
329335

@@ -450,6 +456,25 @@ class AttributeQualifierView {
450456
Variant value_;
451457
};
452458

459+
inline AttributeQualifier::AttributeQualifier(
460+
const AttributeQualifierView& other)
461+
: value_(std::visit(
462+
absl::Overload([](std::monostate) -> Variant { return Variant(); },
463+
[](int64_t value) -> Variant {
464+
return Variant(std::in_place_type<int64_t>, value);
465+
},
466+
[](uint64_t value) -> Variant {
467+
return Variant(std::in_place_type<uint64_t>, value);
468+
},
469+
[](absl::string_view value) -> Variant {
470+
return Variant(std::in_place_type<std::string>,
471+
value);
472+
},
473+
[](bool value) -> Variant {
474+
return Variant(std::in_place_type<bool>, value);
475+
}),
476+
common_internal::AsVariant(other))) {}
477+
453478
// AttributeQualifierPattern matches a segment in
454479
// attribute resolution path. AttributeQualifierPattern is capable of
455480
// matching path elements of types string/int64/uint64/bool.

‎base/attribute_matcher.h‎

Lines changed: 96 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include <vector>
2424

2525
#include "absl/base/attributes.h"
26+
#include "absl/base/optimization.h"
2627
#include "absl/functional/function_ref.h"
2728
#include "absl/log/absl_check.h"
2829
#include "absl/status/status.h"
@@ -78,6 +79,32 @@ class AttributeMatcherNode {
7879
const AttributeMatcherNode& rhs) const {
7980
return lhs < rhs.key();
8081
}
82+
83+
bool operator()(absl::string_view lhs,
84+
const AttributeQualifierPattern& rhs) const {
85+
// Fast path for top-level variable matching, should only be called in
86+
// that context.
87+
ABSL_DCHECK(rhs.IsString());
88+
return lhs < rhs.GetString();
89+
}
90+
91+
bool operator()(const AttributeQualifierPattern& lhs,
92+
absl::string_view rhs) const {
93+
// Fast path for top-level variable matching, should only be called in
94+
// that context.
95+
ABSL_DCHECK(lhs.IsString());
96+
return lhs.GetString() < rhs;
97+
}
98+
99+
bool operator()(absl::string_view lhs,
100+
const AttributeMatcherNode& rhs) const {
101+
return (*this)(lhs, rhs.key());
102+
}
103+
104+
bool operator()(const AttributeMatcherNode& lhs,
105+
absl::string_view rhs) const {
106+
return (*this)(lhs.key(), rhs);
107+
}
81108
};
82109

83110
AttributeMatcherNode(AttributeMatcherNode* parent,
@@ -113,7 +140,21 @@ class AttributeMatcherNode {
113140

114141
[[nodiscard]]
115142
const AttributeMatcherNode* MatchQualifier(
116-
const cel::AttributeQualifierView& qualifier) const {
143+
const AttributeQualifierView& qualifier) const {
144+
if (children_ != nullptr) {
145+
auto it = children_->find(qualifier);
146+
if (it != children_->end()) {
147+
return &*it;
148+
}
149+
} else if (wildcard_ != nullptr) {
150+
return wildcard_.get();
151+
}
152+
return nullptr;
153+
}
154+
155+
[[nodiscard]]
156+
const AttributeMatcherNode* MatchQualifier(
157+
const AttributeQualifier& qualifier) const {
117158
if (children_ != nullptr) {
118159
auto it = children_->find(qualifier);
119160
if (it != children_->end()) {
@@ -159,8 +200,7 @@ AttributeMatch MakeAttributeMatch(
159200
const common_internal::AttributeMatcherNode* node);
160201

161202
[[nodiscard]]
162-
const AttributeMatcherNode* GetAttributeMatcherNode(
163-
const AttributeMatch& match);
203+
const AttributeMatcherNode* GetAttributeMatcherNode(AttributeMatch match);
164204

165205
} // namespace common_internal
166206

@@ -199,17 +239,26 @@ class [[nodiscard]] AttributeMatch {
199239
// match should be handled.
200240
AttributeMatch MatchQualifier(const AttributeQualifierView& qualifier) const {
201241
ABSL_DCHECK(!IsFull());
242+
ABSL_DCHECK(qualifier);
202243
if (IsNone()) {
203244
return AttributeMatch();
204245
}
205246
return AttributeMatch(node_->MatchQualifier(qualifier));
206247
}
207248

208249
private:
250+
friend class AttributeMatcher;
209251
friend AttributeMatch common_internal::MakeAttributeMatch(
210252
const common_internal::AttributeMatcherNode* node);
211253
friend const common_internal::AttributeMatcherNode*
212-
common_internal::GetAttributeMatcherNode(const AttributeMatch& match);
254+
common_internal::GetAttributeMatcherNode(AttributeMatch match);
255+
256+
AttributeMatch NotNoneMatchQualifier(
257+
const AttributeQualifierView& qualifier) const {
258+
ABSL_DCHECK(!IsNone());
259+
ABSL_DCHECK(qualifier);
260+
return AttributeMatch(node_->MatchQualifier(qualifier));
261+
}
213262

214263
explicit AttributeMatch(const common_internal::AttributeMatcherNode* node)
215264
: node_(node) {}
@@ -226,7 +275,7 @@ inline AttributeMatch MakeAttributeMatch(
226275

227276
[[nodiscard]]
228277
inline const AttributeMatcherNode* GetAttributeMatcherNode(
229-
const AttributeMatch& match) {
278+
AttributeMatch match) {
230279
return match.node_;
231280
}
232281

@@ -273,13 +322,52 @@ class AttributeMatcher {
273322

274323
AttributeMatch MatchVariable(absl::string_view variable) const
275324
ABSL_ATTRIBUTE_LIFETIME_BOUND {
276-
auto it = children_.find(AttributeQualifierView::OfString(variable));
277-
if (it != children_.end()) {
278-
return common_internal::MakeAttributeMatch(&*it);
325+
if (!variable.empty()) {
326+
auto it = children_.find(variable);
327+
if (it != children_.end()) {
328+
return common_internal::MakeAttributeMatch(&*it);
329+
}
279330
}
280331
return AttributeMatch();
281332
}
282333

334+
AttributeMatch MatchAttribute(
335+
absl::string_view variable,
336+
absl::Span<const AttributeQualifierView> qualifiers) const {
337+
AttributeMatch match = MatchVariable(variable);
338+
for (const auto& qualifier : qualifiers) {
339+
if (ABSL_PREDICT_FALSE(!qualifier)) {
340+
return AttributeMatch();
341+
}
342+
if (match.IsNone()) {
343+
break;
344+
}
345+
match = match.NotNoneMatchQualifier(qualifier);
346+
}
347+
return match;
348+
}
349+
350+
AttributeMatch MatchAttribute(
351+
absl::string_view variable,
352+
absl::Span<const AttributeQualifier> qualifiers) const {
353+
AttributeMatch match = MatchVariable(variable);
354+
for (const auto& qualifier : qualifiers) {
355+
if (ABSL_PREDICT_FALSE(!qualifier)) {
356+
return AttributeMatch();
357+
}
358+
if (match.IsNone()) {
359+
break;
360+
}
361+
match = match.NotNoneMatchQualifier(qualifier);
362+
}
363+
return match;
364+
}
365+
366+
AttributeMatch MatchAttribute(const Attribute& attribute) const {
367+
return MatchAttribute(attribute.variable_name(),
368+
attribute.qualifier_path());
369+
}
370+
283371
// Returns an array of attribute patterns corresponding to the
284372
// previously added attribute patterns. The order of the attribute
285373
// patterns in the array is not guaranteed.

‎base/attribute_matcher_test.cc‎

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -423,5 +423,33 @@ TEST(AttributeMatcher, PastFullMatch) {
423423
_);
424424
}
425425

426+
TEST(AttributeMatcher, MatchAttribute) {
427+
AttributeMatcher matcher;
428+
EXPECT_THAT(matcher.InsertAttribute(
429+
Attribute("foo", {AttributeQualifier::OfString("bar"),
430+
AttributeQualifier::OfString("baz")})),
431+
IsOk());
432+
EXPECT_THAT(matcher.MatchAttribute(
433+
Attribute("foo", {AttributeQualifier::OfString("bar"),
434+
AttributeQualifier::OfString("baz")})),
435+
AttributeMatchIs(MatchType::FULL));
436+
EXPECT_THAT(
437+
matcher.MatchAttribute("foo", {AttributeQualifierView::OfString("bar"),
438+
AttributeQualifierView::OfString("baz")}),
439+
AttributeMatchIs(MatchType::FULL));
440+
EXPECT_THAT(matcher.MatchAttribute(
441+
Attribute("foo", {AttributeQualifier::OfString("bar")})),
442+
AttributeMatchIs(MatchType::PARTIAL));
443+
EXPECT_THAT(
444+
matcher.MatchAttribute("foo", {AttributeQualifierView::OfString("bar")}),
445+
AttributeMatchIs(MatchType::PARTIAL));
446+
EXPECT_THAT(matcher.MatchAttribute(
447+
Attribute("bar", {AttributeQualifier::OfString("baz")})),
448+
AttributeMatchIs(MatchType::NONE));
449+
EXPECT_THAT(
450+
matcher.MatchAttribute("bar", {AttributeQualifierView::OfString("baz")}),
451+
AttributeMatchIs(MatchType::NONE));
452+
}
453+
426454
} // namespace
427455
} // namespace cel

‎base/attribute_test.cc‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,5 +148,22 @@ TEST(AttributeQualifierView, TransparentOrder) {
148148
AttributeQualifierView::OfBool(true));
149149
}
150150

151+
template <typename From, typename To>
152+
void TestAttributeQualifierConversion() {
153+
EXPECT_EQ(To(From::OfInt(1)), To::OfInt(1));
154+
EXPECT_EQ(To(From::OfUint(1)), To::OfUint(1));
155+
EXPECT_EQ(To(From::OfString("foo")), To::OfString("foo"));
156+
EXPECT_EQ(To(From::OfBool(true)), To::OfBool(true));
157+
}
158+
159+
TEST(AttributeQualifier, Conversion) {
160+
TestAttributeQualifierConversion<AttributeQualifier,
161+
AttributeQualifierView>();
162+
TestAttributeQualifierConversion<AttributeQualifierView,
163+
AttributeQualifier>();
164+
TestAttributeQualifierConversion<AttributeQualifier,
165+
AttributeQualifierPattern>();
166+
}
167+
151168
} // namespace
152169
} // namespace cel

‎common/BUILD‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -756,7 +756,10 @@ cc_library(
756756
":unknown",
757757
":value_kind",
758758
"//base:attributes",
759+
"//base:function_result",
760+
"//base:function_result_set",
759761
"//common/internal:byte_string",
762+
"//common/internal:unknowns",
760763
"//eval/internal:cel_value_equal",
761764
"//eval/public:cel_value",
762765
"//eval/public:message_wrapper",

‎common/internal/BUILD‎

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,24 @@ load("@rules_cc//cc:cc_test.bzl", "cc_test")
1717

1818
package(default_visibility = ["//visibility:public"])
1919

20+
cc_library(
21+
name = "attribute_trail",
22+
srcs = ["attribute_trail.cc"],
23+
hdrs = ["attribute_trail.h"],
24+
deps = [
25+
":unknowns",
26+
"//base:attribute_matcher",
27+
"//base:attributes",
28+
"//common:value",
29+
"//runtime/internal:errors",
30+
"@com_google_absl//absl/base:core_headers",
31+
"@com_google_absl//absl/container:btree",
32+
"@com_google_absl//absl/log:absl_check",
33+
"@com_google_absl//absl/strings:string_view",
34+
"@com_google_absl//absl/types:span",
35+
],
36+
)
37+
2038
cc_library(
2139
name = "unknowns",
2240
srcs = ["unknowns.cc"],

0 commit comments

Comments
 (0)