summaryrefslogtreecommitdiff
path: root/src/mongo/db/matcher/expression_optimize_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/matcher/expression_optimize_test.cpp')
-rw-r--r--src/mongo/db/matcher/expression_optimize_test.cpp21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/mongo/db/matcher/expression_optimize_test.cpp b/src/mongo/db/matcher/expression_optimize_test.cpp
index eaa606e06df..04d2bc29e11 100644
--- a/src/mongo/db/matcher/expression_optimize_test.cpp
+++ b/src/mongo/db/matcher/expression_optimize_test.cpp
@@ -495,5 +495,26 @@ TEST(ExpressionOptimizeTest, OrRewrittenToIn) {
ASSERT_BSONOBJ_EQ(optimizeExpr(queries[10].first), fromjson(queries[10].second));
}
+TEST(ExpressionOptimizeTest, NorRemovesAlwaysFalseChildren) {
+ BSONObj obj = fromjson("{$nor: [{a: 1}, {$alwaysFalse: 1}]}");
+ std::unique_ptr<MatchExpression> matchExpression(parseMatchExpression(obj));
+ auto optimizedMatchExpression = MatchExpression::optimize(std::move(matchExpression));
+ ASSERT_BSONOBJ_EQ(optimizedMatchExpression->serialize(), fromjson("{a: {$not: {$eq: 1}}}"));
+}
+
+TEST(ExpressionOptimizeTest, NorWithoutChildrenOptimizesToEmptyAnd) {
+ BSONObj obj = fromjson("{$nor: [{$alwaysFalse: 1}, {$alwaysFalse: 1}]}");
+ std::unique_ptr<MatchExpression> matchExpression(parseMatchExpression(obj));
+ auto optimizedMatchExpression = MatchExpression::optimize(std::move(matchExpression));
+ ASSERT_TRUE(dynamic_cast<AndMatchExpression*>(optimizedMatchExpression.get()));
+ ASSERT_BSONOBJ_EQ(optimizedMatchExpression->serialize(), fromjson("{}"));
+}
+
+TEST(ExpressionOptimizeTest, NorWithAlwaysTrueChildOptimizesToAlwaysFalse) {
+ BSONObj obj = fromjson("{$nor: [{a: 1}, {$alwaysTrue: 1}]}");
+ std::unique_ptr<MatchExpression> matchExpression(parseMatchExpression(obj));
+ auto optimizedMatchExpression = MatchExpression::optimize(std::move(matchExpression));
+ ASSERT_BSONOBJ_EQ(optimizedMatchExpression->serialize(), fromjson("{$alwaysFalse: 1}"));
+}
} // namespace
} // namespace mongo