Mercurial > hg > orthanc-databases
annotate Resources/Orthanc/Databases/ISqlLookupFormatter.cpp @ 415:7e123f047771
LookupResources optimization continued
author | Alain Mazy <am@osimis.io> |
---|---|
date | Thu, 22 Jun 2023 18:07:41 +0200 |
parents | f2d3b5c5a68d |
children | 6b16914b6655 |
rev | line source |
---|---|
152 | 1 /** |
2 * Orthanc - A Lightweight, RESTful DICOM Store | |
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics | |
4 * Department, University Hospital of Liege, Belgium | |
405 | 5 * Copyright (C) 2017-2023 Osimis S.A., Belgium |
6 * Copyright (C) 2021-2023 Sebastien Jodogne, ICTEAM UCLouvain, Belgium | |
152 | 7 * |
8 * This program is free software: you can redistribute it and/or | |
9 * modify it under the terms of the GNU General Public License as | |
10 * published by the Free Software Foundation, either version 3 of the | |
11 * License, or (at your option) any later version. | |
12 * | |
13 * This program is distributed in the hope that it will be useful, but | |
14 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
16 * General Public License for more details. | |
17 * | |
18 * You should have received a copy of the GNU General Public License | |
19 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
20 **/ | |
21 | |
22 | |
23 #if !defined(ORTHANC_BUILDING_SERVER_LIBRARY) | |
24 # error Macro ORTHANC_BUILDING_SERVER_LIBRARY must be defined | |
25 #endif | |
26 | |
27 #if ORTHANC_BUILDING_SERVER_LIBRARY == 1 | |
28 # include "../PrecompiledHeadersServer.h" | |
29 #endif | |
30 | |
31 #include "ISqlLookupFormatter.h" | |
32 | |
33 #if ORTHANC_BUILDING_SERVER_LIBRARY == 1 | |
34 # include "../../../OrthancFramework/Sources/OrthancException.h" | |
35 #else | |
36 # include <OrthancException.h> | |
37 #endif | |
38 | |
39 #include "DatabaseConstraint.h" | |
40 | |
170 | 41 #include <boost/lexical_cast.hpp> |
405 | 42 #include <list> |
414
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
43 #include <Toolbox.h> |
170 | 44 |
45 | |
152 | 46 namespace Orthanc |
47 { | |
48 static std::string FormatLevel(ResourceType level) | |
49 { | |
50 switch (level) | |
51 { | |
52 case ResourceType_Patient: | |
53 return "patients"; | |
54 | |
55 case ResourceType_Study: | |
56 return "studies"; | |
57 | |
58 case ResourceType_Series: | |
59 return "series"; | |
60 | |
61 case ResourceType_Instance: | |
62 return "instances"; | |
63 | |
64 default: | |
65 throw OrthancException(ErrorCode_InternalError); | |
66 } | |
67 } | |
68 | |
69 | |
70 static bool FormatComparison(std::string& target, | |
71 ISqlLookupFormatter& formatter, | |
72 const DatabaseConstraint& constraint, | |
354
2a3bbb4104fa
fix changeset 389c037387ea
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
353
diff
changeset
|
73 size_t index, |
2a3bbb4104fa
fix changeset 389c037387ea
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
353
diff
changeset
|
74 bool escapeBrackets) |
152 | 75 { |
76 std::string tag = "t" + boost::lexical_cast<std::string>(index); | |
77 | |
78 std::string comparison; | |
79 | |
80 switch (constraint.GetConstraintType()) | |
81 { | |
82 case ConstraintType_Equal: | |
83 case ConstraintType_SmallerOrEqual: | |
84 case ConstraintType_GreaterOrEqual: | |
85 { | |
86 std::string op; | |
87 switch (constraint.GetConstraintType()) | |
88 { | |
89 case ConstraintType_Equal: | |
90 op = "="; | |
91 break; | |
92 | |
93 case ConstraintType_SmallerOrEqual: | |
94 op = "<="; | |
95 break; | |
96 | |
97 case ConstraintType_GreaterOrEqual: | |
98 op = ">="; | |
99 break; | |
100 | |
101 default: | |
102 throw OrthancException(ErrorCode_InternalError); | |
103 } | |
104 | |
105 std::string parameter = formatter.GenerateParameter(constraint.GetSingleValue()); | |
106 | |
107 if (constraint.IsCaseSensitive()) | |
108 { | |
109 comparison = tag + ".value " + op + " " + parameter; | |
110 } | |
111 else | |
112 { | |
113 comparison = "lower(" + tag + ".value) " + op + " lower(" + parameter + ")"; | |
114 } | |
115 | |
116 break; | |
117 } | |
118 | |
119 case ConstraintType_List: | |
120 { | |
121 for (size_t i = 0; i < constraint.GetValuesCount(); i++) | |
122 { | |
123 if (!comparison.empty()) | |
124 { | |
125 comparison += ", "; | |
126 } | |
127 | |
128 std::string parameter = formatter.GenerateParameter(constraint.GetValue(i)); | |
129 | |
130 if (constraint.IsCaseSensitive()) | |
131 { | |
132 comparison += parameter; | |
133 } | |
134 else | |
135 { | |
136 comparison += "lower(" + parameter + ")"; | |
137 } | |
138 } | |
139 | |
140 if (constraint.IsCaseSensitive()) | |
141 { | |
142 comparison = tag + ".value IN (" + comparison + ")"; | |
143 } | |
144 else | |
145 { | |
146 comparison = "lower(" + tag + ".value) IN (" + comparison + ")"; | |
147 } | |
148 | |
149 break; | |
150 } | |
151 | |
152 case ConstraintType_Wildcard: | |
153 { | |
154 const std::string value = constraint.GetSingleValue(); | |
155 | |
156 if (value == "*") | |
157 { | |
158 if (!constraint.IsMandatory()) | |
159 { | |
160 // Universal constraint on an optional tag, ignore it | |
161 return false; | |
162 } | |
163 } | |
164 else | |
165 { | |
166 std::string escaped; | |
167 escaped.reserve(value.size()); | |
168 | |
169 for (size_t i = 0; i < value.size(); i++) | |
170 { | |
171 if (value[i] == '*') | |
172 { | |
173 escaped += "%"; | |
174 } | |
175 else if (value[i] == '?') | |
176 { | |
177 escaped += "_"; | |
178 } | |
179 else if (value[i] == '%') | |
180 { | |
181 escaped += "\\%"; | |
182 } | |
183 else if (value[i] == '_') | |
184 { | |
185 escaped += "\\_"; | |
186 } | |
187 else if (value[i] == '\\') | |
188 { | |
189 escaped += "\\\\"; | |
190 } | |
354
2a3bbb4104fa
fix changeset 389c037387ea
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
353
diff
changeset
|
191 else if (escapeBrackets && value[i] == '[') |
2a3bbb4104fa
fix changeset 389c037387ea
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
353
diff
changeset
|
192 { |
2a3bbb4104fa
fix changeset 389c037387ea
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
353
diff
changeset
|
193 escaped += "\\["; |
2a3bbb4104fa
fix changeset 389c037387ea
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
353
diff
changeset
|
194 } |
2a3bbb4104fa
fix changeset 389c037387ea
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
353
diff
changeset
|
195 else if (escapeBrackets && value[i] == ']') |
2a3bbb4104fa
fix changeset 389c037387ea
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
353
diff
changeset
|
196 { |
2a3bbb4104fa
fix changeset 389c037387ea
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
353
diff
changeset
|
197 escaped += "\\]"; |
2a3bbb4104fa
fix changeset 389c037387ea
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
353
diff
changeset
|
198 } |
152 | 199 else |
200 { | |
201 escaped += value[i]; | |
202 } | |
203 } | |
204 | |
205 std::string parameter = formatter.GenerateParameter(escaped); | |
206 | |
207 if (constraint.IsCaseSensitive()) | |
208 { | |
209 comparison = (tag + ".value LIKE " + parameter + " " + | |
210 formatter.FormatWildcardEscape()); | |
211 } | |
212 else | |
213 { | |
214 comparison = ("lower(" + tag + ".value) LIKE lower(" + | |
215 parameter + ") " + formatter.FormatWildcardEscape()); | |
216 } | |
217 } | |
218 | |
219 break; | |
220 } | |
221 | |
222 default: | |
223 return false; | |
224 } | |
225 | |
226 if (constraint.IsMandatory()) | |
227 { | |
228 target = comparison; | |
229 } | |
230 else if (comparison.empty()) | |
231 { | |
232 target = tag + ".value IS NULL"; | |
233 } | |
234 else | |
235 { | |
236 target = tag + ".value IS NULL OR " + comparison; | |
237 } | |
238 | |
239 return true; | |
240 } | |
241 | |
242 | |
243 static void FormatJoin(std::string& target, | |
244 const DatabaseConstraint& constraint, | |
245 size_t index) | |
246 { | |
247 std::string tag = "t" + boost::lexical_cast<std::string>(index); | |
248 | |
249 if (constraint.IsMandatory()) | |
250 { | |
251 target = " INNER JOIN "; | |
252 } | |
253 else | |
254 { | |
255 target = " LEFT JOIN "; | |
256 } | |
257 | |
258 if (constraint.IsIdentifier()) | |
259 { | |
260 target += "DicomIdentifiers "; | |
261 } | |
262 else | |
263 { | |
264 target += "MainDicomTags "; | |
265 } | |
266 | |
267 target += (tag + " ON " + tag + ".id = " + FormatLevel(constraint.GetLevel()) + | |
268 ".internalId AND " + tag + ".tagGroup = " + | |
269 boost::lexical_cast<std::string>(constraint.GetTag().GetGroup()) + | |
270 " AND " + tag + ".tagElement = " + | |
271 boost::lexical_cast<std::string>(constraint.GetTag().GetElement())); | |
272 } | |
405 | 273 |
274 | |
275 static std::string Join(const std::list<std::string>& values, | |
276 const std::string& prefix, | |
277 const std::string& separator) | |
278 { | |
279 if (values.empty()) | |
280 { | |
281 return ""; | |
282 } | |
283 else | |
284 { | |
285 std::string s = prefix; | |
286 | |
287 bool first = true; | |
288 for (std::list<std::string>::const_iterator it = values.begin(); it != values.end(); ++it) | |
289 { | |
290 if (first) | |
291 { | |
292 first = false; | |
293 } | |
294 else | |
295 { | |
296 s += separator; | |
297 } | |
298 | |
299 s += *it; | |
300 } | |
301 | |
302 return s; | |
303 } | |
304 } | |
414
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
305 |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
306 static bool FormatComparisonExperimental(std::string& target, |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
307 ISqlLookupFormatter& formatter, |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
308 const DatabaseConstraint& constraint, |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
309 //size_t index, |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
310 bool escapeBrackets) |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
311 { |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
312 //std::string tag = "t" + boost::lexical_cast<std::string>(index); |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
313 |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
314 std::string comparison; |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
315 std::string tagFilter = ("tagGroup = " + boost::lexical_cast<std::string>(constraint.GetTag().GetGroup()) |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
316 + " AND tagElement = " + boost::lexical_cast<std::string>(constraint.GetTag().GetElement())); |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
317 |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
318 switch (constraint.GetConstraintType()) |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
319 { |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
320 case ConstraintType_Equal: |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
321 case ConstraintType_SmallerOrEqual: |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
322 case ConstraintType_GreaterOrEqual: |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
323 { |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
324 std::string op; |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
325 switch (constraint.GetConstraintType()) |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
326 { |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
327 case ConstraintType_Equal: |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
328 op = "="; |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
329 break; |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
330 |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
331 case ConstraintType_SmallerOrEqual: |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
332 op = "<="; |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
333 break; |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
334 |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
335 case ConstraintType_GreaterOrEqual: |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
336 op = ">="; |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
337 break; |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
338 |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
339 default: |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
340 throw OrthancException(ErrorCode_InternalError); |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
341 } |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
342 |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
343 std::string parameter = formatter.GenerateParameter(constraint.GetSingleValue()); |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
344 |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
345 if (constraint.IsCaseSensitive()) |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
346 { |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
347 comparison = " AND value " + op + " " + parameter; |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
348 } |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
349 else |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
350 { |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
351 comparison = " AND lower(value) " + op + " lower(" + parameter + ")"; |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
352 } |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
353 |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
354 break; |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
355 } |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
356 |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
357 case ConstraintType_List: |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
358 { |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
359 std::vector<std::string> comparisonValues; |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
360 for (size_t i = 0; i < constraint.GetValuesCount(); i++) |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
361 { |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
362 std::string parameter = formatter.GenerateParameter(constraint.GetValue(i)); |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
363 |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
364 if (constraint.IsCaseSensitive()) |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
365 { |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
366 comparisonValues.push_back(parameter); |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
367 } |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
368 else |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
369 { |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
370 comparisonValues.push_back("lower(" + parameter + ")"); |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
371 } |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
372 } |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
373 |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
374 std::string values; |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
375 Toolbox::JoinStrings(values, comparisonValues, ", "); |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
376 |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
377 if (constraint.IsCaseSensitive()) |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
378 { |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
379 comparison = " AND value IN (" + values + ")"; |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
380 } |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
381 else |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
382 { |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
383 comparison = " AND lower(value) IN (" + values + ")"; |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
384 } |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
385 |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
386 break; |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
387 } |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
388 |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
389 case ConstraintType_Wildcard: |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
390 { |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
391 const std::string value = constraint.GetSingleValue(); |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
392 |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
393 if (value == "*") |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
394 { |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
395 if (!constraint.IsMandatory()) |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
396 { |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
397 // Universal constraint on an optional tag, ignore it |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
398 return false; |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
399 } |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
400 } |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
401 else |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
402 { |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
403 std::string escaped; |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
404 escaped.reserve(value.size()); |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
405 |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
406 for (size_t i = 0; i < value.size(); i++) |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
407 { |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
408 if (value[i] == '*') |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
409 { |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
410 escaped += "%"; |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
411 } |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
412 else if (value[i] == '?') |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
413 { |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
414 escaped += "_"; |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
415 } |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
416 else if (value[i] == '%') |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
417 { |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
418 escaped += "\\%"; |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
419 } |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
420 else if (value[i] == '_') |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
421 { |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
422 escaped += "\\_"; |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
423 } |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
424 else if (value[i] == '\\') |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
425 { |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
426 escaped += "\\\\"; |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
427 } |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
428 else if (escapeBrackets && value[i] == '[') |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
429 { |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
430 escaped += "\\["; |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
431 } |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
432 else if (escapeBrackets && value[i] == ']') |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
433 { |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
434 escaped += "\\]"; |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
435 } |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
436 else |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
437 { |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
438 escaped += value[i]; |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
439 } |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
440 } |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
441 |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
442 std::string parameter = formatter.GenerateParameter(escaped); |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
443 |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
444 if (constraint.IsCaseSensitive()) |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
445 { |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
446 comparison = " AND value LIKE " + parameter + " " + formatter.FormatWildcardEscape(); |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
447 } |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
448 else |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
449 { |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
450 comparison = " AND lower(value) LIKE lower(" + parameter + ") " + formatter.FormatWildcardEscape(); |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
451 } |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
452 } |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
453 |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
454 break; |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
455 } |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
456 |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
457 default: |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
458 return false; |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
459 } |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
460 |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
461 if (constraint.IsMandatory()) |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
462 { |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
463 target = tagFilter + comparison; |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
464 } |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
465 else if (comparison.empty()) |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
466 { |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
467 target = tagFilter + " AND value IS NULL"; |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
468 } |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
469 else |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
470 { |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
471 target = tagFilter + " AND value IS NULL OR " + comparison; |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
472 } |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
473 |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
474 return true; |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
475 } |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
476 |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
477 |
415
7e123f047771
LookupResources optimization continued
Alain Mazy <am@osimis.io>
parents:
414
diff
changeset
|
478 void ISqlLookupFormatter::GetLookupLevels(ResourceType& lowerLevel, ResourceType& upperLevel, const ResourceType& queryLevel, const std::vector<DatabaseConstraint>& lookup) |
152 | 479 { |
480 assert(ResourceType_Patient < ResourceType_Study && | |
481 ResourceType_Study < ResourceType_Series && | |
482 ResourceType_Series < ResourceType_Instance); | |
483 | |
415
7e123f047771
LookupResources optimization continued
Alain Mazy <am@osimis.io>
parents:
414
diff
changeset
|
484 lowerLevel = queryLevel; |
7e123f047771
LookupResources optimization continued
Alain Mazy <am@osimis.io>
parents:
414
diff
changeset
|
485 upperLevel = queryLevel; |
152 | 486 |
487 for (size_t i = 0; i < lookup.size(); i++) | |
488 { | |
489 ResourceType level = lookup[i].GetLevel(); | |
490 | |
491 if (level < upperLevel) | |
492 { | |
493 upperLevel = level; | |
494 } | |
495 | |
496 if (level > lowerLevel) | |
497 { | |
498 lowerLevel = level; | |
499 } | |
500 } | |
415
7e123f047771
LookupResources optimization continued
Alain Mazy <am@osimis.io>
parents:
414
diff
changeset
|
501 } |
7e123f047771
LookupResources optimization continued
Alain Mazy <am@osimis.io>
parents:
414
diff
changeset
|
502 |
7e123f047771
LookupResources optimization continued
Alain Mazy <am@osimis.io>
parents:
414
diff
changeset
|
503 |
7e123f047771
LookupResources optimization continued
Alain Mazy <am@osimis.io>
parents:
414
diff
changeset
|
504 void ISqlLookupFormatter::Apply(std::string& sql, |
7e123f047771
LookupResources optimization continued
Alain Mazy <am@osimis.io>
parents:
414
diff
changeset
|
505 ISqlLookupFormatter& formatter, |
7e123f047771
LookupResources optimization continued
Alain Mazy <am@osimis.io>
parents:
414
diff
changeset
|
506 const std::vector<DatabaseConstraint>& lookup, |
7e123f047771
LookupResources optimization continued
Alain Mazy <am@osimis.io>
parents:
414
diff
changeset
|
507 ResourceType queryLevel, |
7e123f047771
LookupResources optimization continued
Alain Mazy <am@osimis.io>
parents:
414
diff
changeset
|
508 const std::set<std::string>& labels, |
7e123f047771
LookupResources optimization continued
Alain Mazy <am@osimis.io>
parents:
414
diff
changeset
|
509 LabelsConstraint labelsConstraint, |
7e123f047771
LookupResources optimization continued
Alain Mazy <am@osimis.io>
parents:
414
diff
changeset
|
510 size_t limit) |
7e123f047771
LookupResources optimization continued
Alain Mazy <am@osimis.io>
parents:
414
diff
changeset
|
511 { |
7e123f047771
LookupResources optimization continued
Alain Mazy <am@osimis.io>
parents:
414
diff
changeset
|
512 ResourceType lowerLevel, upperLevel; |
7e123f047771
LookupResources optimization continued
Alain Mazy <am@osimis.io>
parents:
414
diff
changeset
|
513 GetLookupLevels(lowerLevel, upperLevel, queryLevel, lookup); |
7e123f047771
LookupResources optimization continued
Alain Mazy <am@osimis.io>
parents:
414
diff
changeset
|
514 |
152 | 515 assert(upperLevel <= queryLevel && |
516 queryLevel <= lowerLevel); | |
517 | |
354
2a3bbb4104fa
fix changeset 389c037387ea
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
353
diff
changeset
|
518 const bool escapeBrackets = formatter.IsEscapeBrackets(); |
2a3bbb4104fa
fix changeset 389c037387ea
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
353
diff
changeset
|
519 |
152 | 520 std::string joins, comparisons; |
521 | |
522 size_t count = 0; | |
523 | |
524 for (size_t i = 0; i < lookup.size(); i++) | |
525 { | |
526 std::string comparison; | |
527 | |
354
2a3bbb4104fa
fix changeset 389c037387ea
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
353
diff
changeset
|
528 if (FormatComparison(comparison, formatter, lookup[i], count, escapeBrackets)) |
152 | 529 { |
530 std::string join; | |
531 FormatJoin(join, lookup[i], count); | |
532 joins += join; | |
533 | |
534 if (!comparison.empty()) | |
535 { | |
536 comparisons += " AND " + comparison; | |
537 } | |
538 | |
539 count ++; | |
540 } | |
541 } | |
542 | |
543 sql = ("SELECT " + | |
544 FormatLevel(queryLevel) + ".publicId, " + | |
545 FormatLevel(queryLevel) + ".internalId" + | |
546 " FROM Resources AS " + FormatLevel(queryLevel)); | |
547 | |
548 for (int level = queryLevel - 1; level >= upperLevel; level--) | |
549 { | |
550 sql += (" INNER JOIN Resources " + | |
551 FormatLevel(static_cast<ResourceType>(level)) + " ON " + | |
552 FormatLevel(static_cast<ResourceType>(level)) + ".internalId=" + | |
553 FormatLevel(static_cast<ResourceType>(level + 1)) + ".parentId"); | |
554 } | |
555 | |
556 for (int level = queryLevel + 1; level <= lowerLevel; level++) | |
557 { | |
558 sql += (" INNER JOIN Resources " + | |
559 FormatLevel(static_cast<ResourceType>(level)) + " ON " + | |
560 FormatLevel(static_cast<ResourceType>(level - 1)) + ".internalId=" + | |
561 FormatLevel(static_cast<ResourceType>(level)) + ".parentId"); | |
562 } | |
405 | 563 |
564 std::list<std::string> where; | |
565 where.push_back(FormatLevel(queryLevel) + ".resourceType = " + | |
566 formatter.FormatResourceType(queryLevel) + comparisons); | |
567 | |
568 if (!labels.empty()) | |
569 { | |
570 /** | |
571 * "In SQL Server, NOT EXISTS and NOT IN predicates are the best | |
572 * way to search for missing values, as long as both columns in | |
573 * question are NOT NULL." | |
574 * https://explainextended.com/2009/09/15/not-in-vs-not-exists-vs-left-join-is-null-sql-server/ | |
575 **/ | |
576 | |
577 std::list<std::string> formattedLabels; | |
578 for (std::set<std::string>::const_iterator it = labels.begin(); it != labels.end(); ++it) | |
579 { | |
580 formattedLabels.push_back(formatter.GenerateParameter(*it)); | |
581 } | |
582 | |
583 std::string condition; | |
584 switch (labelsConstraint) | |
585 { | |
586 case LabelsConstraint_Any: | |
587 condition = "> 0"; | |
588 break; | |
589 | |
590 case LabelsConstraint_All: | |
591 condition = "= " + boost::lexical_cast<std::string>(labels.size()); | |
592 break; | |
593 | |
594 case LabelsConstraint_None: | |
595 condition = "= 0"; | |
596 break; | |
597 | |
598 default: | |
599 throw OrthancException(ErrorCode_ParameterOutOfRange); | |
600 } | |
152 | 601 |
405 | 602 where.push_back("(SELECT COUNT(1) FROM Labels AS selectedLabels WHERE selectedLabels.id = " + FormatLevel(queryLevel) + |
603 ".internalId AND selectedLabels.label IN (" + Join(formattedLabels, "", ", ") + ")) " + condition); | |
604 } | |
605 | |
606 sql += joins + Join(where, " WHERE ", " AND "); | |
152 | 607 |
608 if (limit != 0) | |
609 { | |
610 sql += " LIMIT " + boost::lexical_cast<std::string>(limit); | |
611 } | |
612 } | |
414
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
613 |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
614 |
415
7e123f047771
LookupResources optimization continued
Alain Mazy <am@osimis.io>
parents:
414
diff
changeset
|
615 void ISqlLookupFormatter::ApplySingleLevel(std::string& sql, |
7e123f047771
LookupResources optimization continued
Alain Mazy <am@osimis.io>
parents:
414
diff
changeset
|
616 ISqlLookupFormatter& formatter, |
7e123f047771
LookupResources optimization continued
Alain Mazy <am@osimis.io>
parents:
414
diff
changeset
|
617 const std::vector<DatabaseConstraint>& lookup, |
7e123f047771
LookupResources optimization continued
Alain Mazy <am@osimis.io>
parents:
414
diff
changeset
|
618 ResourceType queryLevel, |
7e123f047771
LookupResources optimization continued
Alain Mazy <am@osimis.io>
parents:
414
diff
changeset
|
619 const std::set<std::string>& labels, |
7e123f047771
LookupResources optimization continued
Alain Mazy <am@osimis.io>
parents:
414
diff
changeset
|
620 LabelsConstraint labelsConstraint, |
7e123f047771
LookupResources optimization continued
Alain Mazy <am@osimis.io>
parents:
414
diff
changeset
|
621 size_t limit |
7e123f047771
LookupResources optimization continued
Alain Mazy <am@osimis.io>
parents:
414
diff
changeset
|
622 ) |
414
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
623 { |
415
7e123f047771
LookupResources optimization continued
Alain Mazy <am@osimis.io>
parents:
414
diff
changeset
|
624 ResourceType lowerLevel, upperLevel; |
7e123f047771
LookupResources optimization continued
Alain Mazy <am@osimis.io>
parents:
414
diff
changeset
|
625 GetLookupLevels(lowerLevel, upperLevel, queryLevel, lookup); |
414
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
626 |
415
7e123f047771
LookupResources optimization continued
Alain Mazy <am@osimis.io>
parents:
414
diff
changeset
|
627 assert(upperLevel == queryLevel && |
7e123f047771
LookupResources optimization continued
Alain Mazy <am@osimis.io>
parents:
414
diff
changeset
|
628 queryLevel == lowerLevel); |
414
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
629 |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
630 const bool escapeBrackets = formatter.IsEscapeBrackets(); |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
631 |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
632 std::vector<std::string> mainDicomTagsComparisons, dicomIdentifiersComparisons; |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
633 |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
634 for (size_t i = 0; i < lookup.size(); i++) |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
635 { |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
636 std::string comparison; |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
637 |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
638 if (FormatComparisonExperimental(comparison, formatter, lookup[i], escapeBrackets)) |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
639 { |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
640 if (!comparison.empty()) |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
641 { |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
642 if (lookup[i].IsIdentifier()) |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
643 { |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
644 dicomIdentifiersComparisons.push_back(comparison); |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
645 } |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
646 else |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
647 { |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
648 mainDicomTagsComparisons.push_back(comparison); |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
649 } |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
650 } |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
651 } |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
652 } |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
653 |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
654 sql = ("SELECT publicId, internalId " |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
655 "FROM Resources " |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
656 "WHERE resourceType = " + formatter.FormatResourceType(queryLevel) |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
657 + " "); |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
658 |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
659 if (dicomIdentifiersComparisons.size() > 0) |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
660 { |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
661 std::string comparisons; |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
662 Toolbox::JoinStrings(comparisons, dicomIdentifiersComparisons, " AND "); |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
663 sql += (" AND internalId IN (SELECT id FROM DicomIdentifiers WHERE " |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
664 + comparisons + ") "); |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
665 } |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
666 |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
667 if (mainDicomTagsComparisons.size() > 0) |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
668 { |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
669 std::string comparisons; |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
670 Toolbox::JoinStrings(comparisons, mainDicomTagsComparisons, " AND "); |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
671 sql += (" AND internalId IN (SELECT id FROM MainDicomTags WHERE " |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
672 + comparisons + ") "); |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
673 } |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
674 |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
675 if (!labels.empty()) |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
676 { |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
677 /** |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
678 * "In SQL Server, NOT EXISTS and NOT IN predicates are the best |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
679 * way to search for missing values, as long as both columns in |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
680 * question are NOT NULL." |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
681 * https://explainextended.com/2009/09/15/not-in-vs-not-exists-vs-left-join-is-null-sql-server/ |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
682 **/ |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
683 |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
684 std::list<std::string> formattedLabels; |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
685 for (std::set<std::string>::const_iterator it = labels.begin(); it != labels.end(); ++it) |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
686 { |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
687 formattedLabels.push_back(formatter.GenerateParameter(*it)); |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
688 } |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
689 |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
690 std::string condition; |
415
7e123f047771
LookupResources optimization continued
Alain Mazy <am@osimis.io>
parents:
414
diff
changeset
|
691 std::string inOrNotIn; |
414
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
692 switch (labelsConstraint) |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
693 { |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
694 case LabelsConstraint_Any: |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
695 condition = "> 0"; |
415
7e123f047771
LookupResources optimization continued
Alain Mazy <am@osimis.io>
parents:
414
diff
changeset
|
696 inOrNotIn = "IN"; |
414
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
697 break; |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
698 |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
699 case LabelsConstraint_All: |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
700 condition = "= " + boost::lexical_cast<std::string>(labels.size()); |
415
7e123f047771
LookupResources optimization continued
Alain Mazy <am@osimis.io>
parents:
414
diff
changeset
|
701 inOrNotIn = "IN"; |
414
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
702 break; |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
703 |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
704 case LabelsConstraint_None: |
415
7e123f047771
LookupResources optimization continued
Alain Mazy <am@osimis.io>
parents:
414
diff
changeset
|
705 condition = "> 0"; |
7e123f047771
LookupResources optimization continued
Alain Mazy <am@osimis.io>
parents:
414
diff
changeset
|
706 inOrNotIn = "NOT IN"; |
414
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
707 break; |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
708 |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
709 default: |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
710 throw OrthancException(ErrorCode_ParameterOutOfRange); |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
711 } |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
712 |
415
7e123f047771
LookupResources optimization continued
Alain Mazy <am@osimis.io>
parents:
414
diff
changeset
|
713 sql += (" AND internalId " + inOrNotIn + " (SELECT id" |
414
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
714 " FROM (SELECT id, COUNT(1) AS labelsCount " |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
715 "FROM Labels " |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
716 "WHERE label IN (" + Join(formattedLabels, "", ", ") + ") GROUP BY id" |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
717 ") AS temp " |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
718 " WHERE labelsCount " + condition + ")"); |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
719 } |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
720 |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
721 if (limit != 0) |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
722 { |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
723 sql += " LIMIT " + boost::lexical_cast<std::string>(limit); |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
724 } |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
725 } |
f2d3b5c5a68d
Optimizing tools/find at studies level only. Integ Tests are ok with PG
Alain Mazy <am@osimis.io>
parents:
406
diff
changeset
|
726 |
152 | 727 } |