summaryrefslogtreecommitdiff
path: root/src/mongo/db/pipeline/document_source_merge.cpp
diff options
context:
space:
mode:
authorRuoxin Xu <ruoxin.xu@mongodb.com>2020-02-17 22:04:01 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-02-19 12:20:25 +0000
commitd37971a1a4d821306805fa9983a8510728a4f2f5 (patch)
tree57fb1c627666138987c10eb50e75850ff66eb7cb /src/mongo/db/pipeline/document_source_merge.cpp
parent2c7e2e270bf9f907cd5608a015394f193eb1bf62 (diff)
downloadmongo-d37971a1a4d821306805fa9983a8510728a4f2f5.tar.gz
SERVER-41416 Remove _convertToFieldPaths from MongoProcessCommon
Diffstat (limited to 'src/mongo/db/pipeline/document_source_merge.cpp')
-rw-r--r--src/mongo/db/pipeline/document_source_merge.cpp22
1 files changed, 21 insertions, 1 deletions
diff --git a/src/mongo/db/pipeline/document_source_merge.cpp b/src/mongo/db/pipeline/document_source_merge.cpp
index ad68c53598c..e953e813bc0 100644
--- a/src/mongo/db/pipeline/document_source_merge.cpp
+++ b/src/mongo/db/pipeline/document_source_merge.cpp
@@ -284,6 +284,25 @@ DocumentSourceMergeSpec parseMergeSpecAndResolveTargetNamespace(const BSONElemen
return mergeSpec;
}
+
+/**
+ * Converts an array of field names into a set of FieldPath. Throws if 'fields' contains
+ * duplicate elements.
+ */
+boost::optional<std::set<FieldPath>> convertToFieldPaths(
+ const boost::optional<std::vector<std::string>>& fields) {
+
+ if (!fields)
+ return boost::none;
+
+ std::set<FieldPath> fieldPaths;
+
+ for (const auto& field : *fields) {
+ const auto res = fieldPaths.insert(FieldPath(field));
+ uassert(31465, str::stream() << "Found a duplicate field '" << field << "'", res.second);
+ }
+ return fieldPaths;
+}
} // namespace
std::unique_ptr<DocumentSourceMerge::LiteParsed> DocumentSourceMerge::LiteParsed::parse(
@@ -425,9 +444,10 @@ boost::intrusive_ptr<DocumentSource> DocumentSourceMerge::createFromBson(
mergeSpec.getWhenMatched() ? mergeSpec.getWhenMatched()->mode : kDefaultWhenMatched;
auto whenNotMatched = mergeSpec.getWhenNotMatched().value_or(kDefaultWhenNotMatched);
auto pipeline = mergeSpec.getWhenMatched() ? mergeSpec.getWhenMatched()->pipeline : boost::none;
+ auto fieldPaths = convertToFieldPaths(mergeSpec.getOn());
auto [mergeOnFields, targetCollectionVersion] =
expCtx->mongoProcessInterface->ensureFieldsUniqueOrResolveDocumentKey(
- expCtx, mergeSpec.getOn(), mergeSpec.getTargetCollectionVersion(), targetNss);
+ expCtx, std::move(fieldPaths), mergeSpec.getTargetCollectionVersion(), targetNss);
return DocumentSourceMerge::create(std::move(targetNss),
expCtx,