PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
streaming_query_handler.cpp
Go to the documentation of this file.
1// BSD 3-Clause License
2// Copyright (c) 2021-2025, 🍀☀🌕🌥 🌊
3// See the LICENSE file in the project root for full license information.
4
11
12#ifdef PACS_WITH_DATABASE_SYSTEM
13
15
16namespace kcenon::pacs::services {
17
18// =============================================================================
19// Construction
20// =============================================================================
21
22streaming_query_handler::streaming_query_handler(storage::index_database* db)
23 : db_(db) {}
24
25// =============================================================================
26// Configuration
27// =============================================================================
28
29void streaming_query_handler::set_page_size(size_t size) noexcept {
30 page_size_ = size;
31}
32
33auto streaming_query_handler::page_size() const noexcept -> size_t {
34 return page_size_;
35}
36
37void streaming_query_handler::set_max_results(size_t max) noexcept {
38 max_results_ = max;
39}
40
41auto streaming_query_handler::max_results() const noexcept -> size_t {
42 return max_results_;
43}
44
45// =============================================================================
46// Stream Operations
47// =============================================================================
48
49auto streaming_query_handler::create_stream(query_level level,
50 const core::dicom_dataset& query_keys,
51 [[maybe_unused]] const std::string& calling_ae)
52 -> StreamResult {
53 stream_config config;
54 config.page_size = page_size_;
55
56 return query_result_stream::create(db_, level, query_keys, config);
57}
58
59auto streaming_query_handler::resume_stream(const std::string& cursor_state,
60 query_level level,
61 const core::dicom_dataset& query_keys)
62 -> StreamResult {
63 stream_config config;
64 config.page_size = page_size_;
65
66 return query_result_stream::from_cursor(db_, cursor_state, level, query_keys, config);
67}
68
69// =============================================================================
70// Compatibility Adapter
71// =============================================================================
72
73auto streaming_query_handler::as_query_handler() -> query_handler {
74 // Capture necessary state for the lambda
75 auto* db = db_;
76 auto page_size = page_size_;
77 auto max_results = max_results_;
78
79 return [db, page_size, max_results](query_level level,
80 const core::dicom_dataset& query_keys,
81 [[maybe_unused]] const std::string& calling_ae)
82 -> std::vector<core::dicom_dataset> {
83 stream_config config;
84 config.page_size = page_size;
85
86 auto stream_result = query_result_stream::create(db, level, query_keys, config);
87 if (stream_result.is_err()) {
88 // Return empty results on error
89 return {};
90 }
91
92 auto stream = std::move(stream_result.value());
93 std::vector<core::dicom_dataset> results;
94
95 // Collect all results from the stream
96 while (stream->has_more()) {
97 auto batch = stream->next_batch();
98 if (!batch.has_value()) {
99 break;
100 }
101
102 for (auto& ds : batch.value()) {
103 results.push_back(std::move(ds));
104
105 // Check max results limit
106 if (max_results > 0 && results.size() >= max_results) {
107 return results;
108 }
109 }
110 }
111
112 return results;
113 };
114}
115
116} // namespace kcenon::pacs::services
117
118#endif // PACS_WITH_DATABASE_SYSTEM
PACS index database for metadata storage and retrieval.
std::function< std::vector< core::dicom_dataset >( query_level level, const core::dicom_dataset &query_keys, const std::string &calling_ae)> query_handler
Query handler function type.
Definition query_scp.h:113
Streaming query handler for memory-efficient C-FIND processing.