30#include <kcenon/common/patterns/result.h>
53using VoidResult = kcenon::common::VoidResult;
55#ifdef PACS_WITH_DATABASE_SYSTEM
70 std::string calling_ae;
82struct query_execution_result {
90 std::string error_message;
93 std::unique_ptr<query_result_stream> stream;
96 std::chrono::milliseconds execution_time{0};
99 bool cancelled =
false;
102 bool timed_out =
false;
108struct parallel_executor_config {
110 size_t max_concurrent = 4;
113 std::chrono::milliseconds default_timeout{0};
116 size_t page_size = 100;
119 bool enable_priority =
true;
172class parallel_query_executor {
184 explicit parallel_query_executor(storage::index_database* db,
185 const parallel_executor_config& config = {});
192 ~parallel_query_executor();
195 parallel_query_executor(
const parallel_query_executor&) =
delete;
196 auto operator=(
const parallel_query_executor&) -> parallel_query_executor& =
delete;
199 parallel_query_executor(parallel_query_executor&&) noexcept;
200 auto operator=(parallel_query_executor&&) noexcept -> parallel_query_executor&;
211 void set_max_concurrent(
size_t max) noexcept;
218 [[nodiscard]] auto max_concurrent() const noexcept ->
size_t;
225 void set_default_timeout(std::chrono::milliseconds timeout) noexcept;
232 [[nodiscard]] auto default_timeout() const noexcept -> std::chrono::milliseconds;
249 [[nodiscard]] auto execute_all(std::vector<query_request> queries)
250 -> std::vector<query_execution_result>;
266 [[nodiscard]] auto execute_with_timeout(const query_request& query,
267 std::chrono::milliseconds timeout)
268 -> Result<std::unique_ptr<query_result_stream>>;
278 [[nodiscard]] auto execute(const query_request& query)
279 -> Result<std::unique_ptr<query_result_stream>>;
291 void cancel_all() noexcept;
298 [[nodiscard]] auto is_cancelled() const noexcept ->
bool;
305 void reset_cancellation() noexcept;
316 [[nodiscard]] auto queries_executed() const noexcept ->
size_t;
323 [[nodiscard]] auto queries_succeeded() const noexcept ->
size_t;
330 [[nodiscard]] auto queries_failed() const noexcept ->
size_t;
337 [[nodiscard]] auto queries_timed_out() const noexcept ->
size_t;
344 [[nodiscard]] auto queries_in_progress() const noexcept ->
size_t;
349 void reset_statistics() noexcept;
363 [[nodiscard]] auto execute_query_internal(const query_request& query,
364 std::chrono::milliseconds timeout)
365 -> query_execution_result;
373 [[nodiscard]] auto create_stream(const query_request& query)
374 -> Result<std::unique_ptr<query_result_stream>>;
381 storage::index_database* db_;
384 parallel_executor_config config_;
387 std::atomic<
bool> cancelled_{
false};
390 std::atomic<size_t> queries_executed_{0};
391 std::atomic<size_t> queries_succeeded_{0};
392 std::atomic<size_t> queries_failed_{0};
393 std::atomic<size_t> queries_timed_out_{0};
394 std::atomic<size_t> queries_in_progress_{0};
397 mutable std::mutex mutex_;
DICOM Dataset - ordered collection of Data Elements.
query_level
DICOM Query/Retrieve level enumeration.
Streaming query results with pagination support.
DICOM Query SCP service (C-FIND handler)