diff OrthancServer/OrthancFindRequestHandler.cpp @ 2208:90ea60bee5ff

New metadata automatically computed at the instance level: "SopClassUid"
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 09 Dec 2016 14:48:31 +0100
parents 2b1520efa282
children 3eefb84ac0bd
line wrap: on
line diff
--- a/OrthancServer/OrthancFindRequestHandler.cpp	Fri Dec 09 11:24:04 2016 +0100
+++ b/OrthancServer/OrthancFindRequestHandler.cpp	Fri Dec 09 14:48:31 2016 +0100
@@ -107,10 +107,34 @@
   }
 
 
-  static void ExtractTagFromInstances(std::set<std::string>& target,
-                                      ServerContext& context,
-                                      const DicomTag& tag,
-                                      const std::list<std::string>& instances)
+  static bool ExtractMetadata(std::set<std::string>& target,
+                              ServerIndex& index,
+                              MetadataType metadata,
+                              const std::list<std::string>& resources)
+  {
+    for (std::list<std::string>::const_iterator
+           it = resources.begin(); it != resources.end(); ++it)
+    {
+      std::string value;
+      if (index.LookupMetadata(value, *it, metadata))
+      {
+        target.insert(value);
+      }
+      else
+      {
+        // This metadata is unavailable for some resource, give up
+        return false;
+      }
+    }
+
+    return true;
+  }  
+
+
+  static void ExtractTagFromInstancesOnDisk(std::set<std::string>& target,
+                                            ServerContext& context,
+                                            const DicomTag& tag,
+                                            const std::list<std::string>& instances)
   {
     // WARNING: This function is slow, as it reads the JSON file
     // summarizing each instance of interest from the hard drive.
@@ -226,10 +250,16 @@
 
     if (query.HasTag(DICOM_TAG_SOP_CLASSES_IN_STUDY))
     {
-      if (Configuration::GetGlobalBoolParameter("AllowFindSopClassesInStudy", false))
+      std::set<std::string> values;
+
+      if (ExtractMetadata(values, index, MetadataType_Instance_SopClassUid, instances))
       {
-        std::set<std::string> values;
-        ExtractTagFromInstances(values, context, DICOM_TAG_SOP_CLASS_UID, instances);
+        // The metadata "SopClassUid" is available for each of these instances
+        StoreSetOfStrings(result, DICOM_TAG_SOP_CLASSES_IN_STUDY, values);
+      }
+      else if (Configuration::GetGlobalBoolParameter("AllowFindSopClassesInStudy", false))
+      {
+        ExtractTagFromInstancesOnDisk(values, context, DICOM_TAG_SOP_CLASS_UID, instances);
         StoreSetOfStrings(result, DICOM_TAG_SOP_CLASSES_IN_STUDY, values);
       }
       else