diff options
author | Justin Seyster <justin.seyster@mongodb.com> | 2017-09-28 18:20:41 -0400 |
---|---|---|
committer | Justin Seyster <justin.seyster@mongodb.com> | 2017-09-28 18:20:41 -0400 |
commit | 3cf4e0593c394dd7eb45d8000d76b5dc73a3f425 (patch) | |
tree | 26559cb6599a592e7ca0368f2f31abe22dea47c7 /src/mongo/db/exec/geo_near.cpp | |
parent | f88f6f43b7ae2af0286437da8f00c0079ed99145 (diff) | |
download | mongo-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/exec/geo_near.cpp')
-rw-r--r-- | src/mongo/db/exec/geo_near.cpp | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/src/mongo/db/exec/geo_near.cpp b/src/mongo/db/exec/geo_near.cpp index 5349bfaa3e5..9da6af59370 100644 --- a/src/mongo/db/exec/geo_near.cpp +++ b/src/mongo/db/exec/geo_near.cpp @@ -543,6 +543,10 @@ public: } private: + ExpressionOptimizerFunc getOptimizer() const final { + return [](std::unique_ptr<MatchExpression> expression) { return expression; }; + } + R2Annulus _annulus; }; |