diff OrthancServer/Sources/Database/FindResponse.h @ 5596:81a29ad7fb4b find-refactoring

added possibility to retrieve main DICOM tags and metadata at any level
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 07 May 2024 18:44:53 +0200
parents a87f2a56257d
children 8796c100aaf8
line wrap: on
line diff
--- a/OrthancServer/Sources/Database/FindResponse.h	Tue May 07 12:53:12 2024 +0200
+++ b/OrthancServer/Sources/Database/FindResponse.h	Tue May 07 18:44:53 2024 +0200
@@ -41,18 +41,28 @@
   class FindResponse : public boost::noncopyable
   {
   private:
-    class ChildrenAtLevel : public boost::noncopyable
+    class MainDicomTagsAtLevel : public boost::noncopyable
     {
     private:
-      std::set<std::string>  identifiers_;
+      class DicomValue;
+
+      typedef std::map<DicomTag, DicomValue*>  MainDicomTags;
+
+      MainDicomTags  mainDicomTags_;
 
     public:
-      void AddIdentifier(const std::string& identifier);
+      ~MainDicomTagsAtLevel();
+
+      void AddStringDicomTag(uint16_t group,
+                             uint16_t element,
+                             const std::string& value);
 
-      const std::set<std::string>& GetIdentifiers() const
-      {
-        return identifiers_;
-      }
+      // The "Null" value could be used in the future to indicate a
+      // value that is not available, typically a new "ExtraMainDicomTag"
+      void AddNullDicomTag(uint16_t group,
+                           uint16_t element);
+
+      void Export(DicomMap& target) const;
     };
 
 
@@ -60,28 +70,30 @@
     class Resource : public boost::noncopyable
     {
     private:
-      class DicomValue;
-
-      typedef std::map<DicomTag, DicomValue*>                  MainDicomTags;
       typedef std::map<MetadataType, std::list<std::string>*>  ChildrenMetadata;
 
       ResourceType                          level_;
       std::string                           identifier_;
       std::unique_ptr<std::string>          parentIdentifier_;
-      MainDicomTags                         mainDicomTags_;
-      ChildrenAtLevel                       childrenStudies_;
-      ChildrenAtLevel                       childrenSeries_;
-      ChildrenAtLevel                       childrenInstances_;
+      MainDicomTagsAtLevel                  mainDicomTagsPatient_;
+      MainDicomTagsAtLevel                  mainDicomTagsStudy_;
+      MainDicomTagsAtLevel                  mainDicomTagsSeries_;
+      MainDicomTagsAtLevel                  mainDicomTagsInstance_;
+      std::map<MetadataType, std::string>   metadataPatient_;
+      std::map<MetadataType, std::string>   metadataStudy_;
+      std::map<MetadataType, std::string>   metadataSeries_;
+      std::map<MetadataType, std::string>   metadataInstance_;
+      std::set<std::string>                 childrenIdentifiers_;
       std::set<std::string>                 labels_;      
-      std::map<MetadataType, std::string>   metadata_;
       std::map<FileContentType, FileInfo>   attachments_;
       ChildrenMetadata                      childrenMetadata_;
+      std::map<FileContentType, FileInfo>   attachmentOfOneInstance_;
 
-      ChildrenAtLevel& GetChildrenAtLevel(ResourceType level);
+      MainDicomTagsAtLevel& GetMainDicomTagsAtLevel(ResourceType level);
 
-      const ChildrenAtLevel& GetChildrenAtLevel(ResourceType level) const
+      const MainDicomTagsAtLevel& GetMainDicomTagsAtLevel(ResourceType level) const
       {
-        return const_cast<Resource&>(*this).GetChildrenAtLevel(level);
+        return const_cast<Resource&>(*this).GetMainDicomTagsAtLevel(level);
       }
 
     public:
@@ -110,26 +122,47 @@
 
       bool HasParentIdentifier() const;
 
-      void AddStringDicomTag(uint16_t group,
+      void AddStringDicomTag(ResourceType level,
+                             uint16_t group,
                              uint16_t element,
-                             const std::string& value);
+                             const std::string& value)
+      {
+        GetMainDicomTagsAtLevel(level).AddStringDicomTag(group, element, value);
+      }
 
-      // The "Null" value could be used in the future to indicate a
-      // value that is not available, typically a new "ExtraMainDicomTag"
-      void AddNullDicomTag(uint16_t group,
-                           uint16_t element);
+      void AddNullDicomTag(ResourceType level,
+                           uint16_t group,
+                           uint16_t element)
+      {
+        GetMainDicomTagsAtLevel(level).AddNullDicomTag(group, element);
+      }
 
-      void GetMainDicomTags(DicomMap& target) const;
-
-      void AddChildIdentifier(ResourceType level,
-                              const std::string& childId)
+      void GetMainDicomTags(DicomMap& target,
+                            ResourceType level) const
       {
-        GetChildrenAtLevel(level).AddIdentifier(childId);
+        GetMainDicomTagsAtLevel(level).Export(target);
       }
 
-      const std::set<std::string>& GetChildrenIdentifiers(ResourceType level) const
+      void AddMetadata(ResourceType level,
+                       MetadataType metadata,
+                       const std::string& value);
+
+      std::map<MetadataType, std::string>& GetMetadata(ResourceType level);
+
+      const std::map<MetadataType, std::string>& GetMetadata(ResourceType level) const
       {
-        return const_cast<Resource&>(*this).GetChildrenAtLevel(level).GetIdentifiers();
+        return const_cast<Resource&>(*this).GetMetadata(level);
+      }
+
+      bool LookupMetadata(std::string& value,
+                          ResourceType level,
+                          MetadataType metadata) const;
+
+      void AddChildIdentifier(const std::string& childId);
+
+      const std::set<std::string>& GetChildrenIdentifiers() const
+      {
+        return childrenIdentifiers_;
       }
 
       void AddLabel(const std::string& label);
@@ -144,44 +177,35 @@
         return labels_;
       }
 
-      void AddMetadata(MetadataType metadata,
-                       const std::string& value);
-
-      std::map<MetadataType, std::string>& GetMetadata()
-      {
-        return metadata_;
-      }
-
-      const std::map<MetadataType, std::string>& GetMetadata() const
-      {
-        return metadata_;
-      }
-
-      bool HasMetadata(MetadataType metadata) const
-      {
-        return metadata_.find(metadata) != metadata_.end();
-      }
-
-      bool LookupMetadata(std::string& value,
-                          MetadataType metadata) const;
-
-      void ListMetadata(std::set<MetadataType>& metadata) const;
-
       void AddAttachment(const FileInfo& attachment);
 
       bool LookupAttachment(FileInfo& target,
                             FileContentType type) const;
 
+      const std::map<FileContentType, FileInfo>& GetAttachments() const
+      {
+        return attachments_;
+      }
+
       void AddChildrenMetadata(MetadataType metadata,
                                const std::list<std::string>& values);
 
       bool LookupChildrenMetadata(std::list<std::string>& values,
                                   MetadataType metadata) const;
 
+      void AddAttachmentOfOneInstance(const FileInfo& info);
+
+      bool LookupAttachmentOfOneInstance(FileInfo& target,
+                                         FileContentType type) const;
+
       SeriesStatus GetSeriesStatus(uint32_t& expecterNumberOfInstances) const;
 
       void Expand(Json::Value& target,
-                  const FindRequest& request) const;
+                  const FindRequest& request,
+                  bool includeAllMetadata) const;
+
+      void DebugExport(Json::Value& target,
+                       const FindRequest& request) const;
     };
 
   private: