Mercurial > hg > orthanc
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