diff options
author | Benety Goh <benety@mongodb.com> | 2019-01-12 08:34:20 -0500 |
---|---|---|
committer | Benety Goh <benety@mongodb.com> | 2019-01-12 08:34:20 -0500 |
commit | 190fef15ba515974c789b5a195a761b518fca46e (patch) | |
tree | c482931b8e605f0ca3d718378855c023db5a7843 /src/mongo/db/catalog/collection_impl.cpp | |
parent | 2892576d5db5e4692bda050152ca2bdd6f079b46 (diff) | |
download | mongo-190fef15ba515974c789b5a195a761b518fca46e.tar.gz |
SERVER-37643 add Collection::addCollationDefaultsToIndexSpecsForCreate()
Diffstat (limited to 'src/mongo/db/catalog/collection_impl.cpp')
-rw-r--r-- | src/mongo/db/catalog/collection_impl.cpp | 51 |
1 files changed, 50 insertions, 1 deletions
diff --git a/src/mongo/db/catalog/collection_impl.cpp b/src/mongo/db/catalog/collection_impl.cpp index 79503488959..a1e0153720e 100644 --- a/src/mongo/db/catalog/collection_impl.cpp +++ b/src/mongo/db/catalog/collection_impl.cpp @@ -1,4 +1,3 @@ - /** * Copyright (C) 2018-present MongoDB, Inc. * @@ -50,6 +49,7 @@ #include "mongo/db/catalog/document_validation.h" #include "mongo/db/catalog/index_catalog_impl.h" #include "mongo/db/catalog/index_consistency.h" +#include "mongo/db/catalog/index_key_validate.h" #include "mongo/db/catalog/namespace_uuid_cache.h" #include "mongo/db/catalog/uuid_catalog.h" #include "mongo/db/clientcursor.h" @@ -57,12 +57,14 @@ #include "mongo/db/concurrency/d_concurrency.h" #include "mongo/db/curop.h" #include "mongo/db/index/index_access_method.h" +#include "mongo/db/index/index_descriptor.h" #include "mongo/db/keypattern.h" #include "mongo/db/matcher/expression_parser.h" #include "mongo/db/op_observer.h" #include "mongo/db/operation_context.h" #include "mongo/db/ops/update_request.h" #include "mongo/db/query/collation/collator_factory_interface.h" +#include "mongo/db/query/collation/collator_interface.h" #include "mongo/db/query/internal_plans.h" #include "mongo/db/repl/oplog.h" #include "mongo/db/repl/replication_coordinator.h" @@ -959,6 +961,53 @@ const CollatorInterface* CollectionImpl::getDefaultCollator() const { return _collator.get(); } +StatusWith<std::vector<BSONObj>> CollectionImpl::addCollationDefaultsToIndexSpecsForCreate( + OperationContext* opCtx, const std::vector<BSONObj>& originalIndexSpecs) const { + std::vector<BSONObj> newIndexSpecs; + + auto collator = getDefaultCollator(); // could be null. + auto collatorFactory = CollatorFactoryInterface::get(opCtx->getServiceContext()); + + for (const auto& originalIndexSpec : originalIndexSpecs) { + auto validateResult = + index_key_validate::validateIndexSpecCollation(opCtx, originalIndexSpec, collator); + if (!validateResult.isOK()) { + return validateResult.getStatus().withContext( + str::stream() + << "failed to add collation information to index spec for index creation: " + << originalIndexSpec); + } + const auto& newIndexSpec = validateResult.getValue(); + + auto keyPattern = newIndexSpec[IndexDescriptor::kKeyPatternFieldName].Obj(); + if (IndexDescriptor::isIdIndexPattern(keyPattern)) { + std::unique_ptr<CollatorInterface> indexCollator; + if (auto collationElem = newIndexSpec[IndexDescriptor::kCollationFieldName]) { + auto indexCollatorResult = collatorFactory->makeFromBSON(collationElem.Obj()); + // validateIndexSpecCollation() should have checked that the index collation spec is + // valid. + invariant(indexCollatorResult.getStatus(), + str::stream() << "invalid collation in index spec: " << newIndexSpec); + indexCollator = std::move(indexCollatorResult.getValue()); + } + if (!CollatorInterface::collatorsMatch(collator, indexCollator.get())) { + return {ErrorCodes::BadValue, + str::stream() << "The _id index must have the same collation as the " + "collection. Index collation: " + << (indexCollator.get() ? indexCollator->getSpec().toBSON() + : CollationSpec::kSimpleSpec) + << ", collection collation: " + << (collator ? collator->getSpec().toBSON() + : CollationSpec::kSimpleSpec)}; + } + } + + newIndexSpecs.push_back(newIndexSpec); + } + + return newIndexSpecs; +} + namespace { using ValidateResultsMap = std::map<std::string, ValidateResults>; |