summaryrefslogtreecommitdiff
path: root/src/mongo/db/pipeline/document_source_facet_test.cpp
diff options
context:
space:
mode:
authorIan Boros <puppyofkosh@gmail.com>2019-05-13 18:19:38 -0400
committerIan Boros <puppyofkosh@gmail.com>2019-05-20 15:50:22 -0400
commit31967340abb31476910730163c04782f2e915d01 (patch)
treee21db441abdfbdf707f66f640796e3d8ee6ab6a8 /src/mongo/db/pipeline/document_source_facet_test.cpp
parent24760ca934a3c7843731de117839070ddf7fd3cc (diff)
downloadmongo-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.cpp51
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