diff options
author | Justin Seyster <justin.seyster@mongodb.com> | 2017-09-29 16:00:36 -0400 |
---|---|---|
committer | Justin Seyster <justin.seyster@mongodb.com> | 2017-09-29 16:00:36 -0400 |
commit | b3bdd98e0d9cab6857590c174a81911a9a8205ac (patch) | |
tree | e158ad285dbffa4ca5ef9d551947f84a03433810 /src/mongo/db/pipeline/document_source_lookup_test.cpp | |
parent | 59ead734faa8aa51f0c53bf2bd39d0a0247ddf99 (diff) | |
download | mongo-b3bdd98e0d9cab6857590c174a81911a9a8205ac.tar.gz |
Reapply "SERVER-30991 Introduce MatchExpression::optimize()."
This patch undoes the revert in
3cf4e0593c394dd7eb45d8000d76b5dc73a3f425 and includes minor changes to
fix the compiler problem that resulted in the previous revert.
Diffstat (limited to 'src/mongo/db/pipeline/document_source_lookup_test.cpp')
-rw-r--r-- | src/mongo/db/pipeline/document_source_lookup_test.cpp | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/src/mongo/db/pipeline/document_source_lookup_test.cpp b/src/mongo/db/pipeline/document_source_lookup_test.cpp index 03ea80c5d7d..66931114dbe 100644 --- a/src/mongo/db/pipeline/document_source_lookup_test.cpp +++ b/src/mongo/db/pipeline/document_source_lookup_test.cpp @@ -678,7 +678,10 @@ TEST_F(DocumentSourceLookUpTest, auto subPipeline = lookupStage->getSubPipeline_forTest(DOC("_id" << 5)); ASSERT(subPipeline); - // TODO SERVER-30991: $match within $facet should optimize to $const. + // TODO: The '$$var1' in this expression actually gets optimized to a constant expression with + // value 5, but the explain output does not reflect that change. SERVER-31292 will make that + // optimization visible here, so we will need to replace '$$var1' with a $const expression for + // this test to pass. auto expectedPipe = fromjson(str::stream() << "[{mock: {}}, {$match: {x:1}}, {$sort: {sortKey: {x: 1}}}, " << sequentialCacheStageObj() @@ -688,6 +691,43 @@ TEST_F(DocumentSourceLookUpTest, ASSERT_VALUE_EQ(Value(subPipeline->writeExplainOps(kExplain)), Value(BSONArray(expectedPipe))); } +TEST_F(DocumentSourceLookUpTest, ExprEmbeddedInMatchExpressionShouldBeOptimized) { + auto expCtx = getExpCtx(); + NamespaceString fromNs("test", "coll"); + expCtx->setResolvedNamespace(fromNs, {fromNs, std::vector<BSONObj>{}}); + + // This pipeline includes a $match stage that itself includes a $expr expression. + auto docSource = DocumentSourceLookUp::createFromBson( + fromjson("{$lookup: {let: {var1: '$_id'}, pipeline: [{$match: {$expr: {$eq: " + "['$_id','$$var1']}}}], from: 'coll', as: 'as'}}") + .firstElement(), + expCtx); + + auto lookupStage = static_cast<DocumentSourceLookUp*>(docSource.get()); + ASSERT(lookupStage); + + lookupStage->injectMongodInterface( + std::shared_ptr<MockMongodInterface>(new MockMongodInterface({}))); + + auto subPipeline = lookupStage->getSubPipeline_forTest(DOC("_id" << 5)); + ASSERT(subPipeline); + + auto sources = subPipeline->getSources(); + ASSERT_GTE(sources.size(), 2u); + + // The first source is our mock data source, and the second should be the $match expression. + auto secondSource = *(++sources.begin()); + auto& matchSource = dynamic_cast<const DocumentSourceMatch&>(*secondSource); + + // Ensure that the '$$var' in the embedded expression got optimized to ExpressionConstant. + BSONObjBuilder builder; + matchSource.getMatchExpression()->serialize(&builder); + auto serializedMatch = builder.obj(); + auto expectedMatch = fromjson("{$expr: {$eq: ['$_id', {$const: 5}]}}"); + + ASSERT_VALUE_EQ(Value(serializedMatch), Value(expectedMatch)); +} + TEST_F(DocumentSourceLookUpTest, ShouldIgnoreLocalVariablesShadowingLetVariablesWhenFindingNonCorrelatedPrefix) { auto expCtx = getExpCtx(); |