summaryrefslogtreecommitdiff
path: root/src/mongo/db/pipeline/document_source_group.cpp
diff options
context:
space:
mode:
authorArun Banala <arun.banala@mongodb.com>2019-05-29 11:36:58 +0100
committerArun Banala <arun.banala@mongodb.com>2019-06-11 17:31:47 +0100
commit17cdb38b6db716dc47485a60ddff3c543e713e3d (patch)
tree71e9397c86220a4084da28d195563af3b3831507 /src/mongo/db/pipeline/document_source_group.cpp
parent38d00f12ec33b6c646ed50cac7b129d2a1566321 (diff)
downloadmongo-17cdb38b6db716dc47485a60ddff3c543e713e3d.tar.gz
SERVER-41065 Make evaluate() thread safe by passing 'Variables' as a parameter
Diffstat (limited to 'src/mongo/db/pipeline/document_source_group.cpp')
-rw-r--r--src/mongo/db/pipeline/document_source_group.cpp11
1 files changed, 6 insertions, 5 deletions
diff --git a/src/mongo/db/pipeline/document_source_group.cpp b/src/mongo/db/pipeline/document_source_group.cpp
index dd14584ecc9..ff46f44aba4 100644
--- a/src/mongo/db/pipeline/document_source_group.cpp
+++ b/src/mongo/db/pipeline/document_source_group.cpp
@@ -73,7 +73,7 @@ Document GroupFromFirstDocumentTransformation::applyTransformation(const Documen
MutableDocument output(_accumulatorExprs.size());
for (auto&& expr : _accumulatorExprs) {
- auto value = expr.second->evaluate(input);
+ auto value = expr.second->evaluate(input, &expr.second->getExpressionContext()->variables);
output.addField(expr.first, value.missing() ? Value(BSONNULL) : value);
}
@@ -495,8 +495,9 @@ DocumentSource::GetNextResult DocumentSourceGroup::initialize() {
dassert(numAccumulators == group.size());
for (size_t i = 0; i < numAccumulators; i++) {
- group[i]->process(_accumulatedFields[i].expression->evaluate(rootDocument),
- _doingMerge);
+ group[i]->process(
+ _accumulatedFields[i].expression->evaluate(rootDocument, &pExpCtx->variables),
+ _doingMerge);
_memoryUsageBytes += group[i]->memUsageForSorter();
}
@@ -611,7 +612,7 @@ shared_ptr<Sorter<Value, Value>::Iterator> DocumentSourceGroup::spill() {
Value DocumentSourceGroup::computeId(const Document& root) {
// If only one expression, return result directly
if (_idExpressions.size() == 1) {
- Value retValue = _idExpressions[0]->evaluate(root);
+ Value retValue = _idExpressions[0]->evaluate(root, &pExpCtx->variables);
return retValue.missing() ? Value(BSONNULL) : std::move(retValue);
}
@@ -619,7 +620,7 @@ Value DocumentSourceGroup::computeId(const Document& root) {
vector<Value> vals;
vals.reserve(_idExpressions.size());
for (size_t i = 0; i < _idExpressions.size(); i++) {
- vals.push_back(_idExpressions[i]->evaluate(root));
+ vals.push_back(_idExpressions[i]->evaluate(root, &pExpCtx->variables));
}
return Value(std::move(vals));
}