Mercurial > hg > orthanc
annotate OrthancServer/Sources/Search/ISqlLookupFormatter.cpp @ 5825:881cd0965146 find-refactoring
added OrderBy support in SQLite
author | Alain Mazy <am@orthanc.team> |
---|---|
date | Fri, 04 Oct 2024 19:03:14 +0200 |
parents | 16ce3c920f71 |
children | d73dfb4548c6 |
rev | line source |
---|---|
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1 /** |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2 * Orthanc - A Lightweight, RESTful DICOM Store |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
4 * Department, University Hospital of Liege, Belgium |
5640
f7adfb22e20e
updated copyright, as Orthanc Team now replaces Osimis
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5485
diff
changeset
|
5 * Copyright (C) 2017-2023 Osimis S.A., Belgium |
f7adfb22e20e
updated copyright, as Orthanc Team now replaces Osimis
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5485
diff
changeset
|
6 * Copyright (C) 2024-2024 Orthanc Team SRL, Belgium |
5485
48b8dae6dc77
upgrade to year 2024
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5477
diff
changeset
|
7 * Copyright (C) 2021-2024 Sebastien Jodogne, ICTEAM UCLouvain, Belgium |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
8 * |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
9 * This program is free software: you can redistribute it and/or |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
10 * modify it under the terms of the GNU General Public License as |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
11 * published by the Free Software Foundation, either version 3 of the |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
12 * License, or (at your option) any later version. |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
13 * |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
14 * This program is distributed in the hope that it will be useful, but |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
15 * WITHOUT ANY WARRANTY; without even the implied warranty of |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
17 * General Public License for more details. |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
18 * |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
19 * You should have received a copy of the GNU General Public License |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
20 * along with this program. If not, see <http://www.gnu.org/licenses/>. |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
21 **/ |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
22 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
23 |
5765
247fc5368693
un-sharing DatabaseConstraint and ISqlLookupFormatter with orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5762
diff
changeset
|
24 #include "../PrecompiledHeadersServer.h" |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
25 #include "ISqlLookupFormatter.h" |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
26 |
5765
247fc5368693
un-sharing DatabaseConstraint and ISqlLookupFormatter with orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5762
diff
changeset
|
27 #include "../../../OrthancFramework/Sources/OrthancException.h" |
247fc5368693
un-sharing DatabaseConstraint and ISqlLookupFormatter with orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5762
diff
changeset
|
28 #include "../../../OrthancFramework/Sources/Toolbox.h" |
247fc5368693
un-sharing DatabaseConstraint and ISqlLookupFormatter with orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5762
diff
changeset
|
29 #include "../Database/FindRequest.h" |
3100
f6de9d25b20d
removing build dependency on plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3079
diff
changeset
|
30 #include "DatabaseConstraint.h" |
5825
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
31 #include "../Database/MainDicomTagsRegistry.h" |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
32 |
5477 | 33 #include <cassert> |
4304 | 34 #include <boost/lexical_cast.hpp> |
5227
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
35 #include <list> |
4304 | 36 |
37 | |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
38 namespace Orthanc |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
39 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
40 static std::string FormatLevel(ResourceType level) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
41 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
42 switch (level) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
43 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
44 case ResourceType_Patient: |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
45 return "patients"; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
46 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
47 case ResourceType_Study: |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
48 return "studies"; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
49 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
50 case ResourceType_Series: |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
51 return "series"; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
52 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
53 case ResourceType_Instance: |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
54 return "instances"; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
55 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
56 default: |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
57 throw OrthancException(ErrorCode_InternalError); |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
58 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
59 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
60 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
61 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
62 static bool FormatComparison(std::string& target, |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
63 ISqlLookupFormatter& formatter, |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
64 const DatabaseConstraint& constraint, |
4817
b8fcd331b4b3
added ISqlLookupFormatter::IsEscapeBrackets()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
65 size_t index, |
b8fcd331b4b3
added ISqlLookupFormatter::IsEscapeBrackets()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
66 bool escapeBrackets) |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
67 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
68 std::string tag = "t" + boost::lexical_cast<std::string>(index); |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
69 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
70 std::string comparison; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
71 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
72 switch (constraint.GetConstraintType()) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
73 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
74 case ConstraintType_Equal: |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
75 case ConstraintType_SmallerOrEqual: |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
76 case ConstraintType_GreaterOrEqual: |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
77 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
78 std::string op; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
79 switch (constraint.GetConstraintType()) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
80 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
81 case ConstraintType_Equal: |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
82 op = "="; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
83 break; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
84 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
85 case ConstraintType_SmallerOrEqual: |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
86 op = "<="; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
87 break; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
88 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
89 case ConstraintType_GreaterOrEqual: |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
90 op = ">="; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
91 break; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
92 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
93 default: |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
94 throw OrthancException(ErrorCode_InternalError); |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
95 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
96 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
97 std::string parameter = formatter.GenerateParameter(constraint.GetSingleValue()); |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
98 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
99 if (constraint.IsCaseSensitive()) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
100 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
101 comparison = tag + ".value " + op + " " + parameter; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
102 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
103 else |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
104 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
105 comparison = "lower(" + tag + ".value) " + op + " lower(" + parameter + ")"; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
106 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
107 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
108 break; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
109 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
110 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
111 case ConstraintType_List: |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
112 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
113 for (size_t i = 0; i < constraint.GetValuesCount(); i++) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
114 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
115 if (!comparison.empty()) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
116 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
117 comparison += ", "; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
118 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
119 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
120 std::string parameter = formatter.GenerateParameter(constraint.GetValue(i)); |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
121 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
122 if (constraint.IsCaseSensitive()) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
123 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
124 comparison += parameter; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
125 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
126 else |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
127 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
128 comparison += "lower(" + parameter + ")"; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
129 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
130 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
131 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
132 if (constraint.IsCaseSensitive()) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
133 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
134 comparison = tag + ".value IN (" + comparison + ")"; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
135 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
136 else |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
137 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
138 comparison = "lower(" + tag + ".value) IN (" + comparison + ")"; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
139 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
140 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
141 break; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
142 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
143 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
144 case ConstraintType_Wildcard: |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
145 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
146 const std::string value = constraint.GetSingleValue(); |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
147 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
148 if (value == "*") |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
149 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
150 if (!constraint.IsMandatory()) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
151 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
152 // Universal constraint on an optional tag, ignore it |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
153 return false; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
154 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
155 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
156 else |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
157 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
158 std::string escaped; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
159 escaped.reserve(value.size()); |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
160 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
161 for (size_t i = 0; i < value.size(); i++) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
162 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
163 if (value[i] == '*') |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
164 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
165 escaped += "%"; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
166 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
167 else if (value[i] == '?') |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
168 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
169 escaped += "_"; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
170 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
171 else if (value[i] == '%') |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
172 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
173 escaped += "\\%"; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
174 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
175 else if (value[i] == '_') |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
176 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
177 escaped += "\\_"; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
178 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
179 else if (value[i] == '\\') |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
180 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
181 escaped += "\\\\"; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
182 } |
4817
b8fcd331b4b3
added ISqlLookupFormatter::IsEscapeBrackets()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
183 else if (escapeBrackets && value[i] == '[') |
b8fcd331b4b3
added ISqlLookupFormatter::IsEscapeBrackets()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
184 { |
b8fcd331b4b3
added ISqlLookupFormatter::IsEscapeBrackets()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
185 escaped += "\\["; |
b8fcd331b4b3
added ISqlLookupFormatter::IsEscapeBrackets()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
186 } |
b8fcd331b4b3
added ISqlLookupFormatter::IsEscapeBrackets()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
187 else if (escapeBrackets && value[i] == ']') |
b8fcd331b4b3
added ISqlLookupFormatter::IsEscapeBrackets()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
188 { |
b8fcd331b4b3
added ISqlLookupFormatter::IsEscapeBrackets()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
189 escaped += "\\]"; |
b8fcd331b4b3
added ISqlLookupFormatter::IsEscapeBrackets()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
190 } |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
191 else |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
192 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
193 escaped += value[i]; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
194 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
195 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
196 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
197 std::string parameter = formatter.GenerateParameter(escaped); |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
198 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
199 if (constraint.IsCaseSensitive()) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
200 { |
3079
65e2bfa953ef
ISqlLookupFormatter::FormatWildcardEscape()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3078
diff
changeset
|
201 comparison = (tag + ".value LIKE " + parameter + " " + |
65e2bfa953ef
ISqlLookupFormatter::FormatWildcardEscape()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3078
diff
changeset
|
202 formatter.FormatWildcardEscape()); |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
203 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
204 else |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
205 { |
3079
65e2bfa953ef
ISqlLookupFormatter::FormatWildcardEscape()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3078
diff
changeset
|
206 comparison = ("lower(" + tag + ".value) LIKE lower(" + |
65e2bfa953ef
ISqlLookupFormatter::FormatWildcardEscape()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3078
diff
changeset
|
207 parameter + ") " + formatter.FormatWildcardEscape()); |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
208 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
209 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
210 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
211 break; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
212 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
213 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
214 default: |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
215 return false; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
216 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
217 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
218 if (constraint.IsMandatory()) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
219 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
220 target = comparison; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
221 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
222 else if (comparison.empty()) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
223 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
224 target = tag + ".value IS NULL"; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
225 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
226 else |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
227 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
228 target = tag + ".value IS NULL OR " + comparison; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
229 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
230 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
231 return true; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
232 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
233 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
234 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
235 static void FormatJoin(std::string& target, |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
236 const DatabaseConstraint& constraint, |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
237 size_t index) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
238 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
239 std::string tag = "t" + boost::lexical_cast<std::string>(index); |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
240 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
241 if (constraint.IsMandatory()) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
242 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
243 target = " INNER JOIN "; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
244 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
245 else |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
246 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
247 target = " LEFT JOIN "; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
248 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
249 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
250 if (constraint.IsIdentifier()) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
251 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
252 target += "DicomIdentifiers "; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
253 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
254 else |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
255 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
256 target += "MainDicomTags "; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
257 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
258 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
259 target += (tag + " ON " + tag + ".id = " + FormatLevel(constraint.GetLevel()) + |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
260 ".internalId AND " + tag + ".tagGroup = " + |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
261 boost::lexical_cast<std::string>(constraint.GetTag().GetGroup()) + |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
262 " AND " + tag + ".tagElement = " + |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
263 boost::lexical_cast<std::string>(constraint.GetTag().GetElement())); |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
264 } |
5227
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
265 |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
266 |
5825
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
267 static void FormatJoinForOrdering(std::string& target, |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
268 const DicomTag& tag, |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
269 size_t index, |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
270 ResourceType requestLevel) |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
271 { |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
272 std::string orderArg = "order" + boost::lexical_cast<std::string>(index); |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
273 |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
274 target.clear(); |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
275 |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
276 ResourceType tagLevel; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
277 DicomTagType tagType; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
278 MainDicomTagsRegistry registry; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
279 |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
280 registry.LookupTag(tagLevel, tagType, tag); |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
281 |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
282 if (tagLevel == ResourceType_Patient && requestLevel == ResourceType_Study) |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
283 { // Patient tags are copied at study level |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
284 tagLevel = ResourceType_Study; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
285 } |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
286 |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
287 std::string tagTable; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
288 if (tagType == DicomTagType_Identifier) |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
289 { |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
290 tagTable = "DicomIdentifiers "; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
291 } |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
292 else |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
293 { |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
294 tagTable = "MainDicomTags "; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
295 } |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
296 |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
297 std::string tagFilter = orderArg + ".tagGroup = " + boost::lexical_cast<std::string>(tag.GetGroup()) + " AND " + orderArg + ".tagElement = " + boost::lexical_cast<std::string>(tag.GetElement()); |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
298 |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
299 if (tagLevel == requestLevel) |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
300 { |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
301 target = " LEFT JOIN " + tagTable + " " + orderArg + " ON " + orderArg + ".id = " + FormatLevel(requestLevel) + |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
302 ".internalId AND " + tagFilter; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
303 } |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
304 else if (static_cast<int32_t>(requestLevel) - static_cast<int32_t>(tagLevel) == 1) |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
305 { |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
306 target = " INNER JOIN Resources " + orderArg + "parent ON " + orderArg + "parent.internalId = " + FormatLevel(requestLevel) + ".parentId " |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
307 " LEFT JOIN " + tagTable + " " + orderArg + " ON " + orderArg + ".id = " + orderArg + "parent.internalId AND " + tagFilter; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
308 } |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
309 else if (static_cast<int32_t>(requestLevel) - static_cast<int32_t>(tagLevel) == 2) |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
310 { |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
311 target = " INNER JOIN Resources " + orderArg + "parent ON " + orderArg + "parent.internalId = " + FormatLevel(requestLevel) + ".parentId " |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
312 " INNER JOIN Resources " + orderArg + "grandparent ON " + orderArg + "grandparent.internalId = " + orderArg + "parent.parentId " |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
313 " LEFT JOIN " + tagTable + " " + orderArg + " ON " + orderArg + ".id = " + orderArg + "grandparent.internalId AND " + tagFilter; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
314 } |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
315 else if (static_cast<int32_t>(requestLevel) - static_cast<int32_t>(tagLevel) == 3) |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
316 { |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
317 target = " INNER JOIN Resources " + orderArg + "parent ON " + orderArg + "parent.internalId = " + FormatLevel(requestLevel) + ".parentId " |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
318 " INNER JOIN Resources " + orderArg + "grandparent ON " + orderArg + "grandparent.internalId = " + orderArg + "parent.parentId " |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
319 " INNER JOIN Resources " + orderArg + "grandgrandparent ON " + orderArg + "grandgrandparent.internalId = " + orderArg + "grandparent.parentId " |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
320 " LEFT JOIN " + tagTable + " " + orderArg + " ON " + orderArg + ".id = " + orderArg + "grandgrandparent.internalId AND " + tagFilter; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
321 } |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
322 } |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
323 |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
324 static void FormatJoinForOrdering(std::string& target, |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
325 const MetadataType& metadata, |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
326 size_t index, |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
327 ResourceType requestLevel) |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
328 { |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
329 std::string arg = "order" + boost::lexical_cast<std::string>(index); |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
330 |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
331 |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
332 target = " INNER JOIN Metadata " + arg + " ON " + arg + ".id = " + FormatLevel(requestLevel) + |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
333 ".internalId AND " + arg + ".type = " + |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
334 boost::lexical_cast<std::string>(metadata); |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
335 } |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
336 |
5227
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
337 static std::string Join(const std::list<std::string>& values, |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
338 const std::string& prefix, |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
339 const std::string& separator) |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
340 { |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
341 if (values.empty()) |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
342 { |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
343 return ""; |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
344 } |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
345 else |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
346 { |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
347 std::string s = prefix; |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
348 |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
349 bool first = true; |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
350 for (std::list<std::string>::const_iterator it = values.begin(); it != values.end(); ++it) |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
351 { |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
352 if (first) |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
353 { |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
354 first = false; |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
355 } |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
356 else |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
357 { |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
358 s += separator; |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
359 } |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
360 |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
361 s += *it; |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
362 } |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
363 |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
364 return s; |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
365 } |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
366 } |
5422 | 367 |
368 static bool FormatComparison2(std::string& target, | |
369 ISqlLookupFormatter& formatter, | |
370 const DatabaseConstraint& constraint, | |
371 bool escapeBrackets) | |
372 { | |
373 std::string comparison; | |
374 std::string tagFilter = ("tagGroup = " + boost::lexical_cast<std::string>(constraint.GetTag().GetGroup()) | |
375 + " AND tagElement = " + boost::lexical_cast<std::string>(constraint.GetTag().GetElement())); | |
376 | |
377 switch (constraint.GetConstraintType()) | |
378 { | |
379 case ConstraintType_Equal: | |
380 case ConstraintType_SmallerOrEqual: | |
381 case ConstraintType_GreaterOrEqual: | |
382 { | |
383 std::string op; | |
384 switch (constraint.GetConstraintType()) | |
385 { | |
386 case ConstraintType_Equal: | |
387 op = "="; | |
388 break; | |
389 | |
390 case ConstraintType_SmallerOrEqual: | |
391 op = "<="; | |
392 break; | |
393 | |
394 case ConstraintType_GreaterOrEqual: | |
395 op = ">="; | |
396 break; | |
397 | |
398 default: | |
399 throw OrthancException(ErrorCode_InternalError); | |
400 } | |
401 | |
402 std::string parameter = formatter.GenerateParameter(constraint.GetSingleValue()); | |
403 | |
404 if (constraint.IsCaseSensitive()) | |
405 { | |
406 comparison = " AND value " + op + " " + parameter; | |
407 } | |
408 else | |
409 { | |
410 comparison = " AND lower(value) " + op + " lower(" + parameter + ")"; | |
411 } | |
412 | |
413 break; | |
414 } | |
415 | |
416 case ConstraintType_List: | |
417 { | |
418 std::vector<std::string> comparisonValues; | |
419 for (size_t i = 0; i < constraint.GetValuesCount(); i++) | |
420 { | |
421 std::string parameter = formatter.GenerateParameter(constraint.GetValue(i)); | |
422 | |
423 if (constraint.IsCaseSensitive()) | |
424 { | |
425 comparisonValues.push_back(parameter); | |
426 } | |
427 else | |
428 { | |
429 comparisonValues.push_back("lower(" + parameter + ")"); | |
430 } | |
431 } | |
432 | |
433 std::string values; | |
434 Toolbox::JoinStrings(values, comparisonValues, ", "); | |
435 | |
436 if (constraint.IsCaseSensitive()) | |
437 { | |
438 comparison = " AND value IN (" + values + ")"; | |
439 } | |
440 else | |
441 { | |
442 comparison = " AND lower(value) IN (" + values + ")"; | |
443 } | |
444 | |
445 break; | |
446 } | |
447 | |
448 case ConstraintType_Wildcard: | |
449 { | |
450 const std::string value = constraint.GetSingleValue(); | |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
451 |
5422 | 452 if (value == "*") |
453 { | |
454 if (!constraint.IsMandatory()) | |
455 { | |
456 // Universal constraint on an optional tag, ignore it | |
457 return false; | |
458 } | |
459 } | |
460 else | |
461 { | |
462 std::string escaped; | |
463 escaped.reserve(value.size()); | |
464 | |
465 for (size_t i = 0; i < value.size(); i++) | |
466 { | |
467 if (value[i] == '*') | |
468 { | |
469 escaped += "%"; | |
470 } | |
471 else if (value[i] == '?') | |
472 { | |
473 escaped += "_"; | |
474 } | |
475 else if (value[i] == '%') | |
476 { | |
477 escaped += "\\%"; | |
478 } | |
479 else if (value[i] == '_') | |
480 { | |
481 escaped += "\\_"; | |
482 } | |
483 else if (value[i] == '\\') | |
484 { | |
485 escaped += "\\\\"; | |
486 } | |
487 else if (escapeBrackets && value[i] == '[') | |
488 { | |
489 escaped += "\\["; | |
490 } | |
491 else if (escapeBrackets && value[i] == ']') | |
492 { | |
493 escaped += "\\]"; | |
494 } | |
495 else | |
496 { | |
497 escaped += value[i]; | |
498 } | |
499 } | |
500 | |
501 std::string parameter = formatter.GenerateParameter(escaped); | |
502 | |
503 if (constraint.IsCaseSensitive()) | |
504 { | |
505 comparison = " AND value LIKE " + parameter + " " + formatter.FormatWildcardEscape(); | |
506 } | |
507 else | |
508 { | |
509 comparison = " AND lower(value) LIKE lower(" + parameter + ") " + formatter.FormatWildcardEscape(); | |
510 } | |
511 } | |
512 | |
513 break; | |
514 } | |
515 | |
516 default: | |
517 return false; | |
518 } | |
519 | |
520 if (constraint.IsMandatory()) | |
521 { | |
522 target = tagFilter + comparison; | |
523 } | |
524 else if (comparison.empty()) | |
525 { | |
526 target = tagFilter + " AND value IS NULL"; | |
527 } | |
528 else | |
529 { | |
530 target = tagFilter + " AND value IS NULL OR " + comparison; | |
531 } | |
532 | |
533 return true; | |
534 } | |
535 | |
536 | |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
537 void ISqlLookupFormatter::GetLookupLevels(ResourceType& lowerLevel, |
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
538 ResourceType& upperLevel, |
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
539 const ResourceType& queryLevel, |
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
540 const DatabaseConstraints& lookup) |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
541 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
542 assert(ResourceType_Patient < ResourceType_Study && |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
543 ResourceType_Study < ResourceType_Series && |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
544 ResourceType_Series < ResourceType_Instance); |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
545 |
5422 | 546 lowerLevel = queryLevel; |
547 upperLevel = queryLevel; | |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
548 |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
549 for (size_t i = 0; i < lookup.GetSize(); i++) |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
550 { |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
551 ResourceType level = lookup.GetConstraint(i).GetLevel(); |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
552 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
553 if (level < upperLevel) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
554 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
555 upperLevel = level; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
556 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
557 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
558 if (level > lowerLevel) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
559 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
560 lowerLevel = level; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
561 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
562 } |
5422 | 563 } |
564 | |
565 | |
566 void ISqlLookupFormatter::Apply(std::string& sql, | |
567 ISqlLookupFormatter& formatter, | |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
568 const DatabaseConstraints& lookup, |
5422 | 569 ResourceType queryLevel, |
570 const std::set<std::string>& labels, | |
571 LabelsConstraint labelsConstraint, | |
572 size_t limit) | |
573 { | |
574 ResourceType lowerLevel, upperLevel; | |
575 GetLookupLevels(lowerLevel, upperLevel, queryLevel, lookup); | |
576 | |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
577 assert(upperLevel <= queryLevel && |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
578 queryLevel <= lowerLevel); |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
579 |
4817
b8fcd331b4b3
added ISqlLookupFormatter::IsEscapeBrackets()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
580 const bool escapeBrackets = formatter.IsEscapeBrackets(); |
b8fcd331b4b3
added ISqlLookupFormatter::IsEscapeBrackets()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
581 |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
582 std::string joins, comparisons; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
583 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
584 size_t count = 0; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
585 |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
586 for (size_t i = 0; i < lookup.GetSize(); i++) |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
587 { |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
588 const DatabaseConstraint& constraint = lookup.GetConstraint(i); |
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
589 |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
590 std::string comparison; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
591 |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
592 if (FormatComparison(comparison, formatter, constraint, count, escapeBrackets)) |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
593 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
594 std::string join; |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
595 FormatJoin(join, constraint, count); |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
596 joins += join; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
597 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
598 if (!comparison.empty()) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
599 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
600 comparisons += " AND " + comparison; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
601 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
602 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
603 count ++; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
604 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
605 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
606 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
607 sql = ("SELECT " + |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
608 FormatLevel(queryLevel) + ".publicId, " + |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
609 FormatLevel(queryLevel) + ".internalId" + |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
610 " FROM Resources AS " + FormatLevel(queryLevel)); |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
611 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
612 for (int level = queryLevel - 1; level >= upperLevel; level--) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
613 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
614 sql += (" INNER JOIN Resources " + |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
615 FormatLevel(static_cast<ResourceType>(level)) + " ON " + |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
616 FormatLevel(static_cast<ResourceType>(level)) + ".internalId=" + |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
617 FormatLevel(static_cast<ResourceType>(level + 1)) + ".parentId"); |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
618 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
619 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
620 for (int level = queryLevel + 1; level <= lowerLevel; level++) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
621 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
622 sql += (" INNER JOIN Resources " + |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
623 FormatLevel(static_cast<ResourceType>(level)) + " ON " + |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
624 FormatLevel(static_cast<ResourceType>(level - 1)) + ".internalId=" + |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
625 FormatLevel(static_cast<ResourceType>(level)) + ".parentId"); |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
626 } |
5227
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
627 |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
628 std::list<std::string> where; |
5256 | 629 where.push_back(FormatLevel(queryLevel) + ".resourceType = " + |
630 formatter.FormatResourceType(queryLevel) + comparisons); | |
5227
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
631 |
5248
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
632 if (!labels.empty()) |
5227
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
633 { |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
634 /** |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
635 * "In SQL Server, NOT EXISTS and NOT IN predicates are the best |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
636 * way to search for missing values, as long as both columns in |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
637 * question are NOT NULL." |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
638 * https://explainextended.com/2009/09/15/not-in-vs-not-exists-vs-left-join-is-null-sql-server/ |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
639 **/ |
5248
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
640 |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
641 std::list<std::string> formattedLabels; |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
642 for (std::set<std::string>::const_iterator it = labels.begin(); it != labels.end(); ++it) |
5227
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
643 { |
5248
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
644 formattedLabels.push_back(formatter.GenerateParameter(*it)); |
5227
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
645 } |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
646 |
5248
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
647 std::string condition; |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
648 switch (labelsConstraint) |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
649 { |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
650 case LabelsConstraint_Any: |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
651 condition = "> 0"; |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
652 break; |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
653 |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
654 case LabelsConstraint_All: |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
655 condition = "= " + boost::lexical_cast<std::string>(labels.size()); |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
656 break; |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
657 |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
658 case LabelsConstraint_None: |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
659 condition = "= 0"; |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
660 break; |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
661 |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
662 default: |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
663 throw OrthancException(ErrorCode_ParameterOutOfRange); |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
664 } |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
665 |
5256 | 666 where.push_back("(SELECT COUNT(1) FROM Labels AS selectedLabels WHERE selectedLabels.id = " + FormatLevel(queryLevel) + |
667 ".internalId AND selectedLabels.label IN (" + Join(formattedLabels, "", ", ") + ")) " + condition); | |
5227
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
668 } |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
669 |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
670 sql += joins + Join(where, " WHERE ", " AND "); |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
671 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
672 if (limit != 0) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
673 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
674 sql += " LIMIT " + boost::lexical_cast<std::string>(limit); |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
675 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
676 } |
5422 | 677 |
5765
247fc5368693
un-sharing DatabaseConstraint and ISqlLookupFormatter with orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5762
diff
changeset
|
678 |
5748
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
679 void ISqlLookupFormatter::Apply(std::string& sql, |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
680 ISqlLookupFormatter& formatter, |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
681 const FindRequest& request) |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
682 { |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
683 const bool escapeBrackets = formatter.IsEscapeBrackets(); |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
684 ResourceType queryLevel = request.GetLevel(); |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
685 const std::string& strQueryLevel = FormatLevel(queryLevel); |
5750
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
686 |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
687 ResourceType lowerLevel, upperLevel; |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
688 GetLookupLevels(lowerLevel, upperLevel, queryLevel, request.GetDicomTagConstraints()); |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
689 |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
690 assert(upperLevel <= queryLevel && |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
691 queryLevel <= lowerLevel); |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
692 |
5825
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
693 std::string ordering; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
694 std::string orderingJoins; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
695 |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
696 if (request.GetOrdering().size() > 0) |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
697 { |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
698 int counter = 0; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
699 std::vector<std::string> orderByFields; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
700 for (std::deque<FindRequest::Ordering*>::const_iterator it = request.GetOrdering().begin(); it != request.GetOrdering().end(); ++it) |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
701 { |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
702 std::string orderingJoin; |
5796
16ce3c920f71
rewrote SQLite find using CTEs instead of temporary tables
Alain Mazy <am@orthanc.team>
parents:
5765
diff
changeset
|
703 |
5825
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
704 switch ((*it)->GetKeyType()) |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
705 { |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
706 case FindRequest::KeyType_DicomTag: |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
707 FormatJoinForOrdering(orderingJoin, (*it)->GetDicomTag(), counter, request.GetLevel()); |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
708 break; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
709 case FindRequest::KeyType_Metadata: |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
710 FormatJoinForOrdering(orderingJoin, (*it)->GetMetadataType(), counter, request.GetLevel()); |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
711 break; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
712 default: |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
713 throw OrthancException(ErrorCode_InternalError); |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
714 } |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
715 orderingJoins += orderingJoin; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
716 |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
717 std::string orderByField = "order" + boost::lexical_cast<std::string>(counter) + ".value"; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
718 if ((*it)->GetDirection() == FindRequest::OrderingDirection_Ascending) |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
719 { |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
720 orderByField += " ASC"; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
721 } |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
722 else |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
723 { |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
724 orderByField += " DESC"; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
725 } |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
726 orderByFields.push_back(orderByField); |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
727 ++counter; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
728 } |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
729 |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
730 std::string orderByFieldsString; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
731 Toolbox::JoinStrings(orderByFieldsString, orderByFields, ", "); |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
732 ordering = "ROW_NUMBER() OVER (ORDER BY " + orderByFieldsString + ") AS rowNumber"; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
733 } |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
734 else |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
735 { |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
736 ordering = "ROW_NUMBER() OVER (ORDER BY " + strQueryLevel + ".publicId) AS rowNumber"; // we need a default ordering in order to make default queries repeatable when using since&limit |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
737 } |
5750
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
738 |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
739 sql = ("SELECT " + |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
740 strQueryLevel + ".publicId, " + |
5796
16ce3c920f71
rewrote SQLite find using CTEs instead of temporary tables
Alain Mazy <am@orthanc.team>
parents:
5765
diff
changeset
|
741 strQueryLevel + ".internalId, " + |
16ce3c920f71
rewrote SQLite find using CTEs instead of temporary tables
Alain Mazy <am@orthanc.team>
parents:
5765
diff
changeset
|
742 ordering + |
5750
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
743 " FROM Resources AS " + strQueryLevel); |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
744 |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
745 |
5748
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
746 std::string joins, comparisons; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
747 |
5750
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
748 if (request.GetOrthancIdentifiers().IsDefined() && request.GetOrthancIdentifiers().DetectLevel() <= queryLevel) |
5748
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
749 { |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
750 // single child resource matching, there should not be other constraints (at least for now) |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
751 assert(request.GetDicomTagConstraints().GetSize() == 0); |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
752 assert(request.GetLabels().size() == 0); |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
753 assert(request.HasLimits() == false); |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
754 |
5750
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
755 ResourceType topParentLevel = request.GetOrthancIdentifiers().DetectLevel(); |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
756 const std::string& strTopParentLevel = FormatLevel(topParentLevel); |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
757 |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
758 comparisons = " AND " + strTopParentLevel + ".publicId = " + formatter.GenerateParameter(request.GetOrthancIdentifiers().GetLevel(topParentLevel)); |
5748
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
759 |
5750
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
760 for (int level = queryLevel; level > topParentLevel; level--) |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
761 { |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
762 sql += (" INNER JOIN Resources " + |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
763 FormatLevel(static_cast<ResourceType>(level - 1)) + " ON " + |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
764 FormatLevel(static_cast<ResourceType>(level - 1)) + ".internalId=" + |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
765 FormatLevel(static_cast<ResourceType>(level)) + ".parentId"); |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
766 } |
5748
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
767 } |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
768 else |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
769 { |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
770 size_t count = 0; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
771 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
772 const DatabaseConstraints& dicomTagsConstraints = request.GetDicomTagConstraints(); |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
773 for (size_t i = 0; i < dicomTagsConstraints.GetSize(); i++) |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
774 { |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
775 const DatabaseConstraint& constraint = dicomTagsConstraints.GetConstraint(i); |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
776 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
777 std::string comparison; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
778 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
779 if (FormatComparison(comparison, formatter, constraint, count, escapeBrackets)) |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
780 { |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
781 std::string join; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
782 FormatJoin(join, constraint, count); |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
783 joins += join; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
784 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
785 if (!comparison.empty()) |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
786 { |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
787 comparisons += " AND " + comparison; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
788 } |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
789 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
790 count ++; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
791 } |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
792 } |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
793 } |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
794 |
5750
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
795 for (int level = queryLevel - 1; level >= upperLevel; level--) |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
796 { |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
797 sql += (" INNER JOIN Resources " + |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
798 FormatLevel(static_cast<ResourceType>(level)) + " ON " + |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
799 FormatLevel(static_cast<ResourceType>(level)) + ".internalId=" + |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
800 FormatLevel(static_cast<ResourceType>(level + 1)) + ".parentId"); |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
801 } |
5748
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
802 |
5750
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
803 for (int level = queryLevel + 1; level <= lowerLevel; level++) |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
804 { |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
805 sql += (" INNER JOIN Resources " + |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
806 FormatLevel(static_cast<ResourceType>(level)) + " ON " + |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
807 FormatLevel(static_cast<ResourceType>(level - 1)) + ".internalId=" + |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
808 FormatLevel(static_cast<ResourceType>(level)) + ".parentId"); |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
809 } |
5748
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
810 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
811 std::list<std::string> where; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
812 where.push_back(strQueryLevel + ".resourceType = " + |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
813 formatter.FormatResourceType(queryLevel) + comparisons); |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
814 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
815 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
816 if (!request.GetLabels().empty()) |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
817 { |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
818 /** |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
819 * "In SQL Server, NOT EXISTS and NOT IN predicates are the best |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
820 * way to search for missing values, as long as both columns in |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
821 * question are NOT NULL." |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
822 * https://explainextended.com/2009/09/15/not-in-vs-not-exists-vs-left-join-is-null-sql-server/ |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
823 **/ |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
824 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
825 const std::set<std::string>& labels = request.GetLabels(); |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
826 std::list<std::string> formattedLabels; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
827 for (std::set<std::string>::const_iterator it = labels.begin(); it != labels.end(); ++it) |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
828 { |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
829 formattedLabels.push_back(formatter.GenerateParameter(*it)); |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
830 } |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
831 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
832 std::string condition; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
833 switch (request.GetLabelsConstraint()) |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
834 { |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
835 case LabelsConstraint_Any: |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
836 condition = "> 0"; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
837 break; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
838 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
839 case LabelsConstraint_All: |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
840 condition = "= " + boost::lexical_cast<std::string>(labels.size()); |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
841 break; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
842 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
843 case LabelsConstraint_None: |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
844 condition = "= 0"; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
845 break; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
846 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
847 default: |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
848 throw OrthancException(ErrorCode_ParameterOutOfRange); |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
849 } |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
850 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
851 where.push_back("(SELECT COUNT(1) FROM Labels AS selectedLabels WHERE selectedLabels.id = " + strQueryLevel + |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
852 ".internalId AND selectedLabels.label IN (" + Join(formattedLabels, "", ", ") + ")) " + condition); |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
853 } |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
854 |
5825
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
855 sql += joins + orderingJoins + Join(where, " WHERE ", " AND "); |
5748
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
856 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
857 if (request.HasLimits()) |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
858 { |
5762
d52b3f394f69
FormatLimits (SQLServer needs custom code)
Alain Mazy <am@orthanc.team>
parents:
5752
diff
changeset
|
859 sql += formatter.FormatLimits(request.GetLimitsSince(), request.GetLimitsCount()); |
5748
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
860 } |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
861 } |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
862 |
5422 | 863 |
864 void ISqlLookupFormatter::ApplySingleLevel(std::string& sql, | |
865 ISqlLookupFormatter& formatter, | |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
866 const DatabaseConstraints& lookup, |
5422 | 867 ResourceType queryLevel, |
868 const std::set<std::string>& labels, | |
869 LabelsConstraint labelsConstraint, | |
870 size_t limit | |
871 ) | |
872 { | |
873 ResourceType lowerLevel, upperLevel; | |
874 GetLookupLevels(lowerLevel, upperLevel, queryLevel, lookup); | |
875 | |
876 assert(upperLevel == queryLevel && | |
877 queryLevel == lowerLevel); | |
878 | |
879 const bool escapeBrackets = formatter.IsEscapeBrackets(); | |
880 | |
881 std::vector<std::string> mainDicomTagsComparisons, dicomIdentifiersComparisons; | |
882 | |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
883 for (size_t i = 0; i < lookup.GetSize(); i++) |
5422 | 884 { |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
885 const DatabaseConstraint& constraint = lookup.GetConstraint(i); |
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
886 |
5422 | 887 std::string comparison; |
888 | |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
889 if (FormatComparison2(comparison, formatter, constraint, escapeBrackets)) |
5422 | 890 { |
891 if (!comparison.empty()) | |
892 { | |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
893 if (constraint.IsIdentifier()) |
5422 | 894 { |
895 dicomIdentifiersComparisons.push_back(comparison); | |
896 } | |
897 else | |
898 { | |
899 mainDicomTagsComparisons.push_back(comparison); | |
900 } | |
901 } | |
902 } | |
903 } | |
904 | |
905 sql = ("SELECT publicId, internalId " | |
906 "FROM Resources " | |
907 "WHERE resourceType = " + formatter.FormatResourceType(queryLevel) | |
908 + " "); | |
909 | |
910 if (dicomIdentifiersComparisons.size() > 0) | |
911 { | |
912 for (std::vector<std::string>::const_iterator it = dicomIdentifiersComparisons.begin(); it < dicomIdentifiersComparisons.end(); ++it) | |
913 { | |
914 sql += (" AND internalId IN (SELECT id FROM DicomIdentifiers WHERE " + *it + ") "); | |
915 } | |
916 } | |
917 | |
918 if (mainDicomTagsComparisons.size() > 0) | |
919 { | |
920 for (std::vector<std::string>::const_iterator it = mainDicomTagsComparisons.begin(); it < mainDicomTagsComparisons.end(); ++it) | |
921 { | |
922 sql += (" AND internalId IN (SELECT id FROM MainDicomTags WHERE " + *it + ") "); | |
923 } | |
924 } | |
925 | |
926 if (!labels.empty()) | |
927 { | |
928 /** | |
929 * "In SQL Server, NOT EXISTS and NOT IN predicates are the best | |
930 * way to search for missing values, as long as both columns in | |
931 * question are NOT NULL." | |
932 * https://explainextended.com/2009/09/15/not-in-vs-not-exists-vs-left-join-is-null-sql-server/ | |
933 **/ | |
934 | |
935 std::list<std::string> formattedLabels; | |
936 for (std::set<std::string>::const_iterator it = labels.begin(); it != labels.end(); ++it) | |
937 { | |
938 formattedLabels.push_back(formatter.GenerateParameter(*it)); | |
939 } | |
940 | |
941 std::string condition; | |
942 std::string inOrNotIn; | |
943 switch (labelsConstraint) | |
944 { | |
945 case LabelsConstraint_Any: | |
946 condition = "> 0"; | |
947 inOrNotIn = "IN"; | |
948 break; | |
949 | |
950 case LabelsConstraint_All: | |
951 condition = "= " + boost::lexical_cast<std::string>(labels.size()); | |
952 inOrNotIn = "IN"; | |
953 break; | |
954 | |
955 case LabelsConstraint_None: | |
956 condition = "> 0"; | |
957 inOrNotIn = "NOT IN"; | |
958 break; | |
959 | |
960 default: | |
961 throw OrthancException(ErrorCode_ParameterOutOfRange); | |
962 } | |
963 | |
964 sql += (" AND internalId " + inOrNotIn + " (SELECT id" | |
965 " FROM (SELECT id, COUNT(1) AS labelsCount " | |
966 "FROM Labels " | |
967 "WHERE label IN (" + Join(formattedLabels, "", ", ") + ") GROUP BY id" | |
968 ") AS temp " | |
969 " WHERE labelsCount " + condition + ")"); | |
970 } | |
971 | |
972 if (limit != 0) | |
973 { | |
974 sql += " LIMIT " + boost::lexical_cast<std::string>(limit); | |
975 } | |
976 } | |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
977 } |