diff options
author | James Wahlin <james@mongodb.com> | 2017-07-25 08:59:47 -0400 |
---|---|---|
committer | James Wahlin <james@mongodb.com> | 2017-08-09 16:29:49 -0400 |
commit | 2087f94e8c6d7226a4dd48155082034ae51c3cfd (patch) | |
tree | 6a6dac53fe93bc29a174e008c26f2d6daf474a05 /src/mongo/db/pipeline/expression_test.cpp | |
parent | c1aee1915536be2d1928d1098e133acbfdc3a575 (diff) | |
download | mongo-2087f94e8c6d7226a4dd48155082034ae51c3cfd.tar.gz |
SERVER-30046 Support $expr constant expression in ComparisonMatchExpression
Diffstat (limited to 'src/mongo/db/pipeline/expression_test.cpp')
-rw-r--r-- | src/mongo/db/pipeline/expression_test.cpp | 50 |
1 files changed, 40 insertions, 10 deletions
diff --git a/src/mongo/db/pipeline/expression_test.cpp b/src/mongo/db/pipeline/expression_test.cpp index 22180869ccb..b05a1bc1515 100644 --- a/src/mongo/db/pipeline/expression_test.cpp +++ b/src/mongo/db/pipeline/expression_test.cpp @@ -2190,17 +2190,48 @@ public: } }; -/** No optimization is performed. */ -class Optimize { -public: - void run() { - intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); - intrusive_ptr<Expression> expression = ExpressionFieldPath::create(expCtx, "a"); - // An attempt to optimize returns the Expression itself. - ASSERT_EQUALS(expression, expression->optimize()); - } +TEST(FieldPath, NoOptimizationOnNormalPath) { + intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); + intrusive_ptr<Expression> expression = ExpressionFieldPath::create(expCtx, "a"); + // An attempt to optimize returns the Expression itself. + ASSERT_EQUALS(expression, expression->optimize()); }; +TEST(FieldPath, OptimizeOnVariableWithConstantValue) { + intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); + auto varId = expCtx->variablesParseState.defineVariable("userVar"); + expCtx->variables.setValue(varId, Value(123)); + + auto expr = ExpressionFieldPath::parse(expCtx, "$$userVar", expCtx->variablesParseState); + ASSERT_TRUE(dynamic_cast<ExpressionFieldPath*>(expr.get())); + + auto optimizedExpr = expr->optimize(); + ASSERT_TRUE(dynamic_cast<ExpressionConstant*>(optimizedExpr.get())); +} + +TEST(FieldPath, NoOptimizationOnVariableWithNoValue) { + intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); + expCtx->variablesParseState.defineVariable("userVar"); + + auto expr = ExpressionFieldPath::parse(expCtx, "$$userVar", expCtx->variablesParseState); + ASSERT_TRUE(dynamic_cast<ExpressionFieldPath*>(expr.get())); + + auto optimizedExpr = expr->optimize(); + ASSERT_FALSE(dynamic_cast<ExpressionConstant*>(optimizedExpr.get())); +} + +TEST(FieldPath, NoOptimizationOnVariableWithMissingValue) { + intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); + auto varId = expCtx->variablesParseState.defineVariable("userVar"); + expCtx->variables.setValue(varId, Value()); + + auto expr = ExpressionFieldPath::parse(expCtx, "$$userVar", expCtx->variablesParseState); + ASSERT_TRUE(dynamic_cast<ExpressionFieldPath*>(expr.get())); + + auto optimizedExpr = expr->optimize(); + ASSERT_FALSE(dynamic_cast<ExpressionConstant*>(optimizedExpr.get())); +} + /** The field path itself is a dependency. */ class Dependencies { public: @@ -5254,7 +5285,6 @@ public: add<Constant::AddToBsonArray>(); add<FieldPath::Invalid>(); - add<FieldPath::Optimize>(); add<FieldPath::Dependencies>(); add<FieldPath::Missing>(); add<FieldPath::Present>(); |