Mercurial > hg > orthanc
comparison OrthancServer/Sources/Search/ISqlLookupFormatter.cpp @ 5828:7030fa489669 find-refactoring
tools/find: QueryMetadata
author | Alain Mazy <am@orthanc.team> |
---|---|
date | Mon, 07 Oct 2024 15:19:26 +0200 |
parents | 976872a99d39 |
children |
comparison
equal
deleted
inserted
replaced
5827:976872a99d39 | 5828:7030fa489669 |
---|---|
25 #include "ISqlLookupFormatter.h" | 25 #include "ISqlLookupFormatter.h" |
26 | 26 |
27 #include "../../../OrthancFramework/Sources/OrthancException.h" | 27 #include "../../../OrthancFramework/Sources/OrthancException.h" |
28 #include "../../../OrthancFramework/Sources/Toolbox.h" | 28 #include "../../../OrthancFramework/Sources/Toolbox.h" |
29 #include "../Database/FindRequest.h" | 29 #include "../Database/FindRequest.h" |
30 #include "DatabaseConstraint.h" | 30 #include "DatabaseDicomTagConstraint.h" |
31 #include "../Database/MainDicomTagsRegistry.h" | 31 #include "../Database/MainDicomTagsRegistry.h" |
32 | 32 |
33 #include <cassert> | 33 #include <cassert> |
34 #include <boost/lexical_cast.hpp> | 34 #include <boost/lexical_cast.hpp> |
35 #include <list> | 35 #include <list> |
80 } | 80 } |
81 | 81 |
82 | 82 |
83 static bool FormatComparison(std::string& target, | 83 static bool FormatComparison(std::string& target, |
84 ISqlLookupFormatter& formatter, | 84 ISqlLookupFormatter& formatter, |
85 const DatabaseConstraint& constraint, | 85 const IDatabaseConstraint& constraint, |
86 size_t index, | 86 size_t index, |
87 bool escapeBrackets) | 87 bool escapeBrackets) |
88 { | 88 { |
89 std::string tag = "t" + boost::lexical_cast<std::string>(index); | 89 std::string tag = "t" + boost::lexical_cast<std::string>(index); |
90 | 90 |
252 return true; | 252 return true; |
253 } | 253 } |
254 | 254 |
255 | 255 |
256 static void FormatJoin(std::string& target, | 256 static void FormatJoin(std::string& target, |
257 const DatabaseConstraint& constraint, | 257 const DatabaseDicomTagConstraint& constraint, |
258 size_t index) | 258 size_t index) |
259 { | 259 { |
260 std::string tag = "t" + boost::lexical_cast<std::string>(index); | 260 std::string tag = "t" + boost::lexical_cast<std::string>(index); |
261 | 261 |
262 if (constraint.IsMandatory()) | 262 if (constraint.IsMandatory()) |
282 boost::lexical_cast<std::string>(constraint.GetTag().GetGroup()) + | 282 boost::lexical_cast<std::string>(constraint.GetTag().GetGroup()) + |
283 " AND " + tag + ".tagElement = " + | 283 " AND " + tag + ".tagElement = " + |
284 boost::lexical_cast<std::string>(constraint.GetTag().GetElement())); | 284 boost::lexical_cast<std::string>(constraint.GetTag().GetElement())); |
285 } | 285 } |
286 | 286 |
287 static void FormatJoin(std::string& target, | |
288 const DatabaseMetadataConstraint& constraint, | |
289 ResourceType level, | |
290 size_t index) | |
291 { | |
292 std::string tag = "t" + boost::lexical_cast<std::string>(index); | |
293 | |
294 if (constraint.IsMandatory()) | |
295 { | |
296 target = " INNER JOIN "; | |
297 } | |
298 else | |
299 { | |
300 target = " LEFT JOIN "; | |
301 } | |
302 | |
303 target += "Metadata "; | |
304 | |
305 target += tag + " ON " + tag + ".id = " + FormatLevel(level) + | |
306 ".internalId AND " + tag + ".type = " + | |
307 boost::lexical_cast<std::string>(constraint.GetMetadata()); | |
308 } | |
309 | |
287 | 310 |
288 static void FormatJoinForOrdering(std::string& target, | 311 static void FormatJoinForOrdering(std::string& target, |
289 const DicomTag& tag, | 312 const DicomTag& tag, |
290 size_t index, | 313 size_t index, |
291 ResourceType requestLevel) | 314 ResourceType requestLevel) |
386 } | 409 } |
387 } | 410 } |
388 | 411 |
389 static bool FormatComparison2(std::string& target, | 412 static bool FormatComparison2(std::string& target, |
390 ISqlLookupFormatter& formatter, | 413 ISqlLookupFormatter& formatter, |
391 const DatabaseConstraint& constraint, | 414 const DatabaseDicomTagConstraint& constraint, |
392 bool escapeBrackets) | 415 bool escapeBrackets) |
393 { | 416 { |
394 std::string comparison; | 417 std::string comparison; |
395 std::string tagFilter = ("tagGroup = " + boost::lexical_cast<std::string>(constraint.GetTag().GetGroup()) | 418 std::string tagFilter = ("tagGroup = " + boost::lexical_cast<std::string>(constraint.GetTag().GetGroup()) |
396 + " AND tagElement = " + boost::lexical_cast<std::string>(constraint.GetTag().GetElement())); | 419 + " AND tagElement = " + boost::lexical_cast<std::string>(constraint.GetTag().GetElement())); |
556 | 579 |
557 | 580 |
558 void ISqlLookupFormatter::GetLookupLevels(ResourceType& lowerLevel, | 581 void ISqlLookupFormatter::GetLookupLevels(ResourceType& lowerLevel, |
559 ResourceType& upperLevel, | 582 ResourceType& upperLevel, |
560 const ResourceType& queryLevel, | 583 const ResourceType& queryLevel, |
561 const DatabaseConstraints& lookup) | 584 const DatabaseDicomTagConstraints& lookup) |
562 { | 585 { |
563 assert(ResourceType_Patient < ResourceType_Study && | 586 assert(ResourceType_Patient < ResourceType_Study && |
564 ResourceType_Study < ResourceType_Series && | 587 ResourceType_Study < ResourceType_Series && |
565 ResourceType_Series < ResourceType_Instance); | 588 ResourceType_Series < ResourceType_Instance); |
566 | 589 |
584 } | 607 } |
585 | 608 |
586 | 609 |
587 void ISqlLookupFormatter::Apply(std::string& sql, | 610 void ISqlLookupFormatter::Apply(std::string& sql, |
588 ISqlLookupFormatter& formatter, | 611 ISqlLookupFormatter& formatter, |
589 const DatabaseConstraints& lookup, | 612 const DatabaseDicomTagConstraints& lookup, |
590 ResourceType queryLevel, | 613 ResourceType queryLevel, |
591 const std::set<std::string>& labels, | 614 const std::set<std::string>& labels, |
592 LabelsConstraint labelsConstraint, | 615 LabelsConstraint labelsConstraint, |
593 size_t limit) | 616 size_t limit) |
594 { | 617 { |
618 // get the limit levels of the DICOM Tags lookup | |
595 ResourceType lowerLevel, upperLevel; | 619 ResourceType lowerLevel, upperLevel; |
596 GetLookupLevels(lowerLevel, upperLevel, queryLevel, lookup); | 620 GetLookupLevels(lowerLevel, upperLevel, queryLevel, lookup); |
597 | 621 |
598 assert(upperLevel <= queryLevel && | 622 assert(upperLevel <= queryLevel && |
599 queryLevel <= lowerLevel); | 623 queryLevel <= lowerLevel); |
604 | 628 |
605 size_t count = 0; | 629 size_t count = 0; |
606 | 630 |
607 for (size_t i = 0; i < lookup.GetSize(); i++) | 631 for (size_t i = 0; i < lookup.GetSize(); i++) |
608 { | 632 { |
609 const DatabaseConstraint& constraint = lookup.GetConstraint(i); | 633 const DatabaseDicomTagConstraint& constraint = lookup.GetConstraint(i); |
610 | 634 |
611 std::string comparison; | 635 std::string comparison; |
612 | 636 |
613 if (FormatComparison(comparison, formatter, constraint, count, escapeBrackets)) | 637 if (FormatComparison(comparison, formatter, constraint, count, escapeBrackets)) |
614 { | 638 { |
796 } | 820 } |
797 } | 821 } |
798 | 822 |
799 size_t count = 0; | 823 size_t count = 0; |
800 | 824 |
801 const DatabaseConstraints& dicomTagsConstraints = request.GetDicomTagConstraints(); | 825 const DatabaseDicomTagConstraints& dicomTagsConstraints = request.GetDicomTagConstraints(); |
802 for (size_t i = 0; i < dicomTagsConstraints.GetSize(); i++) | 826 for (size_t i = 0; i < dicomTagsConstraints.GetSize(); i++) |
803 { | 827 { |
804 const DatabaseConstraint& constraint = dicomTagsConstraints.GetConstraint(i); | 828 const DatabaseDicomTagConstraint& constraint = dicomTagsConstraints.GetConstraint(i); |
805 | 829 |
806 std::string comparison; | 830 std::string comparison; |
807 | 831 |
808 if (FormatComparison(comparison, formatter, constraint, count, escapeBrackets)) | 832 if (FormatComparison(comparison, formatter, constraint, count, escapeBrackets)) |
809 { | 833 { |
810 std::string join; | 834 std::string join; |
811 FormatJoin(join, constraint, count); | 835 FormatJoin(join, constraint, count); |
836 joins += join; | |
837 | |
838 if (!comparison.empty()) | |
839 { | |
840 comparisons += " AND " + comparison; | |
841 } | |
842 | |
843 count ++; | |
844 } | |
845 } | |
846 | |
847 for (std::deque<DatabaseMetadataConstraint*>::const_iterator it = request.GetMetadataConstraint().begin(); it != request.GetMetadataConstraint().end(); ++it) | |
848 { | |
849 std::string comparison; | |
850 | |
851 if (FormatComparison(comparison, formatter, *(*it), count, escapeBrackets)) | |
852 { | |
853 std::string join; | |
854 FormatJoin(join, *(*it), request.GetLevel(), count); | |
812 joins += join; | 855 joins += join; |
813 | 856 |
814 if (!comparison.empty()) | 857 if (!comparison.empty()) |
815 { | 858 { |
816 comparisons += " AND " + comparison; | 859 comparisons += " AND " + comparison; |
889 } | 932 } |
890 | 933 |
891 | 934 |
892 void ISqlLookupFormatter::ApplySingleLevel(std::string& sql, | 935 void ISqlLookupFormatter::ApplySingleLevel(std::string& sql, |
893 ISqlLookupFormatter& formatter, | 936 ISqlLookupFormatter& formatter, |
894 const DatabaseConstraints& lookup, | 937 const DatabaseDicomTagConstraints& lookup, |
895 ResourceType queryLevel, | 938 ResourceType queryLevel, |
896 const std::set<std::string>& labels, | 939 const std::set<std::string>& labels, |
897 LabelsConstraint labelsConstraint, | 940 LabelsConstraint labelsConstraint, |
898 size_t limit | 941 size_t limit |
899 ) | 942 ) |
908 | 951 |
909 std::vector<std::string> mainDicomTagsComparisons, dicomIdentifiersComparisons; | 952 std::vector<std::string> mainDicomTagsComparisons, dicomIdentifiersComparisons; |
910 | 953 |
911 for (size_t i = 0; i < lookup.GetSize(); i++) | 954 for (size_t i = 0; i < lookup.GetSize(); i++) |
912 { | 955 { |
913 const DatabaseConstraint& constraint = lookup.GetConstraint(i); | 956 const DatabaseDicomTagConstraint& constraint = lookup.GetConstraint(i); |
914 | 957 |
915 std::string comparison; | 958 std::string comparison; |
916 | 959 |
917 if (FormatComparison2(comparison, formatter, constraint, escapeBrackets)) | 960 if (FormatComparison2(comparison, formatter, constraint, escapeBrackets)) |
918 { | 961 { |