Mercurial > hg > orthanc
annotate OrthancServer/Sources/Search/ISqlLookupFormatter.cpp @ 5841:57ab63fe9108 find-refactoring tip
tools/find: Limit and Since are now forbidden when filtering on DICOM tags that are not stored in DB
author | Alain Mazy <am@orthanc.team> |
---|---|
date | Thu, 24 Oct 2024 15:08:43 +0200 |
parents | 40f236ad829c |
children |
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" |
5828 | 30 #include "DatabaseDicomTagConstraint.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 } |
5826
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
60 |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
61 static std::string FormatLevel(const char* prefix, ResourceType level) |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
62 { |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
63 switch (level) |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
64 { |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
65 case ResourceType_Patient: |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
66 return std::string(prefix) + "patients"; |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
67 |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
68 case ResourceType_Study: |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
69 return std::string(prefix) + "studies"; |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
70 |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
71 case ResourceType_Series: |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
72 return std::string(prefix) + "series"; |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
73 |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
74 case ResourceType_Instance: |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
75 return std::string(prefix) + "instances"; |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
76 |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
77 default: |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
78 throw OrthancException(ErrorCode_InternalError); |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
79 } |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
80 } |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
81 |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
82 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
83 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
|
84 ISqlLookupFormatter& formatter, |
5828 | 85 const IDatabaseConstraint& constraint, |
4817
b8fcd331b4b3
added ISqlLookupFormatter::IsEscapeBrackets()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
86 size_t index, |
b8fcd331b4b3
added ISqlLookupFormatter::IsEscapeBrackets()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
87 bool escapeBrackets) |
3058
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 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
|
90 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
91 std::string comparison; |
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 switch (constraint.GetConstraintType()) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
94 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
95 case ConstraintType_Equal: |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
96 case ConstraintType_SmallerOrEqual: |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
97 case ConstraintType_GreaterOrEqual: |
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 std::string op; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
100 switch (constraint.GetConstraintType()) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
101 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
102 case ConstraintType_Equal: |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
103 op = "="; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
104 break; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
105 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
106 case ConstraintType_SmallerOrEqual: |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
107 op = "<="; |
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 case ConstraintType_GreaterOrEqual: |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
111 op = ">="; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
112 break; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
113 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
114 default: |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
115 throw OrthancException(ErrorCode_InternalError); |
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 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
118 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
|
119 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
120 if (constraint.IsCaseSensitive()) |
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 comparison = tag + ".value " + op + " " + parameter; |
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 else |
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 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
|
127 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
128 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
129 break; |
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 case ConstraintType_List: |
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 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
|
135 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
136 if (!comparison.empty()) |
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 += ", "; |
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 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
|
142 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
143 if (constraint.IsCaseSensitive()) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
144 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
145 comparison += parameter; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
146 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
147 else |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
148 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
149 comparison += "lower(" + parameter + ")"; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
150 } |
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 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
153 if (constraint.IsCaseSensitive()) |
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 comparison = tag + ".value IN (" + comparison + ")"; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
156 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
157 else |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
158 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
159 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
|
160 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
161 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
162 break; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
163 } |
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 case ConstraintType_Wildcard: |
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 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
|
168 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
169 if (value == "*") |
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 if (!constraint.IsMandatory()) |
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 // 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
|
174 return false; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
175 } |
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 else |
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 std::string escaped; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
180 escaped.reserve(value.size()); |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
181 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
182 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
|
183 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
184 if (value[i] == '*') |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
185 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
186 escaped += "%"; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
187 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
188 else if (value[i] == '?') |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
189 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
190 escaped += "_"; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
191 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
192 else if (value[i] == '%') |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
193 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
194 escaped += "\\%"; |
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 else if (value[i] == '_') |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
197 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
198 escaped += "\\_"; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
199 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
200 else if (value[i] == '\\') |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
201 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
202 escaped += "\\\\"; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
203 } |
4817
b8fcd331b4b3
added ISqlLookupFormatter::IsEscapeBrackets()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
204 else if (escapeBrackets && value[i] == '[') |
b8fcd331b4b3
added ISqlLookupFormatter::IsEscapeBrackets()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
205 { |
b8fcd331b4b3
added ISqlLookupFormatter::IsEscapeBrackets()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
206 escaped += "\\["; |
b8fcd331b4b3
added ISqlLookupFormatter::IsEscapeBrackets()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
207 } |
b8fcd331b4b3
added ISqlLookupFormatter::IsEscapeBrackets()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
208 else if (escapeBrackets && value[i] == ']') |
b8fcd331b4b3
added ISqlLookupFormatter::IsEscapeBrackets()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
209 { |
b8fcd331b4b3
added ISqlLookupFormatter::IsEscapeBrackets()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
210 escaped += "\\]"; |
b8fcd331b4b3
added ISqlLookupFormatter::IsEscapeBrackets()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
211 } |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
212 else |
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 escaped += value[i]; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
215 } |
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 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
|
219 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
220 if (constraint.IsCaseSensitive()) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
221 { |
3079
65e2bfa953ef
ISqlLookupFormatter::FormatWildcardEscape()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3078
diff
changeset
|
222 comparison = (tag + ".value LIKE " + parameter + " " + |
65e2bfa953ef
ISqlLookupFormatter::FormatWildcardEscape()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3078
diff
changeset
|
223 formatter.FormatWildcardEscape()); |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
224 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
225 else |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
226 { |
3079
65e2bfa953ef
ISqlLookupFormatter::FormatWildcardEscape()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3078
diff
changeset
|
227 comparison = ("lower(" + tag + ".value) LIKE lower(" + |
65e2bfa953ef
ISqlLookupFormatter::FormatWildcardEscape()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3078
diff
changeset
|
228 parameter + ") " + formatter.FormatWildcardEscape()); |
3058
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 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
232 break; |
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 default: |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
236 return false; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
237 } |
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 if (constraint.IsMandatory()) |
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 target = comparison; |
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 else if (comparison.empty()) |
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 target = tag + ".value IS NULL"; |
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 else |
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 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
|
250 } |
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 return true; |
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 |
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 static void FormatJoin(std::string& target, |
5828 | 257 const DatabaseDicomTagConstraint& constraint, |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
258 size_t index) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
259 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
260 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
|
261 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
262 if (constraint.IsMandatory()) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
263 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
264 target = " INNER JOIN "; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
265 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
266 else |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
267 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
268 target = " LEFT JOIN "; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
269 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
270 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
271 if (constraint.IsIdentifier()) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
272 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
273 target += "DicomIdentifiers "; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
274 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
275 else |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
276 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
277 target += "MainDicomTags "; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
278 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
279 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
280 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
|
281 ".internalId AND " + tag + ".tagGroup = " + |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
282 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
|
283 " AND " + tag + ".tagElement = " + |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
284 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
|
285 } |
5227
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
286 |
5828 | 287 static void FormatJoin(std::string& target, |
288 const DatabaseMetadataConstraint& constraint, | |
289 ResourceType level, | |
290 size_t index) | |
291 { | |
292 std::string tag = "t" + boost::lexical_cast<std::string>(index); | |
293 | |
294 if (constraint.IsMandatory()) | |
295 { | |
296 target = " INNER JOIN "; | |
297 } | |
298 else | |
299 { | |
300 target = " LEFT JOIN "; | |
301 } | |
302 | |
303 target += "Metadata "; | |
304 | |
305 target += tag + " ON " + tag + ".id = " + FormatLevel(level) + | |
306 ".internalId AND " + tag + ".type = " + | |
307 boost::lexical_cast<std::string>(constraint.GetMetadata()); | |
308 } | |
309 | |
5227
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
310 |
5825
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
311 static void FormatJoinForOrdering(std::string& target, |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
312 const DicomTag& tag, |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
313 size_t index, |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
314 ResourceType requestLevel) |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
315 { |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
316 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
|
317 |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
318 target.clear(); |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
319 |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
320 ResourceType tagLevel; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
321 DicomTagType tagType; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
322 MainDicomTagsRegistry registry; |
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 registry.LookupTag(tagLevel, tagType, tag); |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
325 |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
326 if (tagLevel == ResourceType_Patient && requestLevel == ResourceType_Study) |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
327 { // Patient tags are copied at study level |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
328 tagLevel = ResourceType_Study; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
329 } |
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 std::string tagTable; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
332 if (tagType == DicomTagType_Identifier) |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
333 { |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
334 tagTable = "DicomIdentifiers "; |
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 else |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
337 { |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
338 tagTable = "MainDicomTags "; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
339 } |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
340 |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
341 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
|
342 |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
343 if (tagLevel == requestLevel) |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
344 { |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
345 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
|
346 ".internalId AND " + tagFilter; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
347 } |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
348 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
|
349 { |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
350 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
|
351 " 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
|
352 } |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
353 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
|
354 { |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
355 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
|
356 " 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
|
357 " 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
|
358 } |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
359 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
|
360 { |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
361 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
|
362 " 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
|
363 " 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
|
364 " 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
|
365 } |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
366 } |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
367 |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
368 static void FormatJoinForOrdering(std::string& target, |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
369 const MetadataType& metadata, |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
370 size_t index, |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
371 ResourceType requestLevel) |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
372 { |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
373 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
|
374 |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
375 |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
376 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
|
377 ".internalId AND " + arg + ".type = " + |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
378 boost::lexical_cast<std::string>(metadata); |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
379 } |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
380 |
5227
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
381 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
|
382 const std::string& prefix, |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
383 const std::string& separator) |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
384 { |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
385 if (values.empty()) |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
386 { |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
387 return ""; |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
388 } |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
389 else |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
390 { |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
391 std::string s = prefix; |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
392 |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
393 bool first = true; |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
394 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
|
395 { |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
396 if (first) |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
397 { |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
398 first = false; |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
399 } |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
400 else |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
401 { |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
402 s += separator; |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
403 } |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
404 |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
405 s += *it; |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
406 } |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
407 |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
408 return s; |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
409 } |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
410 } |
5422 | 411 |
412 static bool FormatComparison2(std::string& target, | |
413 ISqlLookupFormatter& formatter, | |
5828 | 414 const DatabaseDicomTagConstraint& constraint, |
5422 | 415 bool escapeBrackets) |
416 { | |
417 std::string comparison; | |
418 std::string tagFilter = ("tagGroup = " + boost::lexical_cast<std::string>(constraint.GetTag().GetGroup()) | |
419 + " AND tagElement = " + boost::lexical_cast<std::string>(constraint.GetTag().GetElement())); | |
420 | |
421 switch (constraint.GetConstraintType()) | |
422 { | |
423 case ConstraintType_Equal: | |
424 case ConstraintType_SmallerOrEqual: | |
425 case ConstraintType_GreaterOrEqual: | |
426 { | |
427 std::string op; | |
428 switch (constraint.GetConstraintType()) | |
429 { | |
430 case ConstraintType_Equal: | |
431 op = "="; | |
432 break; | |
433 | |
434 case ConstraintType_SmallerOrEqual: | |
435 op = "<="; | |
436 break; | |
437 | |
438 case ConstraintType_GreaterOrEqual: | |
439 op = ">="; | |
440 break; | |
441 | |
442 default: | |
443 throw OrthancException(ErrorCode_InternalError); | |
444 } | |
445 | |
446 std::string parameter = formatter.GenerateParameter(constraint.GetSingleValue()); | |
447 | |
448 if (constraint.IsCaseSensitive()) | |
449 { | |
450 comparison = " AND value " + op + " " + parameter; | |
451 } | |
452 else | |
453 { | |
454 comparison = " AND lower(value) " + op + " lower(" + parameter + ")"; | |
455 } | |
456 | |
457 break; | |
458 } | |
459 | |
460 case ConstraintType_List: | |
461 { | |
462 std::vector<std::string> comparisonValues; | |
463 for (size_t i = 0; i < constraint.GetValuesCount(); i++) | |
464 { | |
465 std::string parameter = formatter.GenerateParameter(constraint.GetValue(i)); | |
466 | |
467 if (constraint.IsCaseSensitive()) | |
468 { | |
469 comparisonValues.push_back(parameter); | |
470 } | |
471 else | |
472 { | |
473 comparisonValues.push_back("lower(" + parameter + ")"); | |
474 } | |
475 } | |
476 | |
477 std::string values; | |
478 Toolbox::JoinStrings(values, comparisonValues, ", "); | |
479 | |
480 if (constraint.IsCaseSensitive()) | |
481 { | |
482 comparison = " AND value IN (" + values + ")"; | |
483 } | |
484 else | |
485 { | |
486 comparison = " AND lower(value) IN (" + values + ")"; | |
487 } | |
488 | |
489 break; | |
490 } | |
491 | |
492 case ConstraintType_Wildcard: | |
493 { | |
494 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
|
495 |
5422 | 496 if (value == "*") |
497 { | |
498 if (!constraint.IsMandatory()) | |
499 { | |
500 // Universal constraint on an optional tag, ignore it | |
501 return false; | |
502 } | |
503 } | |
504 else | |
505 { | |
506 std::string escaped; | |
507 escaped.reserve(value.size()); | |
508 | |
509 for (size_t i = 0; i < value.size(); i++) | |
510 { | |
511 if (value[i] == '*') | |
512 { | |
513 escaped += "%"; | |
514 } | |
515 else if (value[i] == '?') | |
516 { | |
517 escaped += "_"; | |
518 } | |
519 else if (value[i] == '%') | |
520 { | |
521 escaped += "\\%"; | |
522 } | |
523 else if (value[i] == '_') | |
524 { | |
525 escaped += "\\_"; | |
526 } | |
527 else if (value[i] == '\\') | |
528 { | |
529 escaped += "\\\\"; | |
530 } | |
531 else if (escapeBrackets && value[i] == '[') | |
532 { | |
533 escaped += "\\["; | |
534 } | |
535 else if (escapeBrackets && value[i] == ']') | |
536 { | |
537 escaped += "\\]"; | |
538 } | |
539 else | |
540 { | |
541 escaped += value[i]; | |
542 } | |
543 } | |
544 | |
545 std::string parameter = formatter.GenerateParameter(escaped); | |
546 | |
547 if (constraint.IsCaseSensitive()) | |
548 { | |
549 comparison = " AND value LIKE " + parameter + " " + formatter.FormatWildcardEscape(); | |
550 } | |
551 else | |
552 { | |
553 comparison = " AND lower(value) LIKE lower(" + parameter + ") " + formatter.FormatWildcardEscape(); | |
554 } | |
555 } | |
556 | |
557 break; | |
558 } | |
559 | |
560 default: | |
561 return false; | |
562 } | |
563 | |
564 if (constraint.IsMandatory()) | |
565 { | |
566 target = tagFilter + comparison; | |
567 } | |
568 else if (comparison.empty()) | |
569 { | |
570 target = tagFilter + " AND value IS NULL"; | |
571 } | |
572 else | |
573 { | |
574 target = tagFilter + " AND value IS NULL OR " + comparison; | |
575 } | |
576 | |
577 return true; | |
578 } | |
579 | |
580 | |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
581 void ISqlLookupFormatter::GetLookupLevels(ResourceType& lowerLevel, |
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
582 ResourceType& upperLevel, |
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
583 const ResourceType& queryLevel, |
5828 | 584 const DatabaseDicomTagConstraints& lookup) |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
585 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
586 assert(ResourceType_Patient < ResourceType_Study && |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
587 ResourceType_Study < ResourceType_Series && |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
588 ResourceType_Series < ResourceType_Instance); |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
589 |
5422 | 590 lowerLevel = queryLevel; |
591 upperLevel = queryLevel; | |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
592 |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
593 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
|
594 { |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
595 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
|
596 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
597 if (level < upperLevel) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
598 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
599 upperLevel = level; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
600 } |
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 if (level > lowerLevel) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
603 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
604 lowerLevel = level; |
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 } |
5422 | 607 } |
608 | |
609 | |
610 void ISqlLookupFormatter::Apply(std::string& sql, | |
611 ISqlLookupFormatter& formatter, | |
5828 | 612 const DatabaseDicomTagConstraints& lookup, |
5422 | 613 ResourceType queryLevel, |
614 const std::set<std::string>& labels, | |
615 LabelsConstraint labelsConstraint, | |
616 size_t limit) | |
617 { | |
5828 | 618 // get the limit levels of the DICOM Tags lookup |
5422 | 619 ResourceType lowerLevel, upperLevel; |
620 GetLookupLevels(lowerLevel, upperLevel, queryLevel, lookup); | |
621 | |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
622 assert(upperLevel <= queryLevel && |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
623 queryLevel <= lowerLevel); |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
624 |
4817
b8fcd331b4b3
added ISqlLookupFormatter::IsEscapeBrackets()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
625 const bool escapeBrackets = formatter.IsEscapeBrackets(); |
b8fcd331b4b3
added ISqlLookupFormatter::IsEscapeBrackets()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
626 |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
627 std::string joins, comparisons; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
628 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
629 size_t count = 0; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
630 |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
631 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
|
632 { |
5828 | 633 const DatabaseDicomTagConstraint& constraint = lookup.GetConstraint(i); |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
634 |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
635 std::string comparison; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
636 |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
637 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
|
638 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
639 std::string join; |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
640 FormatJoin(join, constraint, count); |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
641 joins += join; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
642 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
643 if (!comparison.empty()) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
644 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
645 comparisons += " AND " + comparison; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
646 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
647 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
648 count ++; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
649 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
650 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
651 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
652 sql = ("SELECT " + |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
653 FormatLevel(queryLevel) + ".publicId, " + |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
654 FormatLevel(queryLevel) + ".internalId" + |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
655 " FROM Resources AS " + FormatLevel(queryLevel)); |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
656 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
657 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
|
658 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
659 sql += (" INNER JOIN Resources " + |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
660 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
|
661 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
|
662 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
|
663 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
664 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
665 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
|
666 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
667 sql += (" INNER JOIN Resources " + |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
668 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
|
669 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
|
670 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
|
671 } |
5227
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
672 |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
673 std::list<std::string> where; |
5256 | 674 where.push_back(FormatLevel(queryLevel) + ".resourceType = " + |
675 formatter.FormatResourceType(queryLevel) + comparisons); | |
5227
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
676 |
5248
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
677 if (!labels.empty()) |
5227
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
678 { |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
679 /** |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
680 * "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
|
681 * 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
|
682 * question are NOT NULL." |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
683 * 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
|
684 **/ |
5248
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
685 |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
686 std::list<std::string> formattedLabels; |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
687 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
|
688 { |
5248
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
689 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
|
690 } |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
691 |
5248
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
692 std::string condition; |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
693 switch (labelsConstraint) |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
694 { |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
695 case LabelsConstraint_Any: |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
696 condition = "> 0"; |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
697 break; |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
698 |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
699 case LabelsConstraint_All: |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
700 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
|
701 break; |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
702 |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
703 case LabelsConstraint_None: |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
704 condition = "= 0"; |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
705 break; |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
706 |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
707 default: |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
708 throw OrthancException(ErrorCode_ParameterOutOfRange); |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
709 } |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
710 |
5256 | 711 where.push_back("(SELECT COUNT(1) FROM Labels AS selectedLabels WHERE selectedLabels.id = " + FormatLevel(queryLevel) + |
712 ".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
|
713 } |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
714 |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
715 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
|
716 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
717 if (limit != 0) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
718 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
719 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
|
720 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
721 } |
5422 | 722 |
5765
247fc5368693
un-sharing DatabaseConstraint and ISqlLookupFormatter with orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5762
diff
changeset
|
723 |
5748
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
724 void ISqlLookupFormatter::Apply(std::string& sql, |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
725 ISqlLookupFormatter& formatter, |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
726 const FindRequest& request) |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
727 { |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
728 const bool escapeBrackets = formatter.IsEscapeBrackets(); |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
729 ResourceType queryLevel = request.GetLevel(); |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
730 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
|
731 |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
732 ResourceType lowerLevel, upperLevel; |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
733 GetLookupLevels(lowerLevel, upperLevel, queryLevel, request.GetDicomTagConstraints()); |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
734 |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
735 assert(upperLevel <= queryLevel && |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
736 queryLevel <= lowerLevel); |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
737 |
5825
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
738 std::string ordering; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
739 std::string orderingJoins; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
740 |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
741 if (request.GetOrdering().size() > 0) |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
742 { |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
743 int counter = 0; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
744 std::vector<std::string> orderByFields; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
745 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
|
746 { |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
747 std::string orderingJoin; |
5796
16ce3c920f71
rewrote SQLite find using CTEs instead of temporary tables
Alain Mazy <am@orthanc.team>
parents:
5765
diff
changeset
|
748 |
5825
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
749 switch ((*it)->GetKeyType()) |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
750 { |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
751 case FindRequest::KeyType_DicomTag: |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
752 FormatJoinForOrdering(orderingJoin, (*it)->GetDicomTag(), counter, request.GetLevel()); |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
753 break; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
754 case FindRequest::KeyType_Metadata: |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
755 FormatJoinForOrdering(orderingJoin, (*it)->GetMetadataType(), counter, request.GetLevel()); |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
756 break; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
757 default: |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
758 throw OrthancException(ErrorCode_InternalError); |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
759 } |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
760 orderingJoins += orderingJoin; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
761 |
5830
40f236ad829c
SQLite 3.46 + push NULL values at the end of the order by clauses
Alain Mazy <am@orthanc.team>
parents:
5828
diff
changeset
|
762 std::string orderByField; |
40f236ad829c
SQLite 3.46 + push NULL values at the end of the order by clauses
Alain Mazy <am@orthanc.team>
parents:
5828
diff
changeset
|
763 |
40f236ad829c
SQLite 3.46 + push NULL values at the end of the order by clauses
Alain Mazy <am@orthanc.team>
parents:
5828
diff
changeset
|
764 #if ORTHANC_SQLITE_VERSION < 3030001 |
40f236ad829c
SQLite 3.46 + push NULL values at the end of the order by clauses
Alain Mazy <am@orthanc.team>
parents:
5828
diff
changeset
|
765 // this is a way to push NULL values at the end before "NULLS LAST" was introduced: |
40f236ad829c
SQLite 3.46 + push NULL values at the end of the order by clauses
Alain Mazy <am@orthanc.team>
parents:
5828
diff
changeset
|
766 // first filter by 0/1 and then by the column value itself |
40f236ad829c
SQLite 3.46 + push NULL values at the end of the order by clauses
Alain Mazy <am@orthanc.team>
parents:
5828
diff
changeset
|
767 orderByField += "order" + boost::lexical_cast<std::string>(counter) + ".value IS NULL, "; |
40f236ad829c
SQLite 3.46 + push NULL values at the end of the order by clauses
Alain Mazy <am@orthanc.team>
parents:
5828
diff
changeset
|
768 #endif |
40f236ad829c
SQLite 3.46 + push NULL values at the end of the order by clauses
Alain Mazy <am@orthanc.team>
parents:
5828
diff
changeset
|
769 orderByField += "order" + boost::lexical_cast<std::string>(counter) + ".value"; |
40f236ad829c
SQLite 3.46 + push NULL values at the end of the order by clauses
Alain Mazy <am@orthanc.team>
parents:
5828
diff
changeset
|
770 |
5825
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
771 if ((*it)->GetDirection() == FindRequest::OrderingDirection_Ascending) |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
772 { |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
773 orderByField += " ASC"; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
774 } |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
775 else |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
776 { |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
777 orderByField += " DESC"; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
778 } |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
779 orderByFields.push_back(orderByField); |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
780 ++counter; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
781 } |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
782 |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
783 std::string orderByFieldsString; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
784 Toolbox::JoinStrings(orderByFieldsString, orderByFields, ", "); |
5830
40f236ad829c
SQLite 3.46 + push NULL values at the end of the order by clauses
Alain Mazy <am@orthanc.team>
parents:
5828
diff
changeset
|
785 |
40f236ad829c
SQLite 3.46 + push NULL values at the end of the order by clauses
Alain Mazy <am@orthanc.team>
parents:
5828
diff
changeset
|
786 ordering = "ROW_NUMBER() OVER (ORDER BY " + orderByFieldsString; |
40f236ad829c
SQLite 3.46 + push NULL values at the end of the order by clauses
Alain Mazy <am@orthanc.team>
parents:
5828
diff
changeset
|
787 #if ORTHANC_SQLITE_VERSION >= 3030001 |
40f236ad829c
SQLite 3.46 + push NULL values at the end of the order by clauses
Alain Mazy <am@orthanc.team>
parents:
5828
diff
changeset
|
788 ordering += " NULLS LAST"; |
40f236ad829c
SQLite 3.46 + push NULL values at the end of the order by clauses
Alain Mazy <am@orthanc.team>
parents:
5828
diff
changeset
|
789 #endif |
40f236ad829c
SQLite 3.46 + push NULL values at the end of the order by clauses
Alain Mazy <am@orthanc.team>
parents:
5828
diff
changeset
|
790 ordering += ") AS rowNumber"; |
5825
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
791 } |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
792 else |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
793 { |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
794 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
|
795 } |
5750
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 = ("SELECT " + |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
798 strQueryLevel + ".publicId, " + |
5796
16ce3c920f71
rewrote SQLite find using CTEs instead of temporary tables
Alain Mazy <am@orthanc.team>
parents:
5765
diff
changeset
|
799 strQueryLevel + ".internalId, " + |
16ce3c920f71
rewrote SQLite find using CTEs instead of temporary tables
Alain Mazy <am@orthanc.team>
parents:
5765
diff
changeset
|
800 ordering + |
5750
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
801 " FROM Resources AS " + strQueryLevel); |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
802 |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
803 |
5748
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
804 std::string joins, comparisons; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
805 |
5827 | 806 // handle parent constraints |
807 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
|
808 { |
5827 | 809 ResourceType topParentLevel = request.GetOrthancIdentifiers().DetectLevel(); |
5748
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
810 |
5827 | 811 if (topParentLevel == queryLevel) |
812 { | |
813 comparisons += " AND " + FormatLevel(topParentLevel) + ".publicId = " + formatter.GenerateParameter(request.GetOrthancIdentifiers().GetLevel(topParentLevel)); | |
814 } | |
815 else | |
816 { | |
817 comparisons += " AND " + FormatLevel("parent", topParentLevel) + ".publicId = " + formatter.GenerateParameter(request.GetOrthancIdentifiers().GetLevel(topParentLevel)); | |
5750
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
818 |
5827 | 819 for (int level = queryLevel; level > topParentLevel; level--) |
820 { | |
821 joins += " INNER JOIN Resources " + | |
822 FormatLevel("parent", static_cast<ResourceType>(level - 1)) + " ON " + | |
823 FormatLevel("parent", static_cast<ResourceType>(level - 1)) + ".internalId = "; | |
824 if (level == queryLevel) | |
5826
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
825 { |
5827 | 826 joins += FormatLevel(static_cast<ResourceType>(level)) + ".parentId"; |
827 } | |
828 else | |
829 { | |
830 joins += FormatLevel("parent", static_cast<ResourceType>(level)) + ".parentId"; | |
5826
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
831 } |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
832 } |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
833 } |
5827 | 834 } |
5748
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
835 |
5827 | 836 size_t count = 0; |
837 | |
5828 | 838 const DatabaseDicomTagConstraints& dicomTagsConstraints = request.GetDicomTagConstraints(); |
5827 | 839 for (size_t i = 0; i < dicomTagsConstraints.GetSize(); i++) |
840 { | |
5828 | 841 const DatabaseDicomTagConstraint& constraint = dicomTagsConstraints.GetConstraint(i); |
5827 | 842 |
843 std::string comparison; | |
5748
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
844 |
5827 | 845 if (FormatComparison(comparison, formatter, constraint, count, escapeBrackets)) |
5748
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
846 { |
5827 | 847 std::string join; |
848 FormatJoin(join, constraint, count); | |
849 joins += join; | |
5748
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
850 |
5827 | 851 if (!comparison.empty()) |
5748
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
852 { |
5827 | 853 comparisons += " AND " + comparison; |
5748
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
854 } |
5827 | 855 |
856 count ++; | |
5748
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
857 } |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
858 } |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
859 |
5828 | 860 for (std::deque<DatabaseMetadataConstraint*>::const_iterator it = request.GetMetadataConstraint().begin(); it != request.GetMetadataConstraint().end(); ++it) |
861 { | |
862 std::string comparison; | |
863 | |
864 if (FormatComparison(comparison, formatter, *(*it), count, escapeBrackets)) | |
865 { | |
866 std::string join; | |
867 FormatJoin(join, *(*it), request.GetLevel(), count); | |
868 joins += join; | |
869 | |
870 if (!comparison.empty()) | |
871 { | |
872 comparisons += " AND " + comparison; | |
873 } | |
874 | |
875 count ++; | |
876 } | |
877 } | |
878 | |
5750
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
879 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
|
880 { |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
881 sql += (" INNER JOIN Resources " + |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
882 FormatLevel(static_cast<ResourceType>(level)) + " ON " + |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
883 FormatLevel(static_cast<ResourceType>(level)) + ".internalId=" + |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
884 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
|
885 } |
5748
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
886 |
5750
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
887 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
|
888 { |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
889 sql += (" INNER JOIN Resources " + |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
890 FormatLevel(static_cast<ResourceType>(level)) + " ON " + |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
891 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
|
892 FormatLevel(static_cast<ResourceType>(level)) + ".parentId"); |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
893 } |
5748
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
894 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
895 std::list<std::string> where; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
896 where.push_back(strQueryLevel + ".resourceType = " + |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
897 formatter.FormatResourceType(queryLevel) + comparisons); |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
898 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
899 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
900 if (!request.GetLabels().empty()) |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
901 { |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
902 /** |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
903 * "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
|
904 * 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
|
905 * question are NOT NULL." |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
906 * 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
|
907 **/ |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
908 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
909 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
|
910 std::list<std::string> formattedLabels; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
911 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
|
912 { |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
913 formattedLabels.push_back(formatter.GenerateParameter(*it)); |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
914 } |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
915 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
916 std::string condition; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
917 switch (request.GetLabelsConstraint()) |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
918 { |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
919 case LabelsConstraint_Any: |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
920 condition = "> 0"; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
921 break; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
922 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
923 case LabelsConstraint_All: |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
924 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
|
925 break; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
926 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
927 case LabelsConstraint_None: |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
928 condition = "= 0"; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
929 break; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
930 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
931 default: |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
932 throw OrthancException(ErrorCode_ParameterOutOfRange); |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
933 } |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
934 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
935 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
|
936 ".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
|
937 } |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
938 |
5825
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
939 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
|
940 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
941 if (request.HasLimits()) |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
942 { |
5762
d52b3f394f69
FormatLimits (SQLServer needs custom code)
Alain Mazy <am@orthanc.team>
parents:
5752
diff
changeset
|
943 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
|
944 } |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
945 } |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
946 |
5422 | 947 |
948 void ISqlLookupFormatter::ApplySingleLevel(std::string& sql, | |
949 ISqlLookupFormatter& formatter, | |
5828 | 950 const DatabaseDicomTagConstraints& lookup, |
5422 | 951 ResourceType queryLevel, |
952 const std::set<std::string>& labels, | |
953 LabelsConstraint labelsConstraint, | |
954 size_t limit | |
955 ) | |
956 { | |
957 ResourceType lowerLevel, upperLevel; | |
958 GetLookupLevels(lowerLevel, upperLevel, queryLevel, lookup); | |
959 | |
960 assert(upperLevel == queryLevel && | |
961 queryLevel == lowerLevel); | |
962 | |
963 const bool escapeBrackets = formatter.IsEscapeBrackets(); | |
964 | |
965 std::vector<std::string> mainDicomTagsComparisons, dicomIdentifiersComparisons; | |
966 | |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
967 for (size_t i = 0; i < lookup.GetSize(); i++) |
5422 | 968 { |
5828 | 969 const DatabaseDicomTagConstraint& constraint = lookup.GetConstraint(i); |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
970 |
5422 | 971 std::string comparison; |
972 | |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
973 if (FormatComparison2(comparison, formatter, constraint, escapeBrackets)) |
5422 | 974 { |
975 if (!comparison.empty()) | |
976 { | |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
977 if (constraint.IsIdentifier()) |
5422 | 978 { |
979 dicomIdentifiersComparisons.push_back(comparison); | |
980 } | |
981 else | |
982 { | |
983 mainDicomTagsComparisons.push_back(comparison); | |
984 } | |
985 } | |
986 } | |
987 } | |
988 | |
989 sql = ("SELECT publicId, internalId " | |
990 "FROM Resources " | |
991 "WHERE resourceType = " + formatter.FormatResourceType(queryLevel) | |
992 + " "); | |
993 | |
994 if (dicomIdentifiersComparisons.size() > 0) | |
995 { | |
996 for (std::vector<std::string>::const_iterator it = dicomIdentifiersComparisons.begin(); it < dicomIdentifiersComparisons.end(); ++it) | |
997 { | |
998 sql += (" AND internalId IN (SELECT id FROM DicomIdentifiers WHERE " + *it + ") "); | |
999 } | |
1000 } | |
1001 | |
1002 if (mainDicomTagsComparisons.size() > 0) | |
1003 { | |
1004 for (std::vector<std::string>::const_iterator it = mainDicomTagsComparisons.begin(); it < mainDicomTagsComparisons.end(); ++it) | |
1005 { | |
1006 sql += (" AND internalId IN (SELECT id FROM MainDicomTags WHERE " + *it + ") "); | |
1007 } | |
1008 } | |
1009 | |
1010 if (!labels.empty()) | |
1011 { | |
1012 /** | |
1013 * "In SQL Server, NOT EXISTS and NOT IN predicates are the best | |
1014 * way to search for missing values, as long as both columns in | |
1015 * question are NOT NULL." | |
1016 * https://explainextended.com/2009/09/15/not-in-vs-not-exists-vs-left-join-is-null-sql-server/ | |
1017 **/ | |
1018 | |
1019 std::list<std::string> formattedLabels; | |
1020 for (std::set<std::string>::const_iterator it = labels.begin(); it != labels.end(); ++it) | |
1021 { | |
1022 formattedLabels.push_back(formatter.GenerateParameter(*it)); | |
1023 } | |
1024 | |
1025 std::string condition; | |
1026 std::string inOrNotIn; | |
1027 switch (labelsConstraint) | |
1028 { | |
1029 case LabelsConstraint_Any: | |
1030 condition = "> 0"; | |
1031 inOrNotIn = "IN"; | |
1032 break; | |
1033 | |
1034 case LabelsConstraint_All: | |
1035 condition = "= " + boost::lexical_cast<std::string>(labels.size()); | |
1036 inOrNotIn = "IN"; | |
1037 break; | |
1038 | |
1039 case LabelsConstraint_None: | |
1040 condition = "> 0"; | |
1041 inOrNotIn = "NOT IN"; | |
1042 break; | |
1043 | |
1044 default: | |
1045 throw OrthancException(ErrorCode_ParameterOutOfRange); | |
1046 } | |
1047 | |
1048 sql += (" AND internalId " + inOrNotIn + " (SELECT id" | |
1049 " FROM (SELECT id, COUNT(1) AS labelsCount " | |
1050 "FROM Labels " | |
1051 "WHERE label IN (" + Join(formattedLabels, "", ", ") + ") GROUP BY id" | |
1052 ") AS temp " | |
1053 " WHERE labelsCount " + condition + ")"); | |
1054 } | |
1055 | |
1056 if (limit != 0) | |
1057 { | |
1058 sql += " LIMIT " + boost::lexical_cast<std::string>(limit); | |
1059 } | |
1060 } | |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1061 } |