summaryrefslogtreecommitdiff
path: root/src/mongo/db/pipeline/expression_test.cpp
diff options
context:
space:
mode:
authorJames Wahlin <james@mongodb.com>2017-07-25 08:59:47 -0400
committerJames Wahlin <james@mongodb.com>2017-08-09 16:29:49 -0400
commit2087f94e8c6d7226a4dd48155082034ae51c3cfd (patch)
tree6a6dac53fe93bc29a174e008c26f2d6daf474a05 /src/mongo/db/pipeline/expression_test.cpp
parentc1aee1915536be2d1928d1098e133acbfdc3a575 (diff)
downloadmongo-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.cpp50
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>();