summaryrefslogtreecommitdiff
path: root/src/mongo/db/pipeline/accumulator.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/pipeline/accumulator.h')
-rw-r--r--src/mongo/db/pipeline/accumulator.h18
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);