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 "