summaryrefslogtreecommitdiff
path: root/src/mongo/db/matcher/expression_tree.h
diff options
context:
space:
mode:
authorJustin Seyster <justin.seyster@mongodb.com>2017-09-28 18:20:41 -0400
committerJustin Seyster <justin.seyster@mongodb.com>2017-09-28 18:20:41 -0400
commit3cf4e0593c394dd7eb45d8000d76b5dc73a3f425 (patch)
tree26559cb6599a592e7ca0368f2f31abe22dea47c7 /src/mongo/db/matcher/expression_tree.h
parentf88f6f43b7ae2af0286437da8f00c0079ed99145 (diff)
downloadmongo-3cf4e0593c394dd7eb45d8000d76b5dc73a3f425.tar.gz
SERVER-30991 Introduce MatchExpression::optimize().
This patch refactors CanonicalQuery::normalizeTree() so that the normalization logic for each type of MatchExpression goes with the class, rather than all the optimization rules getting bundled into one huge else if chain. We wanted something along the lines of an optimize() member function that would optimize 'this' and return the optimized result (possibly the same object). However, we also wanted unique_ptr semantics, so that the optimize function creates a new tree that does not include the original object, it autmotatically gets destroyed. There's no way to specify a member function that accepts a unique_ptr 'this' value. To get around that, we provide a getOptimizer() private function that returns a function with the unique_ptr signature we want: unique_ptr<MatchExpression> -> unique_ptr<MatchExpression>. This way, we still get to replace our if else chain with virtual dispatch, and we can maintain unique_ptr semantics for the MatchExpression tree.
Diffstat (limited to 'src/mongo/db/matcher/expression_tree.h')
-rw-r--r--src/mongo/db/matcher/expression_tree.h4
1 files changed, 4 insertions, 0 deletions
diff --git a/src/mongo/db/matcher/expression_tree.h b/src/mongo/db/matcher/expression_tree.h
index 5bfd86820ee..a0c1cc088be 100644
--- a/src/mongo/db/matcher/expression_tree.h
+++ b/src/mongo/db/matcher/expression_tree.h
@@ -99,6 +99,8 @@ protected:
void _listToBSON(BSONArrayBuilder* out) const;
private:
+ ExpressionOptimizerFunc getOptimizer() const final;
+
std::vector<MatchExpression*> _expressions;
};
@@ -237,6 +239,8 @@ public:
}
private:
+ ExpressionOptimizerFunc getOptimizer() const final;
+
std::unique_ptr<MatchExpression> _exp;
};
}