/proc/self/cwd/source/common/router/metadatamatchcriteria_impl.cc
Line | Count | Source (jump to first uncovered line) |
1 | | #include "source/common/router/metadatamatchcriteria_impl.h" |
2 | | |
3 | | namespace Envoy { |
4 | | namespace Router { |
5 | | std::vector<MetadataMatchCriterionConstSharedPtr> |
6 | | MetadataMatchCriteriaImpl::extractMetadataMatchCriteria(const MetadataMatchCriteriaImpl* parent, |
7 | 29.0k | const ProtobufWkt::Struct& matches) { |
8 | 29.0k | std::vector<MetadataMatchCriterionConstSharedPtr> v; |
9 | | |
10 | | // Track locations of each name (from the parent) in v to make it |
11 | | // easier to replace them when the same name exists in matches. |
12 | 29.0k | absl::node_hash_map<std::string, std::size_t> existing; |
13 | | |
14 | 29.0k | if (parent) { |
15 | 362k | for (const auto& it : parent->metadata_match_criteria_) { |
16 | | // v.size() is the index of the emplaced name. |
17 | 362k | existing.emplace(it->name(), v.size()); |
18 | 362k | v.emplace_back(it); |
19 | 362k | } |
20 | 19.0k | } |
21 | | |
22 | | // Add values from matches, replacing name/values copied from parent. |
23 | 80.2k | for (const auto& it : matches.fields()) { |
24 | 80.2k | const auto index_it = existing.find(it.first); |
25 | 80.2k | if (index_it != existing.end()) { |
26 | 5.51k | v[index_it->second] = std::make_shared<MetadataMatchCriterionImpl>(it.first, it.second); |
27 | 74.7k | } else { |
28 | 74.7k | v.emplace_back(std::make_shared<MetadataMatchCriterionImpl>(it.first, it.second)); |
29 | 74.7k | } |
30 | 80.2k | } |
31 | | |
32 | | // Sort criteria by name to speed matching in the subset load balancer. |
33 | | // See source/docs/subset_load_balancer.md. |
34 | 29.0k | std::sort( |
35 | 29.0k | v.begin(), v.end(), |
36 | 29.0k | [](const MetadataMatchCriterionConstSharedPtr& a, |
37 | 1.39M | const MetadataMatchCriterionConstSharedPtr& b) -> bool { return a->name() < b->name(); }); |
38 | | |
39 | 29.0k | return v; |
40 | 29.0k | } |
41 | | |
42 | | MetadataMatchCriteriaConstPtr |
43 | 0 | MetadataMatchCriteriaImpl::filterMatchCriteria(const std::set<std::string>& names) const { |
44 | |
|
45 | 0 | std::vector<MetadataMatchCriterionConstSharedPtr> v; |
46 | | |
47 | | // iterating over metadata_match_criteria_ ensures correct order without sorting |
48 | 0 | for (const auto& it : metadata_match_criteria_) { |
49 | 0 | if (names.count(it->name()) == 1) { |
50 | 0 | v.emplace_back(it); |
51 | 0 | } |
52 | 0 | } |
53 | 0 | return MetadataMatchCriteriaImplConstPtr(new MetadataMatchCriteriaImpl(v)); |
54 | 0 | }; |
55 | | |
56 | | } // namespace Router |
57 | | } // namespace Envoy |