Mercurial > hg > orthanc-databases
comparison Framework/Plugins/ISqlLookupFormatter.cpp @ 551:1a23f1ce3b98
move classes DatabaseConstraint and ISqlLookupFormatter into namespace OrthancDatabases
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Mon, 09 Sep 2024 15:19:28 +0200 |
parents | 25005693297b |
children | 7f45f23b10d0 |
comparison
equal
deleted
inserted
replaced
549:e620f36b8e09 | 551:1a23f1ce3b98 |
---|---|
38 #include <cassert> | 38 #include <cassert> |
39 #include <boost/lexical_cast.hpp> | 39 #include <boost/lexical_cast.hpp> |
40 #include <list> | 40 #include <list> |
41 | 41 |
42 | 42 |
43 namespace Orthanc | 43 namespace OrthancDatabases |
44 { | 44 { |
45 static std::string FormatLevel(ResourceType level) | 45 static std::string FormatLevel(Orthanc::ResourceType level) |
46 { | 46 { |
47 switch (level) | 47 switch (level) |
48 { | 48 { |
49 case ResourceType_Patient: | 49 case Orthanc::ResourceType_Patient: |
50 return "patients"; | 50 return "patients"; |
51 | 51 |
52 case ResourceType_Study: | 52 case Orthanc::ResourceType_Study: |
53 return "studies"; | 53 return "studies"; |
54 | 54 |
55 case ResourceType_Series: | 55 case Orthanc::ResourceType_Series: |
56 return "series"; | 56 return "series"; |
57 | 57 |
58 case ResourceType_Instance: | 58 case Orthanc::ResourceType_Instance: |
59 return "instances"; | 59 return "instances"; |
60 | 60 |
61 default: | 61 default: |
62 throw OrthancException(ErrorCode_InternalError); | 62 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); |
63 } | 63 } |
64 } | 64 } |
65 | 65 |
66 | 66 |
67 static bool FormatComparison(std::string& target, | 67 static bool FormatComparison(std::string& target, |
94 case ConstraintType_GreaterOrEqual: | 94 case ConstraintType_GreaterOrEqual: |
95 op = ">="; | 95 op = ">="; |
96 break; | 96 break; |
97 | 97 |
98 default: | 98 default: |
99 throw OrthancException(ErrorCode_InternalError); | 99 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); |
100 } | 100 } |
101 | 101 |
102 std::string parameter = formatter.GenerateParameter(constraint.GetSingleValue()); | 102 std::string parameter = formatter.GenerateParameter(constraint.GetSingleValue()); |
103 | 103 |
104 if (constraint.IsCaseSensitive()) | 104 if (constraint.IsCaseSensitive()) |
329 case ConstraintType_GreaterOrEqual: | 329 case ConstraintType_GreaterOrEqual: |
330 op = ">="; | 330 op = ">="; |
331 break; | 331 break; |
332 | 332 |
333 default: | 333 default: |
334 throw OrthancException(ErrorCode_InternalError); | 334 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); |
335 } | 335 } |
336 | 336 |
337 std::string parameter = formatter.GenerateParameter(constraint.GetSingleValue()); | 337 std::string parameter = formatter.GenerateParameter(constraint.GetSingleValue()); |
338 | 338 |
339 if (constraint.IsCaseSensitive()) | 339 if (constraint.IsCaseSensitive()) |
364 comparisonValues.push_back("lower(" + parameter + ")"); | 364 comparisonValues.push_back("lower(" + parameter + ")"); |
365 } | 365 } |
366 } | 366 } |
367 | 367 |
368 std::string values; | 368 std::string values; |
369 Toolbox::JoinStrings(values, comparisonValues, ", "); | 369 Orthanc::Toolbox::JoinStrings(values, comparisonValues, ", "); |
370 | 370 |
371 if (constraint.IsCaseSensitive()) | 371 if (constraint.IsCaseSensitive()) |
372 { | 372 { |
373 comparison = " AND value IN (" + values + ")"; | 373 comparison = " AND value IN (" + values + ")"; |
374 } | 374 } |
467 | 467 |
468 return true; | 468 return true; |
469 } | 469 } |
470 | 470 |
471 | 471 |
472 void ISqlLookupFormatter::GetLookupLevels(ResourceType& lowerLevel, | 472 void ISqlLookupFormatter::GetLookupLevels(Orthanc::ResourceType& lowerLevel, |
473 ResourceType& upperLevel, | 473 Orthanc::ResourceType& upperLevel, |
474 const ResourceType& queryLevel, | 474 const Orthanc::ResourceType& queryLevel, |
475 const DatabaseConstraints& lookup) | 475 const DatabaseConstraints& lookup) |
476 { | 476 { |
477 assert(ResourceType_Patient < ResourceType_Study && | 477 assert(Orthanc::ResourceType_Patient < Orthanc::ResourceType_Study && |
478 ResourceType_Study < ResourceType_Series && | 478 Orthanc::ResourceType_Study < Orthanc::ResourceType_Series && |
479 ResourceType_Series < ResourceType_Instance); | 479 Orthanc::ResourceType_Series < Orthanc::ResourceType_Instance); |
480 | 480 |
481 lowerLevel = queryLevel; | 481 lowerLevel = queryLevel; |
482 upperLevel = queryLevel; | 482 upperLevel = queryLevel; |
483 | 483 |
484 for (size_t i = 0; i < lookup.GetSize(); i++) | 484 for (size_t i = 0; i < lookup.GetSize(); i++) |
485 { | 485 { |
486 ResourceType level = lookup.GetConstraint(i).GetLevel(); | 486 Orthanc::ResourceType level = lookup.GetConstraint(i).GetLevel(); |
487 | 487 |
488 if (level < upperLevel) | 488 if (level < upperLevel) |
489 { | 489 { |
490 upperLevel = level; | 490 upperLevel = level; |
491 } | 491 } |
499 | 499 |
500 | 500 |
501 void ISqlLookupFormatter::Apply(std::string& sql, | 501 void ISqlLookupFormatter::Apply(std::string& sql, |
502 ISqlLookupFormatter& formatter, | 502 ISqlLookupFormatter& formatter, |
503 const DatabaseConstraints& lookup, | 503 const DatabaseConstraints& lookup, |
504 ResourceType queryLevel, | 504 Orthanc::ResourceType queryLevel, |
505 const std::set<std::string>& labels, | 505 const std::set<std::string>& labels, |
506 LabelsConstraint labelsConstraint, | 506 LabelsConstraint labelsConstraint, |
507 size_t limit) | 507 size_t limit) |
508 { | 508 { |
509 ResourceType lowerLevel, upperLevel; | 509 Orthanc::ResourceType lowerLevel, upperLevel; |
510 GetLookupLevels(lowerLevel, upperLevel, queryLevel, lookup); | 510 GetLookupLevels(lowerLevel, upperLevel, queryLevel, lookup); |
511 | 511 |
512 assert(upperLevel <= queryLevel && | 512 assert(upperLevel <= queryLevel && |
513 queryLevel <= lowerLevel); | 513 queryLevel <= lowerLevel); |
514 | 514 |
545 " FROM Resources AS " + FormatLevel(queryLevel)); | 545 " FROM Resources AS " + FormatLevel(queryLevel)); |
546 | 546 |
547 for (int level = queryLevel - 1; level >= upperLevel; level--) | 547 for (int level = queryLevel - 1; level >= upperLevel; level--) |
548 { | 548 { |
549 sql += (" INNER JOIN Resources " + | 549 sql += (" INNER JOIN Resources " + |
550 FormatLevel(static_cast<ResourceType>(level)) + " ON " + | 550 FormatLevel(static_cast<Orthanc::ResourceType>(level)) + " ON " + |
551 FormatLevel(static_cast<ResourceType>(level)) + ".internalId=" + | 551 FormatLevel(static_cast<Orthanc::ResourceType>(level)) + ".internalId=" + |
552 FormatLevel(static_cast<ResourceType>(level + 1)) + ".parentId"); | 552 FormatLevel(static_cast<Orthanc::ResourceType>(level + 1)) + ".parentId"); |
553 } | 553 } |
554 | 554 |
555 for (int level = queryLevel + 1; level <= lowerLevel; level++) | 555 for (int level = queryLevel + 1; level <= lowerLevel; level++) |
556 { | 556 { |
557 sql += (" INNER JOIN Resources " + | 557 sql += (" INNER JOIN Resources " + |
558 FormatLevel(static_cast<ResourceType>(level)) + " ON " + | 558 FormatLevel(static_cast<Orthanc::ResourceType>(level)) + " ON " + |
559 FormatLevel(static_cast<ResourceType>(level - 1)) + ".internalId=" + | 559 FormatLevel(static_cast<Orthanc::ResourceType>(level - 1)) + ".internalId=" + |
560 FormatLevel(static_cast<ResourceType>(level)) + ".parentId"); | 560 FormatLevel(static_cast<Orthanc::ResourceType>(level)) + ".parentId"); |
561 } | 561 } |
562 | 562 |
563 std::list<std::string> where; | 563 std::list<std::string> where; |
564 where.push_back(FormatLevel(queryLevel) + ".resourceType = " + | 564 where.push_back(FormatLevel(queryLevel) + ".resourceType = " + |
565 formatter.FormatResourceType(queryLevel) + comparisons); | 565 formatter.FormatResourceType(queryLevel) + comparisons); |
593 case LabelsConstraint_None: | 593 case LabelsConstraint_None: |
594 condition = "= 0"; | 594 condition = "= 0"; |
595 break; | 595 break; |
596 | 596 |
597 default: | 597 default: |
598 throw OrthancException(ErrorCode_ParameterOutOfRange); | 598 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
599 } | 599 } |
600 | 600 |
601 where.push_back("(SELECT COUNT(1) FROM Labels AS selectedLabels WHERE selectedLabels.id = " + FormatLevel(queryLevel) + | 601 where.push_back("(SELECT COUNT(1) FROM Labels AS selectedLabels WHERE selectedLabels.id = " + FormatLevel(queryLevel) + |
602 ".internalId AND selectedLabels.label IN (" + Join(formattedLabels, "", ", ") + ")) " + condition); | 602 ".internalId AND selectedLabels.label IN (" + Join(formattedLabels, "", ", ") + ")) " + condition); |
603 } | 603 } |
612 | 612 |
613 | 613 |
614 void ISqlLookupFormatter::ApplySingleLevel(std::string& sql, | 614 void ISqlLookupFormatter::ApplySingleLevel(std::string& sql, |
615 ISqlLookupFormatter& formatter, | 615 ISqlLookupFormatter& formatter, |
616 const DatabaseConstraints& lookup, | 616 const DatabaseConstraints& lookup, |
617 ResourceType queryLevel, | 617 Orthanc::ResourceType queryLevel, |
618 const std::set<std::string>& labels, | 618 const std::set<std::string>& labels, |
619 LabelsConstraint labelsConstraint, | 619 LabelsConstraint labelsConstraint, |
620 size_t limit | 620 size_t limit |
621 ) | 621 ) |
622 { | 622 { |
623 ResourceType lowerLevel, upperLevel; | 623 Orthanc::ResourceType lowerLevel, upperLevel; |
624 GetLookupLevels(lowerLevel, upperLevel, queryLevel, lookup); | 624 GetLookupLevels(lowerLevel, upperLevel, queryLevel, lookup); |
625 | 625 |
626 assert(upperLevel == queryLevel && | 626 assert(upperLevel == queryLevel && |
627 queryLevel == lowerLevel); | 627 queryLevel == lowerLevel); |
628 | 628 |
706 condition = "> 0"; | 706 condition = "> 0"; |
707 inOrNotIn = "NOT IN"; | 707 inOrNotIn = "NOT IN"; |
708 break; | 708 break; |
709 | 709 |
710 default: | 710 default: |
711 throw OrthancException(ErrorCode_ParameterOutOfRange); | 711 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
712 } | 712 } |
713 | 713 |
714 sql += (" AND internalId " + inOrNotIn + " (SELECT id" | 714 sql += (" AND internalId " + inOrNotIn + " (SELECT id" |
715 " FROM (SELECT id, COUNT(1) AS labelsCount " | 715 " FROM (SELECT id, COUNT(1) AS labelsCount " |
716 "FROM Labels " | 716 "FROM Labels " |