diff options
author | Ian Boros <puppyofkosh@gmail.com> | 2019-05-13 18:19:38 -0400 |
---|---|---|
committer | Ian Boros <puppyofkosh@gmail.com> | 2019-05-20 15:50:22 -0400 |
commit | 31967340abb31476910730163c04782f2e915d01 (patch) | |
tree | e21db441abdfbdf707f66f640796e3d8ee6ab6a8 /src/mongo/db/pipeline/document_source_facet_test.cpp | |
parent | 24760ca934a3c7843731de117839070ddf7fd3cc (diff) | |
download | mongo-31967340abb31476910730163c04782f2e915d01.tar.gz |
SERVER-40949 add LookupAllowed stage constraint
This bans $merge and $sB from $lookup subpipelines
Diffstat (limited to 'src/mongo/db/pipeline/document_source_facet_test.cpp')
-rw-r--r-- | src/mongo/db/pipeline/document_source_facet_test.cpp | 51 |
1 files changed, 42 insertions, 9 deletions
diff --git a/src/mongo/db/pipeline/document_source_facet_test.cpp b/src/mongo/db/pipeline/document_source_facet_test.cpp index 90ee6eb6628..d9cbe0146a3 100644 --- a/src/mongo/db/pipeline/document_source_facet_test.cpp +++ b/src/mongo/db/pipeline/document_source_facet_test.cpp @@ -218,7 +218,8 @@ public: HostTypeRequirement::kNone, DiskUseRequirement::kNoDiskUse, FacetRequirement::kAllowed, - TransactionRequirement::kAllowed}; + TransactionRequirement::kAllowed, + LookupRequirement::kAllowed}; } DocumentSource::GetNextResult getNext() final { @@ -251,12 +252,15 @@ TEST_F(DocumentSourceFacetTest, PassthroughFacetDoesntRequireDiskAndIsOKInaTxn) class DocumentSourceWritesPersistentData final : public DocumentSourcePassthrough { public: StageConstraints constraints(Pipeline::SplitState) const final { - return {StreamType::kStreaming, - PositionRequirement::kNone, - HostTypeRequirement::kNone, - DiskUseRequirement::kWritesPersistentData, - FacetRequirement::kAllowed, - TransactionRequirement::kNotAllowed}; + return { + StreamType::kStreaming, + PositionRequirement::kNone, + HostTypeRequirement::kNone, + DiskUseRequirement::kWritesPersistentData, + FacetRequirement::kAllowed, + TransactionRequirement::kNotAllowed, + LookupRequirement::kNotAllowed, + }; } static boost::intrusive_ptr<DocumentSourceWritesPersistentData> create() { @@ -724,7 +728,8 @@ public: HostTypeRequirement::kPrimaryShard, DiskUseRequirement::kNoDiskUse, FacetRequirement::kAllowed, - TransactionRequirement::kAllowed}; + TransactionRequirement::kAllowed, + LookupRequirement::kAllowed}; } static boost::intrusive_ptr<DocumentSourceNeedsPrimaryShard> create() { @@ -791,7 +796,8 @@ public: HostTypeRequirement::kPrimaryShard, DiskUseRequirement::kWritesTmpData, FacetRequirement::kAllowed, - TransactionRequirement::kNotAllowed}; + TransactionRequirement::kNotAllowed, + LookupRequirement::kAllowed}; } static boost::intrusive_ptr<DocumentSourcePrimaryShardTmpDataNoTxn> create() { @@ -799,6 +805,26 @@ public: } }; +/** + * A DocumentSource which cannot be used in a $lookup pipeline. + */ +class DocumentSourceBannedInLookup final : public DocumentSourcePassthrough { +public: + StageConstraints constraints(Pipeline::SplitState pipeState) const final { + return {StreamType::kStreaming, + PositionRequirement::kNone, + HostTypeRequirement::kAnyShard, + DiskUseRequirement::kNoDiskUse, + FacetRequirement::kAllowed, + TransactionRequirement::kAllowed, + LookupRequirement::kNotAllowed}; + } + + static boost::intrusive_ptr<DocumentSourceBannedInLookup> create() { + return new DocumentSourceBannedInLookup(); + } +}; + TEST_F(DocumentSourceFacetTest, ShouldSurfaceStrictestRequirementsOfEachConstraint) { auto ctx = getExpCtx(); @@ -810,9 +836,14 @@ TEST_F(DocumentSourceFacetTest, ShouldSurfaceStrictestRequirementsOfEachConstrai auto secondPipeline = unittest::assertGet(Pipeline::createFacetPipeline({secondPassthrough}, ctx)); + auto thirdPassthrough = DocumentSourceBannedInLookup::create(); + auto thirdPipeline = + unittest::assertGet(Pipeline::createFacetPipeline({thirdPassthrough}, ctx)); + std::vector<DocumentSourceFacet::FacetPipeline> facets; facets.emplace_back("first", std::move(firstPipeline)); facets.emplace_back("second", std::move(secondPipeline)); + facets.emplace_back("third", std::move(thirdPipeline)); auto facetStage = DocumentSourceFacet::create(std::move(facets), ctx); ASSERT(facetStage->constraints(Pipeline::SplitState::kUnsplit).hostRequirement == @@ -821,6 +852,8 @@ TEST_F(DocumentSourceFacetTest, ShouldSurfaceStrictestRequirementsOfEachConstrai StageConstraints::DiskUseRequirement::kWritesTmpData); ASSERT(facetStage->constraints(Pipeline::SplitState::kUnsplit).transactionRequirement == StageConstraints::TransactionRequirement::kNotAllowed); + ASSERT_FALSE( + facetStage->constraints(Pipeline::SplitState::kUnsplit).isAllowedInLookupPipeline()); } } // namespace } // namespace mongo |