diff options
author | Bernard Gorman <bernard.gorman@gmail.com> | 2017-09-21 02:22:00 -0400 |
---|---|---|
committer | Bernard Gorman <bernard.gorman@gmail.com> | 2017-09-24 15:59:10 -0400 |
commit | 21f5028d4404ea9584d53bdb81dd63ca8a505d6f (patch) | |
tree | ec6e458b171de330c0e4756603ba95ba3df06834 /src/mongo/db/pipeline/expression_test.cpp | |
parent | 280981d3a4cadeb91da9fd69864924e61d7ef99a (diff) | |
download | mongo-21f5028d4404ea9584d53bdb81dd63ca8a505d6f.tar.gz |
SERVER-30399 Add caching for $lookup non-correlated sub-pipeline prefix
Diffstat (limited to 'src/mongo/db/pipeline/expression_test.cpp')
-rw-r--r-- | src/mongo/db/pipeline/expression_test.cpp | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/src/mongo/db/pipeline/expression_test.cpp b/src/mongo/db/pipeline/expression_test.cpp index bd3abd1ffc3..048dcbe769d 100644 --- a/src/mongo/db/pipeline/expression_test.cpp +++ b/src/mongo/db/pipeline/expression_test.cpp @@ -2663,6 +2663,68 @@ TEST(ExpressionObjectDependencies, FieldPathsShouldBeAddedToDependencies) { ASSERT_EQ(deps.fields.count("c.d"), 1UL); }; +TEST(ExpressionObjectDependencies, VariablesShouldBeAddedToDependencies) { + intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); + auto varID = expCtx->variablesParseState.defineVariable("var1"); + auto fieldPath = ExpressionFieldPath::parse(expCtx, "$$var1", expCtx->variablesParseState); + DepsTracker deps; + fieldPath->addDependencies(&deps); + ASSERT_EQ(deps.vars.size(), 1UL); + ASSERT_EQ(deps.vars.count(varID), 1UL); +} + +TEST(ExpressionObjectDependencies, LocalLetVariablesShouldBeFilteredOutOfDependencies) { + intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); + expCtx->variablesParseState.defineVariable("var1"); + auto letSpec = BSON("$let" << BSON("vars" << BSON("var2" + << "abc") + << "in" + << BSON("$multiply" << BSON_ARRAY("$$var1" + << "$$var2")))); + auto expressionLet = + ExpressionLet::parse(expCtx, letSpec.firstElement(), expCtx->variablesParseState); + DepsTracker deps; + expressionLet->addDependencies(&deps); + ASSERT_EQ(deps.vars.size(), 1UL); + ASSERT_EQ(expCtx->variablesParseState.getVariable("var1"), *deps.vars.begin()); +} + +TEST(ExpressionObjectDependencies, LocalMapVariablesShouldBeFilteredOutOfDependencies) { + intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); + expCtx->variablesParseState.defineVariable("var1"); + auto mapSpec = BSON("$map" << BSON("input" + << "$field1" + << "as" + << "var2" + << "in" + << BSON("$multiply" << BSON_ARRAY("$$var1" + << "$$var2")))); + + auto expressionMap = + ExpressionMap::parse(expCtx, mapSpec.firstElement(), expCtx->variablesParseState); + DepsTracker deps; + expressionMap->addDependencies(&deps); + ASSERT_EQ(deps.vars.size(), 1UL); + ASSERT_EQ(expCtx->variablesParseState.getVariable("var1"), *deps.vars.begin()); +} + +TEST(ExpressionObjectDependencies, LocalFilterVariablesShouldBeFilteredOutOfDependencies) { + intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); + expCtx->variablesParseState.defineVariable("var1"); + auto filterSpec = BSON("$filter" << BSON("input" << BSON_ARRAY(1 << 2 << 3) << "as" + << "var2" + << "cond" + << BSON("$gt" << BSON_ARRAY("$$var1" + << "$$var2")))); + + auto expressionFilter = + ExpressionFilter::parse(expCtx, filterSpec.firstElement(), expCtx->variablesParseState); + DepsTracker deps; + expressionFilter->addDependencies(&deps); + ASSERT_EQ(deps.vars.size(), 1UL); + ASSERT_EQ(expCtx->variablesParseState.getVariable("var1"), *deps.vars.begin()); +} + // // Optimizations. // |