summaryrefslogtreecommitdiff
path: root/src/mongo/db/query/optimizer/rewrites/path_optimizer_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/query/optimizer/rewrites/path_optimizer_test.cpp')
-rw-r--r--src/mongo/db/query/optimizer/rewrites/path_optimizer_test.cpp90
1 files changed, 90 insertions, 0 deletions
diff --git a/src/mongo/db/query/optimizer/rewrites/path_optimizer_test.cpp b/src/mongo/db/query/optimizer/rewrites/path_optimizer_test.cpp
index 69e97412617..9a373a826f2 100644
--- a/src/mongo/db/query/optimizer/rewrites/path_optimizer_test.cpp
+++ b/src/mongo/db/query/optimizer/rewrites/path_optimizer_test.cpp
@@ -564,6 +564,96 @@ TEST(Path, Fuse6) {
tree);
}
+TEST(Path, Fuse7) {
+ auto scanNode = make<ScanNode>("root", "test");
+
+ auto project1 = make<EvaluationNode>(
+ "px",
+ make<EvalPath>(make<PathGet>("x", make<PathIdentity>()), make<Variable>("root")),
+ std::move(scanNode));
+
+ auto project2 = make<EvaluationNode>(
+ "py",
+ make<EvalPath>(
+ make<PathComposeM>(
+ make<PathComposeM>(make<PathKeep>(PathKeep::NameSet{"a"}),
+ make<PathField>("a", make<PathConstant>(make<Variable>("px")))),
+ make<PathDefault>(Constant::emptyObject())),
+ make<Variable>("root")),
+ std::move(project1));
+
+ auto tree = make<RootNode>(properties::ProjectionRequirement{ProjectionNameVector{"py"}},
+ std::move(project2));
+
+ ASSERT_EXPLAIN(
+ "Root []\n"
+ " projections: \n"
+ " py\n"
+ " RefBlock: \n"
+ " Variable [py]\n"
+ " Evaluation []\n"
+ " BindBlock:\n"
+ " [py]\n"
+ " EvalPath []\n"
+ " PathComposeM []\n"
+ " PathComposeM []\n"
+ " PathKeep [a]\n"
+ " PathField [a]\n"
+ " PathConstant []\n"
+ " Variable [px]\n"
+ " PathDefault []\n"
+ " Const [{}]\n"
+ " Variable [root]\n"
+ " Evaluation []\n"
+ " BindBlock:\n"
+ " [px]\n"
+ " EvalPath []\n"
+ " PathGet [x]\n"
+ " PathIdentity []\n"
+ " Variable [root]\n"
+ " Scan [test]\n"
+ " BindBlock:\n"
+ " [root]\n"
+ " Source []\n",
+ tree);
+
+ auto env = VariableEnvironment::build(tree);
+ bool changed = false;
+ do {
+ changed = false;
+ if (PathFusion{env}.optimize(tree)) {
+ changed = true;
+ }
+ if (ConstEval{env}.optimize(tree)) {
+ changed = true;
+ }
+ } while (changed);
+
+ // Obtain "x" and directly assign at "a".
+ ASSERT_EXPLAIN(
+ "Root []\n"
+ " projections: \n"
+ " py\n"
+ " RefBlock: \n"
+ " Variable [py]\n"
+ " Evaluation []\n"
+ " BindBlock:\n"
+ " [py]\n"
+ " EvalPath []\n"
+ " PathField [a]\n"
+ " PathConstant []\n"
+ " EvalPath []\n"
+ " PathGet [x]\n"
+ " PathIdentity []\n"
+ " Variable [root]\n"
+ " Const [{}]\n"
+ " Scan [test]\n"
+ " BindBlock:\n"
+ " [root]\n"
+ " Source []\n",
+ tree);
+}
+
TEST(Path, Lower1) {
PrefixId prefixId;