summaryrefslogtreecommitdiff
path: root/src/mongo/db/query/plan_cache.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/query/plan_cache.cpp')
-rw-r--r--src/mongo/db/query/plan_cache.cpp32
1 files changed, 23 insertions, 9 deletions
diff --git a/src/mongo/db/query/plan_cache.cpp b/src/mongo/db/query/plan_cache.cpp
index 23d939df000..77bc3fb0898 100644
--- a/src/mongo/db/query/plan_cache.cpp
+++ b/src/mongo/db/query/plan_cache.cpp
@@ -62,10 +62,6 @@ namespace {
ServerStatusMetricField<Counter64> totalPlanCacheSizeEstimateBytesMetric(
"query.planCacheTotalSizeEstimateBytes", &PlanCacheEntry::planCacheTotalSizeEstimateBytes);
-// Delimiters for cache key encoding.
-const char kEncodeDiscriminatorsBegin = '<';
-const char kEncodeDiscriminatorsEnd = '>';
-
void encodeIndexabilityForDiscriminators(const MatchExpression* tree,
const IndexToDiscriminatorMap& discriminators,
StringBuilder* keyBuilder) {
@@ -74,12 +70,12 @@ void encodeIndexabilityForDiscriminators(const MatchExpression* tree,
}
}
-void encodeIndexability(const MatchExpression* tree,
- const PlanCacheIndexabilityState& indexabilityState,
- StringBuilder* keyBuilder) {
+void encodeIndexabilityRecursive(const MatchExpression* tree,
+ const PlanCacheIndexabilityState& indexabilityState,
+ StringBuilder* keyBuilder) {
if (!tree->path().empty()) {
const IndexToDiscriminatorMap& discriminators =
- indexabilityState.getDiscriminators(tree->path());
+ indexabilityState.getPathDiscriminators(tree->path());
IndexToDiscriminatorMap wildcardDiscriminators =
indexabilityState.buildWildcardDiscriminators(tree->path());
if (!discriminators.empty() || !wildcardDiscriminators.empty()) {
@@ -99,8 +95,26 @@ void encodeIndexability(const MatchExpression* tree,
}
for (size_t i = 0; i < tree->numChildren(); ++i) {
- encodeIndexability(tree->getChild(i), indexabilityState, keyBuilder);
+ encodeIndexabilityRecursive(tree->getChild(i), indexabilityState, keyBuilder);
+ }
+}
+
+void encodeIndexability(const MatchExpression* tree,
+ const PlanCacheIndexabilityState& indexabilityState,
+ StringBuilder* keyBuilder) {
+ // Before encoding the indexability of the leaf MatchExpressions, apply the global
+ // discriminators to the expression as a whole. This is for cases such as partial indexes which
+ // must discriminate based on the entire query.
+ const auto& globalDiscriminators = indexabilityState.getGlobalDiscriminators();
+ if (!globalDiscriminators.empty()) {
+ *keyBuilder << kEncodeGlobalDiscriminatorsBegin;
+ for (auto&& indexAndDiscriminatorPair : globalDiscriminators) {
+ *keyBuilder << indexAndDiscriminatorPair.second.isMatchCompatibleWithIndex(tree);
+ }
+ *keyBuilder << kEncodeGlobalDiscriminatorsEnd;
}
+
+ encodeIndexabilityRecursive(tree, indexabilityState, keyBuilder);
}
} // namespace