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.cpp85
1 files changed, 40 insertions, 45 deletions
diff --git a/src/mongo/db/matcher/expression_optimize_test.cpp b/src/mongo/db/matcher/expression_optimize_test.cpp
index 763d80fa2cb..eaa606e06df 100644
--- a/src/mongo/db/matcher/expression_optimize_test.cpp
+++ b/src/mongo/db/matcher/expression_optimize_test.cpp
@@ -47,9 +47,9 @@ using unittest::assertGet;
/**
* Helper function to parse the given BSON object as a MatchExpression, checks the status,
- * and return the MatchExpression pointer.
+ * and return the MatchExpression*.
*/
-std::unique_ptr<MatchExpression> parseMatchExpression(const BSONObj& obj) {
+MatchExpression* parseMatchExpression(const BSONObj& obj) {
boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest());
StatusWithMatchExpression status =
MatchExpressionParser::parse(obj,
@@ -63,7 +63,7 @@ std::unique_ptr<MatchExpression> parseMatchExpression(const BSONObj& obj) {
FAIL(ss);
}
- return std::move(status.getValue());
+ return status.getValue().release();
}
/**
@@ -75,8 +75,7 @@ Status isValid(const std::string& queryStr, const FindCommandRequest& findComman
BSONObj queryObj = fromjson(queryStr);
std::unique_ptr<MatchExpression> me(parseMatchExpression(queryObj));
me = MatchExpression::optimize(std::move(me));
- if (auto status = parsed_find_command::isValid(me.get(), findCommand).getStatus();
- !status.isOK()) {
+ if (auto status = CanonicalQuery::isValid(me.get(), findCommand).getStatus(); !status.isOK()) {
return status;
}
return CanonicalQuery::isValidNormalized(me.get());
@@ -351,14 +350,18 @@ TEST(ExpressionOptimizeTest, AndWithAlwaysFalseChildOptimizesToAlwaysFalse) {
BSONObj obj = fromjson("{$and: [{a: 1}, {$alwaysFalse: 1}]}");
std::unique_ptr<MatchExpression> matchExpression(parseMatchExpression(obj));
auto optimizedMatchExpression = MatchExpression::optimize(std::move(matchExpression));
- ASSERT_BSONOBJ_EQ(optimizedMatchExpression->serialize(), fromjson("{$alwaysFalse: 1}"));
+ BSONObjBuilder bob;
+ optimizedMatchExpression->serialize(&bob, true);
+ ASSERT_BSONOBJ_EQ(bob.obj(), fromjson("{$alwaysFalse: 1}"));
}
TEST(ExpressionOptimizeTest, AndRemovesAlwaysTrueChildren) {
BSONObj obj = fromjson("{$and: [{a: 1}, {$alwaysTrue: 1}]}");
std::unique_ptr<MatchExpression> matchExpression(parseMatchExpression(obj));
auto optimizedMatchExpression = MatchExpression::optimize(std::move(matchExpression));
- ASSERT_BSONOBJ_EQ(optimizedMatchExpression->serialize(), fromjson("{a: {$eq: 1}}"));
+ BSONObjBuilder bob;
+ optimizedMatchExpression->serialize(&bob, true);
+ ASSERT_BSONOBJ_EQ(bob.obj(), fromjson("{a: {$eq: 1}}"));
}
TEST(ExpressionOptimizeTest, AndWithSingleChildAlwaysTrueOptimizesToEmptyAnd) {
@@ -367,7 +370,9 @@ TEST(ExpressionOptimizeTest, AndWithSingleChildAlwaysTrueOptimizesToEmptyAnd) {
auto optimizedMatchExpression = MatchExpression::optimize(std::move(matchExpression));
// TODO SERVER-34759 We want this to optimize to an AlwaysTrueMatchExpression.
ASSERT_TRUE(dynamic_cast<AndMatchExpression*>(optimizedMatchExpression.get()));
- ASSERT_BSONOBJ_EQ(optimizedMatchExpression->serialize(), fromjson("{}"));
+ BSONObjBuilder bob;
+ optimizedMatchExpression->serialize(&bob, true);
+ ASSERT_BSONOBJ_EQ(bob.obj(), fromjson("{}"));
}
TEST(ExpressionOptimizeTest, AndWithEachChildAlwaysTrueOptimizesToEmptyAnd) {
@@ -376,28 +381,36 @@ TEST(ExpressionOptimizeTest, AndWithEachChildAlwaysTrueOptimizesToEmptyAnd) {
auto optimizedMatchExpression = MatchExpression::optimize(std::move(matchExpression));
// TODO SERVER-34759 We want this to optimize to an AlwaysTrueMatchExpression.
ASSERT_TRUE(dynamic_cast<AndMatchExpression*>(optimizedMatchExpression.get()));
- ASSERT_BSONOBJ_EQ(optimizedMatchExpression->serialize(), fromjson("{}"));
+ BSONObjBuilder bob;
+ optimizedMatchExpression->serialize(&bob, true);
+ ASSERT_BSONOBJ_EQ(bob.obj(), fromjson("{}"));
}
TEST(ExpressionOptimizeTest, NestedAndWithAlwaysFalseOptimizesToAlwaysFalse) {
BSONObj obj = fromjson("{$and: [{$and: [{$alwaysFalse: 1}, {a: 1}]}, {b: 1}]}");
std::unique_ptr<MatchExpression> matchExpression(parseMatchExpression(obj));
auto optimizedMatchExpression = MatchExpression::optimize(std::move(matchExpression));
- ASSERT_BSONOBJ_EQ(optimizedMatchExpression->serialize(), fromjson("{$alwaysFalse: 1}"));
+ BSONObjBuilder bob;
+ optimizedMatchExpression->serialize(&bob, true);
+ ASSERT_BSONOBJ_EQ(bob.obj(), fromjson("{$alwaysFalse: 1}"));
}
TEST(ExpressionOptimizeTest, OrWithAlwaysTrueOptimizesToAlwaysTrue) {
BSONObj obj = fromjson("{$or: [{a: 1}, {$alwaysTrue: 1}]}");
std::unique_ptr<MatchExpression> matchExpression(parseMatchExpression(obj));
auto optimizedMatchExpression = MatchExpression::optimize(std::move(matchExpression));
- ASSERT_BSONOBJ_EQ(optimizedMatchExpression->serialize(), fromjson("{$alwaysTrue: 1}"));
+ BSONObjBuilder bob;
+ optimizedMatchExpression->serialize(&bob, true);
+ ASSERT_BSONOBJ_EQ(bob.obj(), fromjson("{$alwaysTrue: 1}"));
}
TEST(ExpressionOptimizeTest, OrRemovesAlwaysFalseChildren) {
BSONObj obj = fromjson("{$or: [{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: {$eq: 1}}"));
+ BSONObjBuilder bob;
+ optimizedMatchExpression->serialize(&bob, true);
+ ASSERT_BSONOBJ_EQ(bob.obj(), fromjson("{a: {$eq: 1}}"));
}
TEST(ExpressionOptimizeTest, OrPromotesSingleAlwaysFalseAfterOptimize) {
@@ -406,7 +419,9 @@ TEST(ExpressionOptimizeTest, OrPromotesSingleAlwaysFalseAfterOptimize) {
std::unique_ptr<MatchExpression> matchExpression(parseMatchExpression(obj));
auto optimizedMatchExpression = MatchExpression::optimize(std::move(matchExpression));
ASSERT_TRUE(dynamic_cast<AlwaysFalseMatchExpression*>(optimizedMatchExpression.get()));
- ASSERT_BSONOBJ_EQ(optimizedMatchExpression->serialize(), fromjson("{$alwaysFalse: 1}"));
+ BSONObjBuilder bob;
+ optimizedMatchExpression->serialize(&bob, true);
+ ASSERT_BSONOBJ_EQ(bob.obj(), fromjson("{$alwaysFalse: 1}"));
}
TEST(ExpressionOptimizeTest, OrPromotesSingleAlwaysFalse) {
@@ -414,7 +429,9 @@ TEST(ExpressionOptimizeTest, OrPromotesSingleAlwaysFalse) {
std::unique_ptr<MatchExpression> matchExpression(parseMatchExpression(obj));
auto optimizedMatchExpression = MatchExpression::optimize(std::move(matchExpression));
ASSERT_TRUE(dynamic_cast<AlwaysFalseMatchExpression*>(optimizedMatchExpression.get()));
- ASSERT_BSONOBJ_EQ(optimizedMatchExpression->serialize(), fromjson("{$alwaysFalse: 1}"));
+ BSONObjBuilder bob;
+ optimizedMatchExpression->serialize(&bob, true);
+ ASSERT_BSONOBJ_EQ(bob.obj(), fromjson("{$alwaysFalse: 1}"));
}
TEST(ExpressionOptimizeTest, OrPromotesMultipleAlwaysFalse) {
@@ -422,14 +439,18 @@ TEST(ExpressionOptimizeTest, OrPromotesMultipleAlwaysFalse) {
std::unique_ptr<MatchExpression> matchExpression(parseMatchExpression(obj));
auto optimizedMatchExpression = MatchExpression::optimize(std::move(matchExpression));
ASSERT_TRUE(dynamic_cast<AlwaysFalseMatchExpression*>(optimizedMatchExpression.get()));
- ASSERT_BSONOBJ_EQ(optimizedMatchExpression->serialize(), fromjson("{$alwaysFalse: 1}"));
+ BSONObjBuilder bob;
+ optimizedMatchExpression->serialize(&bob, true);
+ ASSERT_BSONOBJ_EQ(bob.obj(), fromjson("{$alwaysFalse: 1}"));
}
TEST(ExpressionOptimizeTest, NestedOrWithAlwaysTrueOptimizesToAlwaysTrue) {
BSONObj obj = fromjson("{$or: [{$or: [{$alwaysTrue: 1}, {a: 1}]}, {b: 1}]}");
std::unique_ptr<MatchExpression> matchExpression(parseMatchExpression(obj));
auto optimizedMatchExpression = MatchExpression::optimize(std::move(matchExpression));
- ASSERT_BSONOBJ_EQ(optimizedMatchExpression->serialize(), fromjson("{$alwaysTrue: 1}"));
+ BSONObjBuilder bob;
+ optimizedMatchExpression->serialize(&bob, true);
+ ASSERT_BSONOBJ_EQ(bob.obj(), fromjson("{$alwaysTrue: 1}"));
}
TEST(ExpressionOptimizeTest, OrRewrittenToIn) {
@@ -456,7 +477,9 @@ TEST(ExpressionOptimizeTest, OrRewrittenToIn) {
auto obj = fromjson(exprStr);
std::unique_ptr<MatchExpression> matchExpression(parseMatchExpression(obj));
auto optimizedMatchExpression = MatchExpression::optimize(std::move(matchExpression));
- return optimizedMatchExpression->serialize();
+ BSONObjBuilder bob;
+ optimizedMatchExpression->serialize(&bob, true);
+ return bob.obj();
};
ASSERT_BSONOBJ_EQ(optimizeExpr(queries[0].first), fromjson(queries[0].second));
@@ -472,33 +495,5 @@ TEST(ExpressionOptimizeTest, OrRewrittenToIn) {
ASSERT_BSONOBJ_EQ(optimizeExpr(queries[10].first), fromjson(queries[10].second));
}
-TEST(ExpressionOptimizeTest, PartialOrToInRewriteDoesNotGenerateDirectlyNestedOr) {
- BSONObj obj = fromjson("{$or: [{x: {$eq: 3}}, {x: {$eq: 4}}, {y: 5}, {z: 6}]}");
- auto optimizedMatchExpression = MatchExpression::optimize(parseMatchExpression(obj));
- ASSERT_BSONOBJ_EQ(optimizedMatchExpression->serialize(),
- fromjson("{$or: [{x: {$in: [3, 4]}}, {y: {$eq: 5}}, {z: {$eq: 6}}]}"));
-}
-
-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