summaryrefslogtreecommitdiff
path: root/src/mongo/db/query/planner_analysis_test.cpp
diff options
context:
space:
mode:
authorDavid Storch <david.storch@10gen.com>2014-12-09 19:03:28 -0500
committerDavid Storch <david.storch@10gen.com>2014-12-12 11:55:26 -0500
commit5120700460ef7a3240603a4307a0b1be2c358c3c (patch)
tree0e414cd328ec0d6e2b5003d5e1b421befe6ff668 /src/mongo/db/query/planner_analysis_test.cpp
parentd3877ceca348713dc4d4347249a3976ee466edd3 (diff)
downloadmongo-5120700460ef7a3240603a4307a0b1be2c358c3c.tar.gz
SERVER-14070 sort analysis computes additional sort orders provided by an index scan
Diffstat (limited to 'src/mongo/db/query/planner_analysis_test.cpp')
-rw-r--r--src/mongo/db/query/planner_analysis_test.cpp53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/mongo/db/query/planner_analysis_test.cpp b/src/mongo/db/query/planner_analysis_test.cpp
index e638228db50..431a6b3c8a7 100644
--- a/src/mongo/db/query/planner_analysis_test.cpp
+++ b/src/mongo/db/query/planner_analysis_test.cpp
@@ -29,6 +29,7 @@
#include "mongo/db/query/planner_analysis.h"
#include "mongo/db/json.h"
+#include "mongo/db/query/query_solution.h"
#include "mongo/unittest/unittest.h"
using namespace mongo;
@@ -109,4 +110,56 @@ namespace {
" d: 1}")));
}
+ // Test the generation of sort orders provided by an index scan done by
+ // IndexScanNode::computeProperties().
+ TEST(QueryPlannerAnalysis, IxscanSortOrdersBasic) {
+ IndexScanNode ixscan;
+ ixscan.indexKeyPattern = fromjson("{a: 1, b: 1, c: 1, d: 1, e: 1}");
+
+ // Bounds are {a: [[1,1]], b: [[2,2]], c: [[3,3]], d: [[1,5]], e:[[1,1],[2,2]]},
+ // all inclusive.
+ OrderedIntervalList oil1("a");
+ oil1.intervals.push_back(Interval(fromjson("{'': 1, '': 1}"), true, true));
+ ixscan.bounds.fields.push_back(oil1);
+
+ OrderedIntervalList oil2("b");
+ oil2.intervals.push_back(Interval(fromjson("{'': 2, '': 2}"), true, true));
+ ixscan.bounds.fields.push_back(oil2);
+
+ OrderedIntervalList oil3("c");
+ oil3.intervals.push_back(Interval(fromjson("{'': 3, '': 3}"), true, true));
+ ixscan.bounds.fields.push_back(oil3);
+
+ OrderedIntervalList oil4("d");
+ oil4.intervals.push_back(Interval(fromjson("{'': 1, '': 5}"), true, true));
+ ixscan.bounds.fields.push_back(oil4);
+
+ OrderedIntervalList oil5("e");
+ oil5.intervals.push_back(Interval(fromjson("{'': 1, '': 1}"), true, true));
+ oil5.intervals.push_back(Interval(fromjson("{'': 2, '': 2}"), true, true));
+ ixscan.bounds.fields.push_back(oil5);
+
+ // Compute and retrieve the set of sorts.
+ ixscan.computeProperties();
+ const BSONObjSet& sorts = ixscan.getSort();
+
+ // One possible sort is the index key pattern.
+ ASSERT(sorts.find(fromjson("{a: 1, b: 1, c: 1, d: 1, e: 1}")) != sorts.end());
+
+ // All prefixes of the key pattern.
+ ASSERT(sorts.find(fromjson("{a: 1}")) != sorts.end());
+ ASSERT(sorts.find(fromjson("{a: 1, b: 1}")) != sorts.end());
+ ASSERT(sorts.find(fromjson("{a: 1, b: 1, c: 1}")) != sorts.end());
+ ASSERT(sorts.find(fromjson("{a: 1, b: 1, c: 1, d: 1}")) != sorts.end());
+
+ // Additional sorts considered due to point intervals on 'a', 'b', and 'c'.
+ ASSERT(sorts.find(fromjson("{b: 1, c: 1, d: 1, e: 1}")) != sorts.end());
+ ASSERT(sorts.find(fromjson("{c: 1, d: 1, e: 1}")) != sorts.end());
+ ASSERT(sorts.find(fromjson("{d: 1, e: 1}")) != sorts.end());
+ ASSERT(sorts.find(fromjson("{d: 1}")) != sorts.end());
+
+ // There should be 9 total sorts: make sure no other ones snuck their way in.
+ ASSERT_EQ(9, sorts.size());
+ }
+
} // namespace