summaryrefslogtreecommitdiff
path: root/src/mongo/db/query/index_bounds_builder_test.cpp
diff options
context:
space:
mode:
authorDavid Storch <david.storch@10gen.com>2017-12-20 11:21:27 -0500
committerDavid Storch <david.storch@10gen.com>2017-12-29 13:17:52 -0500
commit6699621bfb54174c7ee082ee85c62211788942c3 (patch)
tree1abb4f436e3d6c67e84ed25aeaa08909ec02dbec /src/mongo/db/query/index_bounds_builder_test.cpp
parent85fa19c04ca0059b8aa5689028d1e7d799c19483 (diff)
downloadmongo-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.cpp76
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]}");