Coverage Report

Created: 2023-11-12 09:30

/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
27.3k
                                                        const ProtobufWkt::Struct& matches) {
8
27.3k
  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
27.3k
  absl::node_hash_map<std::string, std::size_t> existing;
13
14
27.3k
  if (parent) {
15
423k
    for (const auto& it : parent->metadata_match_criteria_) {
16
      // v.size() is the index of the emplaced name.
17
423k
      existing.emplace(it->name(), v.size());
18
423k
      v.emplace_back(it);
19
423k
    }
20
20.1k
  }
21
22
  // Add values from matches, replacing name/values copied from parent.
23
105k
  for (const auto& it : matches.fields()) {
24
105k
    const auto index_it = existing.find(it.first);
25
105k
    if (index_it != existing.end()) {
26
7.95k
      v[index_it->second] = std::make_shared<MetadataMatchCriterionImpl>(it.first, it.second);
27
97.5k
    } else {
28
97.5k
      v.emplace_back(std::make_shared<MetadataMatchCriterionImpl>(it.first, it.second));
29
97.5k
    }
30
105k
  }
31
32
  // Sort criteria by name to speed matching in the subset load balancer.
33
  // See source/docs/subset_load_balancer.md.
34
27.3k
  std::sort(
35
27.3k
      v.begin(), v.end(),
36
27.3k
      [](const MetadataMatchCriterionConstSharedPtr& a,
37
2.30M
         const MetadataMatchCriterionConstSharedPtr& b) -> bool { return a->name() < b->name(); });
38
39
27.3k
  return v;
40
27.3k
}
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