Mercurial > hg > orthanc
comparison OrthancServer/Sources/ServerContext.cpp @ 4977:dad71e6da406 more-tags
pre-filtering studies without ModalitiesInStudies first
author | Alain Mazy <am@osimis.io> |
---|---|
date | Wed, 20 Apr 2022 11:32:31 +0200 |
parents | f377d5643538 |
children | 2cfa50d8eb60 |
comparison
equal
deleted
inserted
replaced
4976:03632ed1eb67 | 4977:dad71e6da406 |
---|---|
1668 { | 1668 { |
1669 callerVisitor.MarkAsComplete(); | 1669 callerVisitor.MarkAsComplete(); |
1670 } | 1670 } |
1671 } | 1671 } |
1672 }; | 1672 }; |
1673 } | |
1674 | 1673 |
1675 | 1674 # if 1 |
1675 class StudyInstanceUidVisitor : public ServerContext::ILookupVisitor | |
1676 { | |
1677 private: | |
1678 std::set<std::string> studyInstanceUids; | |
1679 | |
1680 public: | |
1681 explicit StudyInstanceUidVisitor() | |
1682 { | |
1683 } | |
1684 | |
1685 virtual bool IsDicomAsJsonNeeded() const ORTHANC_OVERRIDE | |
1686 { | |
1687 return false; | |
1688 } | |
1689 | |
1690 virtual void MarkAsComplete() ORTHANC_OVERRIDE | |
1691 { | |
1692 } | |
1693 | |
1694 virtual void Visit(const std::string& publicId, | |
1695 const std::string& instanceId, | |
1696 const DicomMap& mainDicomTags, | |
1697 const Json::Value* dicomAsJson) ORTHANC_OVERRIDE | |
1698 { | |
1699 std::string studyInstanceUid; | |
1700 if (!mainDicomTags.LookupStringValue(studyInstanceUid, DICOM_TAG_STUDY_INSTANCE_UID, false)) | |
1701 { | |
1702 throw OrthancException(ErrorCode_InternalError); | |
1703 } | |
1704 studyInstanceUids.insert(studyInstanceUid); | |
1705 } | |
1706 | |
1707 const std::set<std::string>& GetFilteredStudyInstanceUids() const | |
1708 { | |
1709 return studyInstanceUids; | |
1710 } | |
1711 }; | |
1712 } | |
1713 | |
1714 void ServerContext::Apply(ILookupVisitor& visitor, | |
1715 const DatabaseLookup& lookup, | |
1716 ResourceType queryLevel, | |
1717 size_t since, | |
1718 size_t limit) | |
1719 { | |
1720 const DicomTagConstraint* constraint = NULL; | |
1721 | |
1722 if (queryLevel == ResourceType_Study && | |
1723 lookup.GetConstraint(constraint, DICOM_TAG_MODALITIES_IN_STUDY) && | |
1724 ((constraint->GetConstraintType() == ConstraintType_Equal && !constraint->GetValue().empty()) || | |
1725 (constraint->GetConstraintType() == ConstraintType_List && !constraint->GetValues().empty())) | |
1726 ) | |
1727 { | |
1728 std::unique_ptr<DatabaseLookup> studiesPreFilterLookup(lookup.Clone()); | |
1729 studiesPreFilterLookup->RemoveConstraint(DICOM_TAG_MODALITIES_IN_STUDY); | |
1730 | |
1731 DatabaseLookup seriesLookup; | |
1732 | |
1733 std::set<std::string> filteredStudyInstanceUids; | |
1734 if (studiesPreFilterLookup->GetConstraintsCount() >= 1) | |
1735 { | |
1736 LOG(INFO) << "Performing First filtering without ModalitiesInStudy"; | |
1737 | |
1738 StudyInstanceUidVisitor studyVisitor; | |
1739 | |
1740 ApplyInternal(studyVisitor, *studiesPreFilterLookup, queryLevel, since, limit); | |
1741 | |
1742 DicomTagConstraint studyInstanceUidsConstraint(DICOM_TAG_STUDY_INSTANCE_UID, ConstraintType_List, true, true); | |
1743 for (std::set<std::string>::const_iterator it = studyVisitor.GetFilteredStudyInstanceUids().begin(); | |
1744 it != studyVisitor.GetFilteredStudyInstanceUids().end(); it++) | |
1745 { | |
1746 studyInstanceUidsConstraint.AddValue(*it); | |
1747 } | |
1748 | |
1749 seriesLookup.AddConstraint(studyInstanceUidsConstraint); | |
1750 } | |
1751 | |
1752 // Convert the study-level query, into a series-level query, | |
1753 // where "ModalitiesInStudy" is replaced by "Modality" | |
1754 // and where all other constraints are replaced by "StudyInstanceUID IN (...)" | |
1755 | |
1756 DicomTagConstraint modality(*constraint); | |
1757 modality.SetTag(DICOM_TAG_MODALITY); | |
1758 seriesLookup.AddConstraint(modality); | |
1759 | |
1760 ModalitiesInStudyVisitor seriesVisitor(visitor.IsDicomAsJsonNeeded()); | |
1761 ApplyInternal(seriesVisitor, seriesLookup, ResourceType_Series, 0, 0); | |
1762 seriesVisitor.Forward(visitor, since, limit); | |
1763 } | |
1764 else // filtering without ModalitiesInStudy | |
1765 { | |
1766 ApplyInternal(visitor, lookup, queryLevel, since, limit); | |
1767 } | |
1768 } | |
1769 | |
1770 #else | |
1676 void ServerContext::Apply(ILookupVisitor& visitor, | 1771 void ServerContext::Apply(ILookupVisitor& visitor, |
1677 const DatabaseLookup& lookup, | 1772 const DatabaseLookup& lookup, |
1678 ResourceType queryLevel, | 1773 ResourceType queryLevel, |
1679 size_t since, | 1774 size_t since, |
1680 size_t limit) | 1775 size_t limit) |
1718 } | 1813 } |
1719 else | 1814 else |
1720 { | 1815 { |
1721 ApplyInternal(visitor, lookup, queryLevel, since, limit); | 1816 ApplyInternal(visitor, lookup, queryLevel, since, limit); |
1722 } | 1817 } |
1723 } | 1818 } |
1724 | 1819 #endif |
1725 | 1820 |
1726 bool ServerContext::LookupOrReconstructMetadata(std::string& target, | 1821 bool ServerContext::LookupOrReconstructMetadata(std::string& target, |
1727 const std::string& publicId, | 1822 const std::string& publicId, |
1728 ResourceType level, | 1823 ResourceType level, |
1729 MetadataType metadata) | 1824 MetadataType metadata) |