summaryrefslogtreecommitdiff
path: root/src/mongo/db/pipeline/expression.cpp
diff options
context:
space:
mode:
authorCharlie Swanson <charlie.swanson@mongodb.com>2015-05-28 14:36:42 -0400
committerCharlie Swanson <charlie.swanson@mongodb.com>2015-06-15 13:29:53 -0400
commit5717454bc3c50c9ac985dcb77639f2710dfda8e4 (patch)
treeecf84f9be86e8346c732d8b613ebe7270ad7b941 /src/mongo/db/pipeline/expression.cpp
parentba6a3b8e5075f8dec1c8d3dadee6c91b7c7dc112 (diff)
downloadmongo-5717454bc3c50c9ac985dcb77639f2710dfda8e4.tar.gz
SERVER-14872: Aggregation expression to concatenate multiple arrays into one
Diffstat (limited to 'src/mongo/db/pipeline/expression.cpp')
-rw-r--r--src/mongo/db/pipeline/expression.cpp27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/mongo/db/pipeline/expression.cpp b/src/mongo/db/pipeline/expression.cpp
index f409bf107bb..8c266d22158 100644
--- a/src/mongo/db/pipeline/expression.cpp
+++ b/src/mongo/db/pipeline/expression.cpp
@@ -748,6 +748,33 @@ namespace {
return "$concat";
}
+ /* ------------------------- ExpressionConcatArrays ----------------------------- */
+
+ Value ExpressionConcatArrays::evaluateInternal(Variables* vars) const {
+ const size_t n = vpOperand.size();
+ vector<Value> values;
+
+ for (size_t i = 0; i < n; ++i) {
+ Value val = vpOperand[i]->evaluateInternal(vars);
+ if (val.nullish()) {
+ return Value(BSONNULL);
+ }
+
+ uassert(28664, str::stream() << "$concatArrays only supports arrays, not "
+ << typeName(val.getType()),
+ val.getType() == Array);
+
+ const auto& subValues = val.getArray();
+ values.insert(values.end(), subValues.begin(), subValues.end());
+ }
+ return Value(std::move(values));
+ }
+
+ REGISTER_EXPRESSION("$concatArrays", ExpressionConcatArrays::parse);
+ const char* ExpressionConcatArrays::getOpName() const {
+ return "$concatArrays";
+ }
+
/* ----------------------- ExpressionCond ------------------------------ */
Value ExpressionCond::evaluateInternal(Variables* vars) const {