summaryrefslogtreecommitdiff
path: root/src/mongo/db/catalog/collection_impl.cpp
diff options
context:
space:
mode:
authorBenety Goh <benety@mongodb.com>2019-01-12 08:34:20 -0500
committerBenety Goh <benety@mongodb.com>2019-01-12 08:34:20 -0500
commit190fef15ba515974c789b5a195a761b518fca46e (patch)
treec482931b8e605f0ca3d718378855c023db5a7843 /src/mongo/db/catalog/collection_impl.cpp
parent2892576d5db5e4692bda050152ca2bdd6f079b46 (diff)
downloadmongo-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.cpp51
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>;