diff options
author | Ted Tuckman <ted.tuckman@mongodb.com> | 2019-10-14 20:58:20 +0000 |
---|---|---|
committer | evergreen <evergreen@mongodb.com> | 2019-10-14 20:58:20 +0000 |
commit | 2fb44f082935fcefdce1fcb94e0cef2aab6e945e (patch) | |
tree | d842d9241998e704ac05c15b4c7a1f39408cfbc1 /src/mongo/db/pipeline/accumulator.h | |
parent | c119ef45e3f1c2cc7f36c7b81d0731e332461c2b (diff) | |
download | mongo-2fb44f082935fcefdce1fcb94e0cef2aab6e945e.tar.gz |
SERVER-43796 Support accumulators with an additional static argument
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); |