diff options
author | Scott Hernandez <scotthernandez@gmail.com> | 2016-07-07 12:13:07 -0400 |
---|---|---|
committer | Scott Hernandez <scotthernandez@gmail.com> | 2016-07-07 12:13:13 -0400 |
commit | 0b797de3ce2eb461e82cac647067dfaaa4d36988 (patch) | |
tree | 27f4e2126c4771fefb5f64f0ca5c2468a4158f02 /src/mongo/db/query/plan_cache_indexability.cpp | |
parent | e7cc7ebf50c2883776cb4cc2423d687bcafa35b6 (diff) | |
download | mongo-0b797de3ce2eb461e82cac647067dfaaa4d36988.tar.gz |
Revert "SERVER-23882 Collation should be considered part of a query's shape"
This reverts commit 582818dac41ac01975820c09f79d3b86dc3782cc.
Diffstat (limited to 'src/mongo/db/query/plan_cache_indexability.cpp')
-rw-r--r-- | src/mongo/db/query/plan_cache_indexability.cpp | 58 |
1 files changed, 9 insertions, 49 deletions
diff --git a/src/mongo/db/query/plan_cache_indexability.cpp b/src/mongo/db/query/plan_cache_indexability.cpp index 442cb222001..066d7a2782b 100644 --- a/src/mongo/db/query/plan_cache_indexability.cpp +++ b/src/mongo/db/query/plan_cache_indexability.cpp @@ -35,18 +35,15 @@ #include "mongo/db/matcher/expression.h" #include "mongo/db/matcher/expression_algo.h" #include "mongo/db/matcher/expression_leaf.h" -#include "mongo/db/query/collation/collation_index_key.h" -#include "mongo/db/query/collation/collator_interface.h" #include "mongo/db/query/index_entry.h" #include "mongo/stdx/memory.h" #include <memory> namespace mongo { -void PlanCacheIndexabilityState::processSparseIndex(const std::string& indexName, - const BSONObj& keyPattern) { +void PlanCacheIndexabilityState::processSparseIndex(const BSONObj& keyPattern) { for (BSONElement elem : keyPattern) { - _pathDiscriminatorsMap[elem.fieldNameStringData()][indexName].addDiscriminator( + _pathDiscriminatorsMap[elem.fieldNameStringData()].push_back( [](const MatchExpression* queryExpr) { if (queryExpr->matchType() == MatchExpression::EQ) { const auto* queryExprEquality = @@ -62,60 +59,24 @@ void PlanCacheIndexabilityState::processSparseIndex(const std::string& indexName } } -void PlanCacheIndexabilityState::processPartialIndex(const std::string& indexName, - const MatchExpression* filterExpr) { +void PlanCacheIndexabilityState::processPartialIndex(const MatchExpression* filterExpr) { invariant(filterExpr); for (size_t i = 0; i < filterExpr->numChildren(); ++i) { - processPartialIndex(indexName, filterExpr->getChild(i)); + processPartialIndex(filterExpr->getChild(i)); } if (!filterExpr->isLogical()) { - _pathDiscriminatorsMap[filterExpr->path()][indexName].addDiscriminator( + _pathDiscriminatorsMap[filterExpr->path()].push_back( [filterExpr](const MatchExpression* queryExpr) { return expression::isSubsetOf(queryExpr, filterExpr); }); } } -void PlanCacheIndexabilityState::processIndexCollation(const std::string& indexName, - const BSONObj& keyPattern, - const CollatorInterface* collator) { - for (BSONElement elem : keyPattern) { - _pathDiscriminatorsMap[elem.fieldNameStringData()][indexName].addDiscriminator([collator]( - const MatchExpression* queryExpr) { - if (ComparisonMatchExpression::isComparisonMatchExpression(queryExpr)) { - const auto* queryExprComparison = - static_cast<const ComparisonMatchExpression*>(queryExpr); - const bool collatorsMatch = - CollatorInterface::collatorsMatch(queryExprComparison->getCollator(), collator); - const bool isCollatableType = - CollationIndexKey::isCollatableType(queryExprComparison->getData().type()); - return collatorsMatch || !isCollatableType; - } - - if (queryExpr->matchType() == MatchExpression::MATCH_IN) { - const auto* queryExprIn = static_cast<const InMatchExpression*>(queryExpr); - if (CollatorInterface::collatorsMatch(queryExprIn->getCollator(), collator)) { - return true; - } - for (const auto& equality : queryExprIn->getEqualities()) { - if (CollationIndexKey::isCollatableType(equality.type())) { - return false; - } - } - return true; - } - - // The predicate never compares strings so it is not affected by collation. - return true; - }); - } -} - namespace { -const IndexToDiscriminatorMap emptyDiscriminators; +const IndexabilityDiscriminators emptyDiscriminators; } // namespace -const IndexToDiscriminatorMap& PlanCacheIndexabilityState::getDiscriminators( +const IndexabilityDiscriminators& PlanCacheIndexabilityState::getDiscriminators( StringData path) const { PathDiscriminatorsMap::const_iterator it = _pathDiscriminatorsMap.find(path); if (it == _pathDiscriminatorsMap.end()) { @@ -129,12 +90,11 @@ void PlanCacheIndexabilityState::updateDiscriminators(const std::vector<IndexEnt for (const IndexEntry& idx : indexEntries) { if (idx.sparse) { - processSparseIndex(idx.name, idx.keyPattern); + processSparseIndex(idx.keyPattern); } if (idx.filterExpr) { - processPartialIndex(idx.name, idx.filterExpr); + processPartialIndex(idx.filterExpr); } - processIndexCollation(idx.name, idx.keyPattern, idx.collator); } } |