changeset 5668:bd1352bd9d82 find-refactoring tip

configuring requests for ModalitiesInStudy and SOPClassesInStudy
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 04 Jul 2024 21:57:39 +0200
parents 93dff1fccf36
children
files OrthancServer/Sources/Database/Compatibility/GenericFind.cpp OrthancServer/Sources/Database/FindRequest.h OrthancServer/Sources/ResourceFinder.cpp
diffstat 3 files changed, 77 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/OrthancServer/Sources/Database/Compatibility/GenericFind.cpp	Thu Jul 04 21:31:48 2024 +0200
+++ b/OrthancServer/Sources/Database/Compatibility/GenericFind.cpp	Thu Jul 04 21:57:39 2024 +0200
@@ -474,8 +474,7 @@
 
           if (request.GetChildrenRetrieveSpecification(childrenLevel).IsRetrieveIdentifiers())
           {
-            for (std::list<int64_t>::const_iterator it = currentIds.begin();
-                 it != currentIds.end(); ++it)
+            for (std::list<int64_t>::const_iterator it = currentIds.begin(); it != currentIds.end(); ++it)
             {
               std::list<std::string> ids;
               transaction_.GetChildrenPublicId(ids, *it);
@@ -487,7 +486,27 @@
             }
           }
 
-          if (childrenLevel != bottomLevel)
+          const std::set<MetadataType>& metadata = request.GetChildrenRetrieveSpecification(childrenLevel).GetMetadata();
+
+          for (std::set<MetadataType>::const_iterator it = metadata.begin(); it != metadata.end(); ++it)
+          {
+            for (std::list<int64_t>::const_iterator it2 = currentIds.begin(); it2 != currentIds.end(); ++it2)
+            {
+              std::list<std::string> values;
+              transaction_.GetChildrenMetadata(values, *it2, *it);
+
+              for (std::list<std::string>::const_iterator it3 = values.begin(); it3 != values.end(); ++it3)
+              {
+                // TODO-FIND - Inject this value in the response
+                printf("[%s]\n", it3->c_str());
+              }
+            }
+          }
+
+          const std::set<DicomTag>& mainDicomTags = request.GetChildrenRetrieveSpecification(childrenLevel).GetMainDicomTags();
+
+          if (childrenLevel != bottomLevel ||
+              !mainDicomTags.empty())
           {
             std::list<int64_t> childrenIds;
 
@@ -499,6 +518,25 @@
               childrenIds.splice(childrenIds.end(), tmp);
             }
 
+            if (!mainDicomTags.empty())
+            {
+              for (std::list<int64_t>::const_iterator it = childrenIds.begin(); it != childrenIds.end(); ++it)
+              {
+                DicomMap m;
+                transaction_.GetMainDicomTags(m, *it);
+
+                for (std::set<DicomTag>::const_iterator it2 = mainDicomTags.begin(); it2 != mainDicomTags.end(); ++it2)
+                {
+                  std::string value;
+                  if (m.LookupStringValue(value, *it2, false /* no binary allowed */))
+                  {
+                    // TODO-FIND - Inject this value in the response
+                    printf("<%s>\n", value.c_str());
+                  }
+                }
+              }
+            }
+
             currentIds = childrenIds;
           }
           else
--- a/OrthancServer/Sources/Database/FindRequest.h	Thu Jul 04 21:31:48 2024 +0200
+++ b/OrthancServer/Sources/Database/FindRequest.h	Thu Jul 04 21:57:39 2024 +0200
@@ -198,7 +198,9 @@
     class ChildrenRetrieveSpecification : public boost::noncopyable
     {
     private:
-      bool  identifiers_;
+      bool                    identifiers_;
+      std::set<MetadataType>  metadata_;
+      std::set<DicomTag>      mainDicomTags_;
 
     public:
       ChildrenRetrieveSpecification() :
@@ -216,9 +218,29 @@
         return identifiers_;
       }
 
+      void AddMetadata(MetadataType metadata)
+      {
+        metadata_.insert(metadata);
+      }
+
+      const std::set<MetadataType>& GetMetadata() const
+      {
+        return metadata_;
+      }
+
+      void AddMainDicomTag(const DicomTag& tag)
+      {
+        mainDicomTags_.insert(tag);
+      }
+
+      const std::set<DicomTag>& GetMainDicomTags() const
+      {
+        return mainDicomTags_;
+      }
+
       bool IsOfInterest() const
       {
-        return identifiers_;
+        return (identifiers_ || !metadata_.empty() || !mainDicomTags_.empty());
       }
     };
 
--- a/OrthancServer/Sources/ResourceFinder.cpp	Thu Jul 04 21:31:48 2024 +0200
+++ b/OrthancServer/Sources/ResourceFinder.cpp	Thu Jul 04 21:57:39 2024 +0200
@@ -537,6 +537,18 @@
     {
       ConfigureChildrenCountComputedTag(tag, ResourceType_Series, ResourceType_Instance);
     }
+    else if (tag == DICOM_TAG_SOP_CLASSES_IN_STUDY)
+    {
+      requestedComputedTags_.insert(tag);
+      hasRequestedTags_ = true;
+      request_.GetChildrenRetrieveSpecification(ResourceType_Instance).AddMetadata(MetadataType_Instance_SopClassUid);
+    }
+    else if (tag == DICOM_TAG_MODALITIES_IN_STUDY)
+    {
+      requestedComputedTags_.insert(tag);
+      hasRequestedTags_ = true;
+      request_.GetChildrenRetrieveSpecification(ResourceType_Series).AddMainDicomTag(DICOM_TAG_MODALITY);
+    }
     else if (tag == DICOM_TAG_INSTANCE_AVAILABILITY)
     {
       requestedComputedTags_.insert(tag);