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)