From ca9bb0300c804617e936c2e2516b441a9474e355 Mon Sep 17 00:00:00 2001 From: Neil Shweky Date: Fri, 29 Oct 2021 20:49:04 +0000 Subject: SERVER-29425 implement $sortArray in classic engine --- src/mongo/db/pipeline/expression.h | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) (limited to 'src/mongo/db/pipeline/expression.h') diff --git a/src/mongo/db/pipeline/expression.h b/src/mongo/db/pipeline/expression.h index 9bbca5ce58b..f7d751a79fd 100644 --- a/src/mongo/db/pipeline/expression.h +++ b/src/mongo/db/pipeline/expression.h @@ -54,6 +54,7 @@ #include "mongo/db/query/query_feature_flags_gen.h" #include "mongo/db/query/sort_pattern.h" #include "mongo/db/server_options.h" +#include "mongo/db/update/pattern_cmp.h" #include "mongo/util/intrusive_counter.h" #include "mongo/util/str.h" @@ -2889,6 +2890,41 @@ public: } }; +class ExpressionSortArray final : public Expression { +public: + static constexpr auto kName = "$sortArray"_sd; + ExpressionSortArray(ExpressionContext* const expCtx, + boost::intrusive_ptr input, + const PatternValueCmp& sortBy) + : Expression(expCtx, {std::move(input)}), _input(_children[0]), _sortBy(sortBy) { + expCtx->sbeCompatible = false; + } + + Value evaluate(const Document& root, Variables* variables) const final; + boost::intrusive_ptr optimize() final; + static boost::intrusive_ptr parse(ExpressionContext* expCtx, + BSONElement expr, + const VariablesParseState& vps); + Value serialize(bool explain) const final; + + void acceptVisitor(ExpressionMutableVisitor* visitor) final { + return visitor->visit(this); + } + + void acceptVisitor(ExpressionConstVisitor* visitor) const final { + return visitor->visit(this); + } + + const char* getOpName() const; + +protected: + void _doAddDependencies(DepsTracker* deps) const final; + +private: + boost::intrusive_ptr& _input; + + PatternValueCmp _sortBy; +}; class ExpressionSlice final : public ExpressionRangedArity { public: -- cgit v1.2.1