diff options
Diffstat (limited to 'src/mongo/db/pipeline/accumulator.h')
-rw-r--r-- | src/mongo/db/pipeline/accumulator.h | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/src/mongo/db/pipeline/accumulator.h b/src/mongo/db/pipeline/accumulator.h index 26dc64ecaeb..4219211a565 100644 --- a/src/mongo/db/pipeline/accumulator.h +++ b/src/mongo/db/pipeline/accumulator.h @@ -65,8 +65,7 @@ enum class AccumulatorDocumentsNeeded { class Accumulator : public RefCountable { public: - using Factory = boost::intrusive_ptr<Accumulator> (*)( - const boost::intrusive_ptr<ExpressionContext>& expCtx); + using Factory = std::function<boost::intrusive_ptr<Accumulator>()>; Accumulator(const boost::intrusive_ptr<ExpressionContext>& expCtx) : _expCtx(expCtx) {} @@ -121,6 +120,19 @@ private: boost::intrusive_ptr<ExpressionContext> _expCtx; }; +/** + * A default parser for any accumulator that only takes a single expression as an argument. Returns + * the expression to be evaluated by the accumulator and an Accumulator::Factory. + */ +template <class AccName> +std::pair<boost::intrusive_ptr<Expression>, Accumulator::Factory> +genericParseSingleExpressionAccumulator(boost::intrusive_ptr<ExpressionContext> expCtx, + BSONElement elem, + VariablesParseState vps) { + auto exprValue = Expression::parseOperand(expCtx, elem, vps); + return {exprValue, [expCtx]() { return AccName::create(expCtx); }}; +} + class AccumulatorAddToSet final : public Accumulator { public: @@ -146,7 +158,6 @@ private: ValueUnorderedSet _set; }; - class AccumulatorFirst final : public Accumulator { public: explicit AccumulatorFirst(const boost::intrusive_ptr<ExpressionContext>& expCtx); @@ -303,7 +314,6 @@ private: long long _count; }; - class AccumulatorStdDev : public Accumulator { public: AccumulatorStdDev(const boost::intrusive_ptr<ExpressionContext>& expCtx, bool isSamp); |