comparison OrthancServer/Sources/Database/Compatibility/GenericFind.cpp @ 5617:8905ffa45fc2 find-refactoring

started listing of children resources
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 09 May 2024 14:59:17 +0200
parents 1e92fb051fd7
children 1864b16bc7b1
comparison
equal deleted inserted replaced
5616:1e92fb051fd7 5617:8905ffa45fc2
38 request.GetMetadataConstraintsCount() == 0 && 38 request.GetMetadataConstraintsCount() == 0 &&
39 request.GetLabels().empty() && 39 request.GetLabels().empty() &&
40 request.GetOrdering().empty()); 40 request.GetOrdering().empty());
41 } 41 }
42 42
43 static void GetChildren(std::list<int64_t>& target,
44 IDatabaseWrapper::ITransaction& transaction,
45 const std::list<int64_t>& resources)
46 {
47 target.clear();
48
49 for (std::list<int64_t>::const_iterator it = resources.begin(); it != resources.end(); ++it)
50 {
51 std::list<int64_t> tmp;
52 transaction.GetChildrenInternalId(tmp, *it);
53 target.splice(target.begin(), tmp);
54 }
55 }
56
57 static void GetChildren(std::list<std::string>& target,
58 IDatabaseWrapper::ITransaction& transaction,
59 const std::list<int64_t>& resources)
60 {
61 target.clear();
62
63 for (std::list<int64_t>::const_iterator it = resources.begin(); it != resources.end(); ++it)
64 {
65 std::list<std::string> tmp;
66 transaction.GetChildrenPublicId(tmp, *it);
67 target.splice(target.begin(), tmp);
68 }
69 }
70
71 static void GetChildrenIdentifiers(std::list<std::string>& children,
72 IDatabaseWrapper::ITransaction& transaction,
73 const OrthancIdentifiers& identifiers,
74 ResourceType topLevel,
75 ResourceType bottomLevel)
76 {
77 if (!IsResourceLevelAboveOrEqual(topLevel, bottomLevel) ||
78 topLevel == bottomLevel)
79 {
80 throw OrthancException(ErrorCode_InternalError);
81 }
82
83 std::list<int64_t> currentResources;
84 ResourceType currentLevel;
85
86 {
87 int64_t id;
88 if (!transaction.LookupResource(id, currentLevel, identifiers.GetLevel(topLevel)) ||
89 currentLevel != topLevel)
90 {
91 throw OrthancException(ErrorCode_InexistentItem);
92 }
93
94 currentResources.push_back(id);
95 }
96
97 while (currentLevel != bottomLevel)
98 {
99 ResourceType nextLevel = GetChildResourceType(currentLevel);
100 if (nextLevel == bottomLevel)
101 {
102 GetChildren(children, transaction, currentResources);
103 }
104 else
105 {
106 std::list<int64_t> nextResources;
107 GetChildren(nextResources, transaction, currentResources);
108 currentResources.swap(nextResources);
109 }
110
111 currentLevel = nextLevel;
112 }
113 }
114
43 void GenericFind::ExecuteFind(std::list<std::string>& identifiers, 115 void GenericFind::ExecuteFind(std::list<std::string>& identifiers,
44 const FindRequest& request) 116 const FindRequest& request)
45 { 117 {
46 if (IsRequestWithoutContraint(request) && 118 if (IsRequestWithoutContraint(request) &&
47 !request.GetOrthancIdentifiers().HasPatientId() && 119 !request.GetOrthancIdentifiers().HasPatientId() &&
63 request.GetOrthancIdentifiers().HasPatientId() && 135 request.GetOrthancIdentifiers().HasPatientId() &&
64 !request.GetOrthancIdentifiers().HasStudyId() && 136 !request.GetOrthancIdentifiers().HasStudyId() &&
65 !request.GetOrthancIdentifiers().HasSeriesId() && 137 !request.GetOrthancIdentifiers().HasSeriesId() &&
66 !request.GetOrthancIdentifiers().HasInstanceId()) 138 !request.GetOrthancIdentifiers().HasInstanceId())
67 { 139 {
140 // TODO-FIND: This is a trivial case for which no transaction is needed
68 identifiers.push_back(request.GetOrthancIdentifiers().GetPatientId()); 141 identifiers.push_back(request.GetOrthancIdentifiers().GetPatientId());
69 } 142 }
70 else if (IsRequestWithoutContraint(request) && 143 else if (IsRequestWithoutContraint(request) &&
71 request.GetLevel() == ResourceType_Study && 144 request.GetLevel() == ResourceType_Study &&
72 !request.GetOrthancIdentifiers().HasPatientId() && 145 !request.GetOrthancIdentifiers().HasPatientId() &&
73 request.GetOrthancIdentifiers().HasStudyId() && 146 request.GetOrthancIdentifiers().HasStudyId() &&
74 !request.GetOrthancIdentifiers().HasSeriesId() && 147 !request.GetOrthancIdentifiers().HasSeriesId() &&
75 !request.GetOrthancIdentifiers().HasInstanceId()) 148 !request.GetOrthancIdentifiers().HasInstanceId())
76 { 149 {
150 // TODO-FIND: This is a trivial case for which no transaction is needed
77 identifiers.push_back(request.GetOrthancIdentifiers().GetStudyId()); 151 identifiers.push_back(request.GetOrthancIdentifiers().GetStudyId());
78 } 152 }
79 else if (IsRequestWithoutContraint(request) && 153 else if (IsRequestWithoutContraint(request) &&
80 request.GetLevel() == ResourceType_Series && 154 request.GetLevel() == ResourceType_Series &&
81 !request.GetOrthancIdentifiers().HasPatientId() && 155 !request.GetOrthancIdentifiers().HasPatientId() &&
82 !request.GetOrthancIdentifiers().HasStudyId() && 156 !request.GetOrthancIdentifiers().HasStudyId() &&
83 request.GetOrthancIdentifiers().HasSeriesId() && 157 request.GetOrthancIdentifiers().HasSeriesId() &&
84 !request.GetOrthancIdentifiers().HasInstanceId()) 158 !request.GetOrthancIdentifiers().HasInstanceId())
85 { 159 {
160 // TODO-FIND: This is a trivial case for which no transaction is needed
86 identifiers.push_back(request.GetOrthancIdentifiers().GetSeriesId()); 161 identifiers.push_back(request.GetOrthancIdentifiers().GetSeriesId());
87 } 162 }
88 else if (IsRequestWithoutContraint(request) && 163 else if (IsRequestWithoutContraint(request) &&
89 request.GetLevel() == ResourceType_Instance && 164 request.GetLevel() == ResourceType_Instance &&
90 !request.GetOrthancIdentifiers().HasPatientId() && 165 !request.GetOrthancIdentifiers().HasPatientId() &&
91 !request.GetOrthancIdentifiers().HasStudyId() && 166 !request.GetOrthancIdentifiers().HasStudyId() &&
92 !request.GetOrthancIdentifiers().HasSeriesId() && 167 !request.GetOrthancIdentifiers().HasSeriesId() &&
93 request.GetOrthancIdentifiers().HasInstanceId()) 168 request.GetOrthancIdentifiers().HasInstanceId())
94 { 169 {
170 // TODO-FIND: This is a trivial case for which no transaction is needed
95 identifiers.push_back(request.GetOrthancIdentifiers().GetInstanceId()); 171 identifiers.push_back(request.GetOrthancIdentifiers().GetInstanceId());
172 }
173 else if (IsRequestWithoutContraint(request) &&
174 (request.GetLevel() == ResourceType_Study ||
175 request.GetLevel() == ResourceType_Series ||
176 request.GetLevel() == ResourceType_Instance) &&
177 request.GetOrthancIdentifiers().HasPatientId() &&
178 !request.GetOrthancIdentifiers().HasStudyId() &&
179 !request.GetOrthancIdentifiers().HasSeriesId() &&
180 !request.GetOrthancIdentifiers().HasInstanceId())
181 {
182 GetChildrenIdentifiers(identifiers, transaction_, request.GetOrthancIdentifiers(), ResourceType_Patient, request.GetLevel());
183 }
184 else if (IsRequestWithoutContraint(request) &&
185 (request.GetLevel() == ResourceType_Series ||
186 request.GetLevel() == ResourceType_Instance) &&
187 !request.GetOrthancIdentifiers().HasPatientId() &&
188 request.GetOrthancIdentifiers().HasStudyId() &&
189 !request.GetOrthancIdentifiers().HasSeriesId() &&
190 !request.GetOrthancIdentifiers().HasInstanceId())
191 {
192 GetChildrenIdentifiers(identifiers, transaction_, request.GetOrthancIdentifiers(), ResourceType_Study, request.GetLevel());
193 }
194 else if (IsRequestWithoutContraint(request) &&
195 request.GetLevel() == ResourceType_Instance &&
196 !request.GetOrthancIdentifiers().HasPatientId() &&
197 !request.GetOrthancIdentifiers().HasStudyId() &&
198 request.GetOrthancIdentifiers().HasSeriesId() &&
199 !request.GetOrthancIdentifiers().HasInstanceId())
200 {
201 GetChildrenIdentifiers(identifiers, transaction_, request.GetOrthancIdentifiers(), ResourceType_Series, request.GetLevel());
96 } 202 }
97 else 203 else
98 { 204 {
99 throw OrthancException(ErrorCode_NotImplemented); // Not supported 205 throw OrthancException(ErrorCode_NotImplemented); // Not supported
100 } 206 }