diff --git a/src/facade/reply_capture.cc b/src/facade/reply_capture.cc index 363879312..9a03d6039 100644 --- a/src/facade/reply_capture.cc +++ b/src/facade/reply_capture.cc @@ -81,24 +81,24 @@ void CapturingReplyBuilder::SendDirect(Payload&& val) { } } -void CapturingReplyBuilder::Capture(Payload val) { +void CapturingReplyBuilder::Capture(Payload val, bool collapse_if_needed) { if (!stack_.empty()) { - stack_.top().first->arr.push_back(std::move(val)); - stack_.top().second--; + auto& last = stack_.top(); + last.first->arr.push_back(std::move(val)); + if (collapse_if_needed && last.second-- == 1) { + CollapseFilledCollections(); + } } else { DCHECK_EQ(current_.index(), 0u); current_ = std::move(val); } - - // Check if we filled up a collection. - CollapseFilledCollections(); } void CapturingReplyBuilder::CollapseFilledCollections() { while (!stack_.empty() && stack_.top().second == 0) { auto pl = std::move(stack_.top()); stack_.pop(); - Capture(std::move(pl.first)); + Capture(std::move(pl.first), false); } } diff --git a/src/facade/reply_capture.h b/src/facade/reply_capture.h index 771299235..2820f028c 100644 --- a/src/facade/reply_capture.h +++ b/src/facade/reply_capture.h @@ -79,7 +79,7 @@ class CapturingReplyBuilder : public RedisReplyBuilder { void SendDirect(Payload&& val); // Capture value and store eiter in current topmost collection or as a standalone value. - void Capture(Payload val); + void Capture(Payload val, bool collapse_if_needed = true); // While topmost collection in stack is full, finalize it and add it as a regular value. void CollapseFilledCollections();