diff options
author | David Storch <david.storch@10gen.com> | 2017-12-20 11:21:27 -0500 |
---|---|---|
committer | David Storch <david.storch@10gen.com> | 2017-12-29 13:17:52 -0500 |
commit | 6699621bfb54174c7ee082ee85c62211788942c3 (patch) | |
tree | 1abb4f436e3d6c67e84ed25aeaa08909ec02dbec /src/mongo/db/query/index_bounds_builder_test.cpp | |
parent | 85fa19c04ca0059b8aa5689028d1e7d799c19483 (diff) | |
download | mongo-6699621bfb54174c7ee082ee85c62211788942c3.tar.gz |
SERVER-31760 Add index support for InternalExprEqMatchExpression.
Diffstat (limited to 'src/mongo/db/query/index_bounds_builder_test.cpp')
-rw-r--r-- | src/mongo/db/query/index_bounds_builder_test.cpp | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/src/mongo/db/query/index_bounds_builder_test.cpp b/src/mongo/db/query/index_bounds_builder_test.cpp index 8305f91be4b..f865979f3eb 100644 --- a/src/mongo/db/query/index_bounds_builder_test.cpp +++ b/src/mongo/db/query/index_bounds_builder_test.cpp @@ -498,6 +498,82 @@ TEST(IndexBoundsBuilderTest, TranslateEqual) { ASSERT_EQUALS(tightness, IndexBoundsBuilder::EXACT); } +TEST(IndexBoundsBuilderTest, TranslateExprEqual) { + BSONObj keyPattern = BSON("a" << 1); + BSONElement elt = keyPattern.firstElement(); + IndexEntry testIndex{keyPattern}; + BSONObj obj = BSON("a" << BSON("$_internalExprEq" << 4)); + unique_ptr<MatchExpression> expr(parseMatchExpression(obj)); + OrderedIntervalList oil; + IndexBoundsBuilder::BoundsTightness tightness; + IndexBoundsBuilder::translate(expr.get(), elt, testIndex, &oil, &tightness); + ASSERT_EQUALS(oil.name, "a"); + ASSERT_EQUALS(oil.intervals.size(), 1U); + ASSERT_EQUALS(Interval::INTERVAL_EQUALS, + oil.intervals[0].compare(Interval(fromjson("{'': 4, '': 4}"), true, true))); + ASSERT_EQUALS(tightness, IndexBoundsBuilder::EXACT); +} + +TEST(IndexBoundsBuilderTest, TranslateExprEqualToStringRespectsCollation) { + BSONObj keyPattern = BSON("a" << 1); + BSONElement elt = keyPattern.firstElement(); + CollatorInterfaceMock collator(CollatorInterfaceMock::MockType::kReverseString); + IndexEntry testIndex{keyPattern}; + testIndex.collator = &collator; + + BSONObj obj = BSON("a" << BSON("$_internalExprEq" + << "foo")); + unique_ptr<MatchExpression> expr(parseMatchExpression(obj)); + OrderedIntervalList oil; + IndexBoundsBuilder::BoundsTightness tightness; + IndexBoundsBuilder::translate(expr.get(), elt, testIndex, &oil, &tightness); + ASSERT_EQUALS(oil.name, "a"); + ASSERT_EQUALS(oil.intervals.size(), 1U); + ASSERT_EQUALS( + Interval::INTERVAL_EQUALS, + oil.intervals[0].compare(Interval(fromjson("{'': 'oof', '': 'oof'}"), true, true))); + ASSERT_EQUALS(tightness, IndexBoundsBuilder::EXACT); +} + +TEST(IndexBoundsBuilderTest, TranslateExprEqualHashedIndex) { + BSONObj keyPattern = fromjson("{a: 'hashed'}"); + BSONElement elt = keyPattern.firstElement(); + IndexEntry testIndex{keyPattern}; + BSONObj obj = BSON("a" << BSON("$_internalExprEq" << 4)); + unique_ptr<MatchExpression> expr(parseMatchExpression(obj)); + OrderedIntervalList oil; + IndexBoundsBuilder::BoundsTightness tightness; + IndexBoundsBuilder::translate(expr.get(), elt, testIndex, &oil, &tightness); + + BSONObj expectedHash = ExpressionMapping::hash(BSON("" << 4).firstElement()); + BSONObjBuilder intervalBuilder; + intervalBuilder.append("", expectedHash.firstElement().numberLong()); + intervalBuilder.append("", expectedHash.firstElement().numberLong()); + BSONObj intervalObj = intervalBuilder.obj(); + + ASSERT_EQUALS(oil.name, "a"); + ASSERT_EQUALS(oil.intervals.size(), 1U); + ASSERT_EQUALS(Interval::INTERVAL_EQUALS, + oil.intervals[0].compare(Interval(intervalObj, true, true))); + ASSERT_EQUALS(tightness, IndexBoundsBuilder::INEXACT_FETCH); +} + +TEST(IndexBoundsBuilderTest, TranslateExprEqualToNullIsInexactFetch) { + BSONObj keyPattern = BSON("a" << 1); + BSONElement elt = keyPattern.firstElement(); + IndexEntry testIndex{keyPattern}; + BSONObj obj = BSON("a" << BSON("$_internalExprEq" << BSONNULL)); + unique_ptr<MatchExpression> expr(parseMatchExpression(obj)); + OrderedIntervalList oil; + IndexBoundsBuilder::BoundsTightness tightness; + IndexBoundsBuilder::translate(expr.get(), elt, testIndex, &oil, &tightness); + ASSERT_EQUALS(oil.name, "a"); + ASSERT_EQUALS(oil.intervals.size(), 1U); + ASSERT_EQUALS(Interval::INTERVAL_EQUALS, + oil.intervals[0].compare(Interval(fromjson("{'': null, '': null}"), true, true))); + ASSERT_EQUALS(tightness, IndexBoundsBuilder::INEXACT_FETCH); +} + TEST(IndexBoundsBuilderTest, TranslateArrayEqualBasic) { IndexEntry testIndex = IndexEntry(BSONObj()); BSONObj obj = fromjson("{a: [1, 2, 3]}"); |