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 {