Coverage Report

Created: 2024-09-19 09:45

/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