summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenety Goh <benety@mongodb.com>2013-11-15 11:58:04 -0500
committerBenety Goh <benety@mongodb.com>2013-11-19 10:32:19 -0500
commit31e272af4f900964997af2ce8b2e44013ea40187 (patch)
tree6890a31e4821b1ddef39230bf6dc31b6c1f0d1ee
parent8b98dc053dae6a0db11dfb52d4a86b0274403d52 (diff)
downloadmongo-31e272af4f900964997af2ce8b2e44013ea40187.tar.gz
SERVER-11725 fixed interval comparison for INTERVAL_PRECEDES_COULD_UNION
-rw-r--r--src/mongo/db/query/interval.cpp4
-rw-r--r--src/mongo/db/query/interval_test.cpp11
2 files changed, 14 insertions, 1 deletions
diff --git a/src/mongo/db/query/interval.cpp b/src/mongo/db/query/interval.cpp
index 6c80632c4a5..49b75d0c250 100644
--- a/src/mongo/db/query/interval.cpp
+++ b/src/mongo/db/query/interval.cpp
@@ -150,7 +150,9 @@ namespace mongo {
//
if (precedes(*this, other)) {
- if (0 == end.woCompare(other.start, false)) {
+ // It's not possible for both endInclusive and other.startInclusive to be true because
+ // the bounds would intersect. Refer to section on "Intersect cases" above.
+ if ((endInclusive || other.startInclusive) && 0 == end.woCompare(other.start, false)) {
return INTERVAL_PRECEDES_COULD_UNION;
}
return INTERVAL_PRECEDES;
diff --git a/src/mongo/db/query/interval_test.cpp b/src/mongo/db/query/interval_test.cpp
index 1b95fa2dda1..bbb1f90f20c 100644
--- a/src/mongo/db/query/interval_test.cpp
+++ b/src/mongo/db/query/interval_test.cpp
@@ -134,6 +134,17 @@ namespace {
ASSERT_NOT_EQUALS(f.compare(a), Interval::INTERVAL_PRECEDES);
}
+ TEST(Comparison, PrecedesCouldUnion) {
+ Interval a(BSON("" << 10 << "" << 20), false, true);
+ ASSERT_NOT_EQUALS(a.compare(a), Interval::INTERVAL_PRECEDES);
+
+ Interval b(BSON("" << 0 << "" << 10), true, false);
+ ASSERT_EQUALS(b.compare(a), Interval::INTERVAL_PRECEDES);
+
+ Interval c(BSON("" << 0 << "" << 10), true, true);
+ ASSERT_EQUALS(c.compare(a), Interval::INTERVAL_PRECEDES_COULD_UNION);
+ }
+
TEST(Comparison, Succeds) {
Interval a(BSON("" << 10 << "" << 20), true, true);
ASSERT_NOT_EQUALS(a.compare(a), Interval::INTERVAL_SUCCEEDS);