diff options
author | Ruoxin Xu <ruoxin.xu@mongodb.com> | 2020-02-17 22:04:01 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-02-19 12:20:25 +0000 |
commit | d37971a1a4d821306805fa9983a8510728a4f2f5 (patch) | |
tree | 57fb1c627666138987c10eb50e75850ff66eb7cb /src/mongo/db/pipeline/document_source_merge.cpp | |
parent | 2c7e2e270bf9f907cd5608a015394f193eb1bf62 (diff) | |
download | mongo-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.cpp | 22 |
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, |