diff --git a/db/view/view.cc b/db/view/view.cc index 54001d0a81..0d41535c9e 100644 --- a/db/view/view.cc +++ b/db/view/view.cc @@ -145,6 +145,34 @@ void view::set_base_non_pk_column_in_view_pk(const ::schema& base) { _base_non_pk_column_in_view_pk = nullptr; } +class view_updates final { + lw_shared_ptr _view; + schema_ptr _base; + std::unordered_map _updates; +public: + explicit view_updates(lw_shared_ptr view, schema_ptr base) + : _view(std::move(view)) + , _base(std::move(base)) + , _updates(8, partition_key::hashing(*_base), partition_key::equality(*_base)) { + } + + void move_to(std::vector& mutations) && { + auto& partitioner = dht::global_partitioner(); + std::transform(_updates.begin(), _updates.end(), std::back_inserter(mutations), [&, this] (auto&& m) { + return mutation(_view->schema(), partitioner.decorate_key(*_base, std::move(m.first)), std::move(m.second)); + }); + } + +private: + mutation_partition& partition_for(partition_key&& key) { + auto it = _updates.find(key); + if (it != _updates.end()) { + return it->second; + } + return _updates.emplace(std::move(key), mutation_partition(_view->schema())).first->second; + } +}; + } // namespace view } // namespace db