# HG changeset patch # User Sebastien Jodogne # Date 1720123059 -7200 # Node ID bd1352bd9d827884125b62b94bf65c83981416b0 # Parent 93dff1fccf364b9847b4bb0e3ce6c72703c48f65 configuring requests for ModalitiesInStudy and SOPClassesInStudy diff -r 93dff1fccf36 -r bd1352bd9d82 OrthancServer/Sources/Database/Compatibility/GenericFind.cpp --- 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::const_iterator it = currentIds.begin(); - it != currentIds.end(); ++it) + for (std::list::const_iterator it = currentIds.begin(); it != currentIds.end(); ++it) { std::list ids; transaction_.GetChildrenPublicId(ids, *it); @@ -487,7 +486,27 @@ } } - if (childrenLevel != bottomLevel) + const std::set& metadata = request.GetChildrenRetrieveSpecification(childrenLevel).GetMetadata(); + + for (std::set::const_iterator it = metadata.begin(); it != metadata.end(); ++it) + { + for (std::list::const_iterator it2 = currentIds.begin(); it2 != currentIds.end(); ++it2) + { + std::list values; + transaction_.GetChildrenMetadata(values, *it2, *it); + + for (std::list::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& mainDicomTags = request.GetChildrenRetrieveSpecification(childrenLevel).GetMainDicomTags(); + + if (childrenLevel != bottomLevel || + !mainDicomTags.empty()) { std::list childrenIds; @@ -499,6 +518,25 @@ childrenIds.splice(childrenIds.end(), tmp); } + if (!mainDicomTags.empty()) + { + for (std::list::const_iterator it = childrenIds.begin(); it != childrenIds.end(); ++it) + { + DicomMap m; + transaction_.GetMainDicomTags(m, *it); + + for (std::set::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 diff -r 93dff1fccf36 -r bd1352bd9d82 OrthancServer/Sources/Database/FindRequest.h --- 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 metadata_; + std::set mainDicomTags_; public: ChildrenRetrieveSpecification() : @@ -216,9 +218,29 @@ return identifiers_; } + void AddMetadata(MetadataType metadata) + { + metadata_.insert(metadata); + } + + const std::set& GetMetadata() const + { + return metadata_; + } + + void AddMainDicomTag(const DicomTag& tag) + { + mainDicomTags_.insert(tag); + } + + const std::set& GetMainDicomTags() const + { + return mainDicomTags_; + } + bool IsOfInterest() const { - return identifiers_; + return (identifiers_ || !metadata_.empty() || !mainDicomTags_.empty()); } }; diff -r 93dff1fccf36 -r bd1352bd9d82 OrthancServer/Sources/ResourceFinder.cpp --- 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);