PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
query_result_stream.h
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
23#pragma once
24
31
32#include <kcenon/common/patterns/result.h>
33
34#include <cstddef>
35#include <memory>
36#include <optional>
37#include <string>
38#include <variant>
39#include <vector>
40
41// Include database_cursor only when PACS_WITH_DATABASE_SYSTEM is defined
42// IMPORTANT: Must be outside namespace to avoid polluting kcenon::pacs::services with std
43#ifdef PACS_WITH_DATABASE_SYSTEM
44#include "database_cursor.h"
45#endif
46
47namespace kcenon::pacs::storage {
48class index_database;
49} // namespace kcenon::pacs::storage
50
51namespace kcenon::pacs::services {
52
54template <typename T>
56
58using VoidResult = kcenon::common::VoidResult;
59
65 size_t page_size = 100;
66
68 bool include_total_count = false;
69};
70
71#ifdef PACS_WITH_DATABASE_SYSTEM
72
108class query_result_stream {
109public:
113 ~query_result_stream() = default;
114
115 // Non-copyable
116 query_result_stream(const query_result_stream&) = delete;
117 auto operator=(const query_result_stream&) -> query_result_stream& = delete;
118
119 // Movable
120 query_result_stream(query_result_stream&&) noexcept = default;
121 auto operator=(query_result_stream&&) noexcept -> query_result_stream& = default;
122
123 // =========================================================================
124 // Factory Methods
125 // =========================================================================
126
136 [[nodiscard]] static auto create(storage::index_database* db, query_level level,
137 const core::dicom_dataset& query_keys,
138 const stream_config& config = {})
139 -> Result<std::unique_ptr<query_result_stream>>;
140
153 [[nodiscard]] static auto from_cursor(storage::index_database* db,
154 const std::string& cursor_state,
155 query_level level,
156 const core::dicom_dataset& query_keys,
157 const stream_config& config = {})
158 -> Result<std::unique_ptr<query_result_stream>>;
159
160 // =========================================================================
161 // Stream Operations
162 // =========================================================================
163
169 [[nodiscard]] auto has_more() const noexcept -> bool;
170
178 [[nodiscard]] auto next_batch() -> std::optional<std::vector<core::dicom_dataset>>;
179
188 [[nodiscard]] auto total_count() const -> std::optional<size_t>;
189
195 [[nodiscard]] auto position() const noexcept -> size_t;
196
202 [[nodiscard]] auto level() const noexcept -> query_level;
203
204 // =========================================================================
205 // Cursor State
206 // =========================================================================
207
216 [[nodiscard]] auto cursor() const -> std::string;
217
218private:
222 query_result_stream(std::unique_ptr<database_cursor> cursor, query_level level,
223 const core::dicom_dataset& query_keys, stream_config config);
224
228 [[nodiscard]] auto patient_to_dataset(const storage::patient_record& record) const
229 -> core::dicom_dataset;
230
234 [[nodiscard]] auto study_to_dataset(const storage::study_record& record) const
235 -> core::dicom_dataset;
236
240 [[nodiscard]] auto series_to_dataset(const storage::series_record& record) const
241 -> core::dicom_dataset;
242
246 [[nodiscard]] auto instance_to_dataset(const storage::instance_record& record) const
247 -> core::dicom_dataset;
248
252 [[nodiscard]] auto record_to_dataset(const query_record& record) const
253 -> core::dicom_dataset;
254
258 [[nodiscard]] static auto extract_patient_query(const core::dicom_dataset& keys)
259 -> storage::patient_query;
260
264 [[nodiscard]] static auto extract_study_query(const core::dicom_dataset& keys)
265 -> storage::study_query;
266
270 [[nodiscard]] static auto extract_series_query(const core::dicom_dataset& keys)
271 -> storage::series_query;
272
276 [[nodiscard]] static auto extract_instance_query(const core::dicom_dataset& keys)
277 -> storage::instance_query;
278
280 std::unique_ptr<database_cursor> cursor_;
281
283 query_level level_;
284
286 core::dicom_dataset query_keys_;
287
289 stream_config config_;
290
292 mutable std::optional<size_t> total_count_;
293};
294
295#endif // PACS_WITH_DATABASE_SYSTEM
296
297} // namespace kcenon::pacs::services
Database cursor for streaming query results.
DICOM Dataset - ordered collection of Data Elements.
Instance record data structures for database operations.
kcenon::common::Result< T > Result
Result type alias for operations returning a value.
query_level
DICOM Query/Retrieve level enumeration.
Definition query_scp.h:63
Patient record data structures for database operations.
DICOM Query SCP service (C-FIND handler)
Series record data structures for database operations.
Configuration for query result streaming.
bool include_total_count
Whether to include total count (may be expensive for large datasets)
size_t page_size
Default page size for batched fetching.
Study record data structures for database operations.