diff options
Diffstat (limited to 'src/mongo/db/matcher/expression_optimize_test.cpp')
| -rw-r--r-- | src/mongo/db/matcher/expression_optimize_test.cpp | 85 |
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 |
