diff options
Diffstat (limited to 'src/mongo/db/exec/sbe/expressions')
| -rw-r--r-- | src/mongo/db/exec/sbe/expressions/expression.cpp | 14 | ||||
| -rw-r--r-- | src/mongo/db/exec/sbe/expressions/expression.h | 46 | ||||
| -rw-r--r-- | src/mongo/db/exec/sbe/expressions/sbe_set_expressions_test.cpp | 30 |
3 files changed, 13 insertions, 77 deletions
diff --git a/src/mongo/db/exec/sbe/expressions/expression.cpp b/src/mongo/db/exec/sbe/expressions/expression.cpp index 65421e8b373..3a2b20a4657 100644 --- a/src/mongo/db/exec/sbe/expressions/expression.cpp +++ b/src/mongo/db/exec/sbe/expressions/expression.cpp @@ -429,8 +429,6 @@ static stdx::unordered_map<std::string, BuiltinFn> kBuiltinFunctions = { BuiltinFn{[](size_t n) { return n > 0; }, vm::Builtin::doubleDoubleSum, false}}, {"aggDoubleDoubleSum", BuiltinFn{[](size_t n) { return n == 1; }, vm::Builtin::aggDoubleDoubleSum, true}}, - {"aggMergeDoubleDoubleSums", - BuiltinFn{[](size_t n) { return n == 1; }, vm::Builtin::aggMergeDoubleDoubleSums, true}}, {"doubleDoubleSumFinalize", BuiltinFn{[](size_t n) { return n > 0; }, vm::Builtin::doubleDoubleSumFinalize, false}}, {"doubleDoubleMergeSumFinalize", @@ -438,8 +436,6 @@ static stdx::unordered_map<std::string, BuiltinFn> kBuiltinFunctions = { {"doubleDoublePartialSumFinalize", BuiltinFn{[](size_t n) { return n > 0; }, vm::Builtin::doubleDoublePartialSumFinalize, false}}, {"aggStdDev", BuiltinFn{[](size_t n) { return n == 1; }, vm::Builtin::aggStdDev, true}}, - {"aggMergeStdDevs", - BuiltinFn{[](size_t n) { return n == 1; }, vm::Builtin::aggMergeStdDevs, true}}, {"stdDevPopFinalize", BuiltinFn{[](size_t n) { return n == 1; }, vm::Builtin::stdDevPopFinalize, false}}, {"stdDevSampFinalize", @@ -471,10 +467,7 @@ static stdx::unordered_map<std::string, BuiltinFn> kBuiltinFunctions = { {"tan", BuiltinFn{[](size_t n) { return n == 1; }, vm::Builtin::tan, false}}, {"tanh", BuiltinFn{[](size_t n) { return n == 1; }, vm::Builtin::tanh, false}}, {"round", BuiltinFn{[](size_t n) { return n == 1; }, vm::Builtin::round, false}}, - {"concat", BuiltinFn{kAnyNumberOfArgs, vm::Builtin::concat, false}}, - {"concatArrays", BuiltinFn{kAnyNumberOfArgs, vm::Builtin::concatArrays, false}}, - {"aggConcatArraysCapped", - BuiltinFn{[](size_t n) { return n == 2; }, vm::Builtin::aggConcatArraysCapped, true}}, + {"concat", BuiltinFn{[](size_t n) { return n > 0; }, vm::Builtin::concat, false}}, {"isMember", BuiltinFn{[](size_t n) { return n == 2; }, vm::Builtin::isMember, false}}, {"collIsMember", BuiltinFn{[](size_t n) { return n == 3; }, vm::Builtin::collIsMember, false}}, {"indexOfBytes", @@ -493,11 +486,6 @@ static stdx::unordered_map<std::string, BuiltinFn> kBuiltinFunctions = { BuiltinFn{[](size_t n) { return n >= 1; }, vm::Builtin::collSetIntersection, false}}, {"collSetDifference", BuiltinFn{[](size_t n) { return n == 3; }, vm::Builtin::collSetDifference, false}}, - {"aggSetUnion", BuiltinFn{[](size_t n) { return n == 1; }, vm::Builtin::aggSetUnion, true}}, - {"aggSetUnionCapped", - BuiltinFn{[](size_t n) { return n == 2; }, vm::Builtin::aggSetUnionCapped, true}}, - {"aggCollSetUnionCapped", - BuiltinFn{[](size_t n) { return n == 3; }, vm::Builtin::aggCollSetUnionCapped, true}}, {"runJsPredicate", BuiltinFn{[](size_t n) { return n == 2; }, vm::Builtin::runJsPredicate, false}}, {"regexCompile", BuiltinFn{[](size_t n) { return n == 2; }, vm::Builtin::regexCompile, false}}, diff --git a/src/mongo/db/exec/sbe/expressions/expression.h b/src/mongo/db/exec/sbe/expressions/expression.h index d5a2c0fdf0e..2b9032f257b 100644 --- a/src/mongo/db/exec/sbe/expressions/expression.h +++ b/src/mongo/db/exec/sbe/expressions/expression.h @@ -348,8 +348,6 @@ private: std::string toString() const; }; -using SlotExprPairVector = std::vector<std::pair<value::SlotId, std::unique_ptr<EExpression>>>; - template <typename T, typename... Args> inline std::unique_ptr<EExpression> makeE(Args&&... args) { return std::make_unique<T>(std::forward<Args>(args)...); @@ -366,30 +364,20 @@ inline auto makeEs(Ts&&... pack) { namespace detail { // base case -template <typename R> -inline void makeSlotExprPairHelper(R& result, - value::SlotId slot, - std::unique_ptr<EExpression> expr) { - if constexpr (std::is_same_v<R, value::SlotMap<std::unique_ptr<EExpression>>>) { - result.emplace(slot, std::move(expr)); - } else { - result.push_back({slot, std::move(expr)}); - } +inline void makeEM_unwind(value::SlotMap<std::unique_ptr<EExpression>>& result, + value::SlotId slot, + std::unique_ptr<EExpression> expr) { + result.emplace(slot, std::move(expr)); } // recursive case -template <typename R, typename... Ts> -inline void makeSlotExprPairHelper(R& result, - value::SlotId slot, - std::unique_ptr<EExpression> expr, - Ts&&... rest) { - if constexpr (std::is_same_v<R, value::SlotMap<std::unique_ptr<EExpression>>>) { - result.emplace(slot, std::move(expr)); - } else { - static_assert(std::is_same_v<R, SlotExprPairVector>); - result.push_back({slot, std::move(expr)}); - } - makeSlotExprPairHelper(result, std::forward<Ts>(rest)...); +template <typename... Ts> +inline void makeEM_unwind(value::SlotMap<std::unique_ptr<EExpression>>& result, + value::SlotId slot, + std::unique_ptr<EExpression> expr, + Ts&&... rest) { + result.emplace(slot, std::move(expr)); + makeEM_unwind(result, std::forward<Ts>(rest)...); } } // namespace detail @@ -398,7 +386,7 @@ auto makeEM(Ts&&... pack) { value::SlotMap<std::unique_ptr<EExpression>> result; if constexpr (sizeof...(pack) > 0) { result.reserve(sizeof...(Ts) / 2); - detail::makeSlotExprPairHelper(result, std::forward<Ts>(pack)...); + detail::makeEM_unwind(result, std::forward<Ts>(pack)...); } return result; } @@ -411,16 +399,6 @@ auto makeSV(Args&&... args) { return v; } -template <typename... Ts> -auto makeSlotExprPairVec(Ts&&... pack) { - SlotExprPairVector v; - if constexpr (sizeof...(pack) > 0) { - v.reserve(sizeof...(Ts) / 2); - detail::makeSlotExprPairHelper(v, std::forward<Ts>(pack)...); - } - return v; -} - /** * This is a constant expression. It assumes the ownership of the input constant. */ diff --git a/src/mongo/db/exec/sbe/expressions/sbe_set_expressions_test.cpp b/src/mongo/db/exec/sbe/expressions/sbe_set_expressions_test.cpp index 279f7a287b4..30eb61a7b2d 100644 --- a/src/mongo/db/exec/sbe/expressions/sbe_set_expressions_test.cpp +++ b/src/mongo/db/exec/sbe/expressions/sbe_set_expressions_test.cpp @@ -28,7 +28,6 @@ */ #include "mongo/db/exec/sbe/expression_test_base.h" -#include "mongo/db/query/sbe_stage_builder_helpers.h" namespace mongo::sbe { @@ -94,35 +93,6 @@ TEST_F(SBEBuiltinSetOpTest, ReturnsNothingSetUnion) { runAndAssertNothing(compiledExpr.get()); } -TEST_F(SBEBuiltinSetOpTest, AggSetUnion) { - value::OwnedValueAccessor aggAccessor, inputAccessor; - auto inputSlot = bindAccessor(&inputAccessor); - auto setUnionExpr = - stage_builder::makeFunction("aggSetUnion", stage_builder::makeVariable(inputSlot)); - auto compiledExpr = compileAggExpression(*setUnionExpr, &aggAccessor); - - auto [arrTag1, arrVal1] = makeArray(BSON_ARRAY(1 << 2)); - inputAccessor.reset(arrTag1, arrVal1); - auto [resTag1, resVal1] = makeArraySet(BSON_ARRAY(1 << 2)); - runAndAssertExpression(compiledExpr.get(), {resTag1, resVal1}); - aggAccessor.reset(resTag1, resVal1); - - auto [arrTag2, arrVal2] = makeArraySet(BSON_ARRAY(1 << 3 << 2 << 6)); - inputAccessor.reset(arrTag2, arrVal2); - auto [resTag2, resVal2] = makeArraySet(BSON_ARRAY(1 << 2 << 3 << 6)); - runAndAssertExpression(compiledExpr.get(), {resTag2, resVal2}); - aggAccessor.reset(resTag2, resVal2); - - auto [arrTag3, arrVal3] = makeArray(BSONArray{}); - inputAccessor.reset(arrTag3, arrVal3); - auto [resTag3, resVal3] = makeArraySet(BSON_ARRAY(1 << 2 << 3 << 6)); - runAndAssertExpression(compiledExpr.get(), {resTag3, resVal3}); - aggAccessor.reset(resTag3, resVal3); - - inputAccessor.reset(value::TypeTags::Nothing, 0); - runAndAssertNothing(compiledExpr.get()); -} - TEST_F(SBEBuiltinSetOpTest, ComputesSetIntersection) { value::OwnedValueAccessor slotAccessor1, slotAccessor2; auto arrSlot1 = bindAccessor(&slotAccessor1); |
