PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
query_builder.h
Go to the documentation of this file.
1
12#ifndef QUERY_SCU_QUERY_BUILDER_HPP
13#define QUERY_SCU_QUERY_BUILDER_HPP
14
19
20#include <string>
21#include <string_view>
22
23namespace query_scu {
24
43public:
45
46 query_builder() = default;
47
54 level_ = lvl;
55 return *this;
56 }
57
58 // =========================================================================
59 // Patient Level Attributes
60 // =========================================================================
61
66 query_builder& patient_name(std::string_view name) {
68 return *this;
69 }
70
75 query_builder& patient_id(std::string_view id) {
76 patient_id_ = id;
77 return *this;
78 }
79
84 query_builder& patient_birth_date(std::string_view date) {
86 return *this;
87 }
88
93 query_builder& patient_sex(std::string_view sex) {
94 patient_sex_ = sex;
95 return *this;
96 }
97
98 // =========================================================================
99 // Study Level Attributes
100 // =========================================================================
101
106 query_builder& study_date(std::string_view date) {
107 study_date_ = date;
108 return *this;
109 }
110
115 query_builder& study_time(std::string_view time) {
116 study_time_ = time;
117 return *this;
118 }
119
124 query_builder& accession_number(std::string_view accession) {
125 accession_number_ = accession;
126 return *this;
127 }
128
135 return *this;
136 }
137
142 query_builder& study_id(std::string_view id) {
143 study_id_ = id;
144 return *this;
145 }
146
151 query_builder& study_description(std::string_view desc) {
152 study_description_ = desc;
153 return *this;
154 }
155
156 // =========================================================================
157 // Series Level Attributes
158 // =========================================================================
159
164 query_builder& modality(std::string_view mod) {
165 modality_ = mod;
166 return *this;
167 }
168
175 return *this;
176 }
177
182 query_builder& series_number(std::string_view num) {
183 series_number_ = num;
184 return *this;
185 }
186
191 query_builder& series_description(std::string_view desc) {
192 series_description_ = desc;
193 return *this;
194 }
195
196 // =========================================================================
197 // Instance Level Attributes
198 // =========================================================================
199
204 query_builder& sop_instance_uid(std::string_view uid) {
206 return *this;
207 }
208
213 query_builder& instance_number(std::string_view num) {
214 instance_number_ = num;
215 return *this;
216 }
217
218 // =========================================================================
219 // Build
220 // =========================================================================
221
227 using namespace kcenon::pacs::core;
228 using namespace kcenon::pacs::encoding;
229
230 dicom_dataset ds;
231
232 // Set Query/Retrieve Level (required)
233 ds.set_string(tags::query_retrieve_level, vr_type::CS,
235
236 // Add return keys and search criteria based on level
237 switch (level_) {
238 case query_level::patient:
240 break;
241 case query_level::study:
243 add_study_keys(ds);
244 break;
245 case query_level::series:
247 add_study_keys(ds);
248 add_series_keys(ds);
249 break;
250 case query_level::image:
252 add_study_keys(ds);
253 add_series_keys(ds);
255 break;
256 }
257
258 return ds;
259 }
260
261private:
263 using namespace kcenon::pacs::core;
264 using namespace kcenon::pacs::encoding;
265
266 // Patient Name - always include as return key
267 ds.set_string(tags::patient_name, vr_type::PN, patient_name_);
268
269 // Patient ID
270 ds.set_string(tags::patient_id, vr_type::LO, patient_id_);
271
272 // Patient Birth Date
273 if (!patient_birth_date_.empty()) {
274 ds.set_string(tags::patient_birth_date, vr_type::DA, patient_birth_date_);
275 } else {
276 ds.set_string(tags::patient_birth_date, vr_type::DA, "");
277 }
278
279 // Patient Sex
280 if (!patient_sex_.empty()) {
281 ds.set_string(tags::patient_sex, vr_type::CS, patient_sex_);
282 } else {
283 ds.set_string(tags::patient_sex, vr_type::CS, "");
284 }
285 }
286
288 using namespace kcenon::pacs::core;
289 using namespace kcenon::pacs::encoding;
290
291 // Study Instance UID - required for Study level
292 ds.set_string(tags::study_instance_uid, vr_type::UI, study_instance_uid_);
293
294 // Study Date
295 ds.set_string(tags::study_date, vr_type::DA, study_date_);
296
297 // Study Time
298 if (!study_time_.empty()) {
299 ds.set_string(tags::study_time, vr_type::TM, study_time_);
300 } else {
301 ds.set_string(tags::study_time, vr_type::TM, "");
302 }
303
304 // Accession Number
305 ds.set_string(tags::accession_number, vr_type::SH, accession_number_);
306
307 // Study ID
308 if (!study_id_.empty()) {
309 ds.set_string(tags::study_id, vr_type::SH, study_id_);
310 } else {
311 ds.set_string(tags::study_id, vr_type::SH, "");
312 }
313
314 // Study Description
315 ds.set_string(tags::study_description, vr_type::LO, study_description_);
316
317 // Referring Physician's Name (return key)
318 ds.set_string(tags::referring_physician_name, vr_type::PN, "");
319
320 // Number of Study Related Series (return key)
321 ds.set_string(tags::number_of_study_related_series, vr_type::IS, "");
322
323 // Number of Study Related Instances (return key)
324 ds.set_string(tags::number_of_study_related_instances, vr_type::IS, "");
325
326 // Modalities in Study (return key)
327 ds.set_string(tags::modalities_in_study, vr_type::CS, modality_);
328 }
329
331 using namespace kcenon::pacs::core;
332 using namespace kcenon::pacs::encoding;
333
334 // Series Instance UID - required for Series level
335 ds.set_string(tags::series_instance_uid, vr_type::UI, series_instance_uid_);
336
337 // Modality
338 ds.set_string(tags::modality, vr_type::CS, modality_);
339
340 // Series Number
341 if (!series_number_.empty()) {
342 ds.set_string(tags::series_number, vr_type::IS, series_number_);
343 } else {
344 ds.set_string(tags::series_number, vr_type::IS, "");
345 }
346
347 // Series Description
348 ds.set_string(tags::series_description, vr_type::LO, series_description_);
349
350 // Number of Series Related Instances (return key)
351 ds.set_string(tags::number_of_series_related_instances, vr_type::IS, "");
352 }
353
355 using namespace kcenon::pacs::core;
356 using namespace kcenon::pacs::encoding;
357
358 // SOP Instance UID - required for Instance level
359 ds.set_string(tags::sop_instance_uid, vr_type::UI, sop_instance_uid_);
360
361 // SOP Class UID (return key)
362 ds.set_string(tags::sop_class_uid, vr_type::UI, "");
363
364 // Instance Number
365 if (!instance_number_.empty()) {
366 ds.set_string(tags::instance_number, vr_type::IS, instance_number_);
367 } else {
368 ds.set_string(tags::instance_number, vr_type::IS, "");
369 }
370 }
371
372 // Query level
373 query_level level_{query_level::study};
374
375 // Patient level
376 std::string patient_name_;
377 std::string patient_id_;
379 std::string patient_sex_;
380
381 // Study level
382 std::string study_date_;
383 std::string study_time_;
384 std::string accession_number_;
386 std::string study_id_;
388
389 // Series level
390 std::string modality_;
392 std::string series_number_;
394
395 // Instance level
396 std::string sop_instance_uid_;
397 std::string instance_number_;
398};
399
400} // namespace query_scu
401
402#endif // QUERY_SCU_QUERY_BUILDER_HPP
void set_string(dicom_tag tag, encoding::vr_type vr, std::string_view value)
Set a string value for the given tag.
query_builder & modality(std::string_view mod)
Set modality criteria.
query_builder & patient_birth_date(std::string_view date)
Set patient birth date criteria.
void add_instance_keys(kcenon::pacs::core::dicom_dataset &ds) const
query_builder & study_date(std::string_view date)
Set study date criteria (supports ranges)
query_builder & study_instance_uid(std::string_view uid)
Set study instance UID criteria.
void add_study_keys(kcenon::pacs::core::dicom_dataset &ds) const
query_builder & study_id(std::string_view id)
Set study ID criteria.
void add_series_keys(kcenon::pacs::core::dicom_dataset &ds) const
query_builder & sop_instance_uid(std::string_view uid)
Set SOP instance UID criteria.
query_builder & patient_sex(std::string_view sex)
Set patient sex criteria.
query_builder & series_number(std::string_view num)
Set series number criteria.
query_builder & patient_name(std::string_view name)
Set patient name search criteria (supports wildcards)
query_builder & series_instance_uid(std::string_view uid)
Set series instance UID criteria.
query_builder & accession_number(std::string_view accession)
Set accession number criteria.
query_builder & patient_id(std::string_view id)
Set patient ID search criteria.
kcenon::pacs::core::dicom_dataset build() const
Build the query dataset.
query_builder & study_description(std::string_view desc)
Set study description criteria.
query_builder & study_time(std::string_view time)
Set study time criteria.
query_builder & series_description(std::string_view desc)
Set series description criteria.
query_builder & instance_number(std::string_view num)
Set instance number criteria.
query_builder & level(query_level lvl)
Set the query/retrieve level.
void add_patient_keys(kcenon::pacs::core::dicom_dataset &ds) const
DICOM Dataset - ordered collection of Data Elements.
Compile-time constants for commonly used DICOM tags.
auto to_string(mpps_status status) -> std::string_view
Convert mpps_status to DICOM string representation.
Definition mpps_scp.h:60
query_level
DICOM Query/Retrieve level enumeration.
Definition query_scp.h:63
DICOM Query SCP service (C-FIND handler)
std::string_view uid
std::string_view name