diff --git a/alternator/executor.cc b/alternator/executor.cc index 85a138232c..3205bc06ff 100644 --- a/alternator/executor.cc +++ b/alternator/executor.cc @@ -2369,21 +2369,22 @@ std::optional executor::describe_single_item(schema_ptr schema, return item; } -std::vector executor::describe_multi_item(schema_ptr schema, - const query::partition_slice& slice, - const cql3::selection::selection& selection, - const query::result& query_result, - const std::optional& attrs_to_get) { - cql3::selection::result_set_builder builder(selection, gc_clock::now()); - query::result_view::consume(query_result, slice, cql3::selection::result_set_builder::visitor(builder, *schema, selection)); +future> executor::describe_multi_item(schema_ptr schema, + const query::partition_slice&& slice, + shared_ptr selection, + foreign_ptr> query_result, + shared_ptr> attrs_to_get) { + cql3::selection::result_set_builder builder(*selection, gc_clock::now()); + query::result_view::consume(*query_result, slice, cql3::selection::result_set_builder::visitor(builder, *schema, *selection)); auto result_set = builder.build(); std::vector ret; for (auto& result_row : result_set->rows()) { rjson::value item = rjson::empty_object(); - describe_single_item(selection, result_row, attrs_to_get, item); + describe_single_item(*selection, result_row, *attrs_to_get, item); ret.push_back(std::move(item)); + co_await coroutine::maybe_yield(); } - return ret; + co_return ret; } static bool check_needs_read_before_write(const parsed::value& v) { @@ -3255,8 +3256,7 @@ future executor::batch_get_item(client_state& cli service::storage_proxy::coordinator_query_options(executor::default_timeout(), permit, client_state, trace_state)).then( [schema = rs.schema, partition_slice = std::move(partition_slice), selection = std::move(selection), attrs_to_get = rs.attrs_to_get] (service::storage_proxy::coordinator_query_result qr) mutable { utils::get_local_injector().inject("alternator_batch_get_item", [] { throw std::runtime_error("batch_get_item injection"); }); - std::vector jsons = describe_multi_item(schema, partition_slice, *selection, *qr.query_result, *attrs_to_get); - return make_ready_future>(std::move(jsons)); + return describe_multi_item(std::move(schema), std::move(partition_slice), std::move(selection), std::move(qr.query_result), std::move(attrs_to_get)); }); response_futures.push_back(std::move(f)); } diff --git a/alternator/executor.hh b/alternator/executor.hh index b4c588ba0d..28b5c63b71 100644 --- a/alternator/executor.hh +++ b/alternator/executor.hh @@ -222,11 +222,11 @@ public: const query::result&, const std::optional&); - static std::vector describe_multi_item(schema_ptr schema, - const query::partition_slice& slice, - const cql3::selection::selection& selection, - const query::result& query_result, - const std::optional& attrs_to_get); + static future> describe_multi_item(schema_ptr schema, + const query::partition_slice&& slice, + shared_ptr selection, + foreign_ptr> query_result, + shared_ptr> attrs_to_get); static void describe_single_item(const cql3::selection::selection&, const std::vector&,