Mercurial > hg > orthanc
annotate OrthancServer/Sources/Search/ISqlLookupFormatter.cpp @ 5826:d73dfb4548c6 find-refactoring
tools/find: ParentPatient and co ..
author | Alain Mazy <am@orthanc.team> |
---|---|
date | Mon, 07 Oct 2024 10:51:27 +0200 |
parents | 881cd0965146 |
children | 976872a99d39 |
rev | line source |
---|---|
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1 /** |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2 * Orthanc - A Lightweight, RESTful DICOM Store |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
4 * Department, University Hospital of Liege, Belgium |
5640
f7adfb22e20e
updated copyright, as Orthanc Team now replaces Osimis
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5485
diff
changeset
|
5 * Copyright (C) 2017-2023 Osimis S.A., Belgium |
f7adfb22e20e
updated copyright, as Orthanc Team now replaces Osimis
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5485
diff
changeset
|
6 * Copyright (C) 2024-2024 Orthanc Team SRL, Belgium |
5485
48b8dae6dc77
upgrade to year 2024
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5477
diff
changeset
|
7 * Copyright (C) 2021-2024 Sebastien Jodogne, ICTEAM UCLouvain, Belgium |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
8 * |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
9 * This program is free software: you can redistribute it and/or |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
10 * modify it under the terms of the GNU General Public License as |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
11 * published by the Free Software Foundation, either version 3 of the |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
12 * License, or (at your option) any later version. |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
13 * |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
14 * This program is distributed in the hope that it will be useful, but |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
15 * WITHOUT ANY WARRANTY; without even the implied warranty of |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
17 * General Public License for more details. |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
18 * |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
19 * You should have received a copy of the GNU General Public License |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
20 * along with this program. If not, see <http://www.gnu.org/licenses/>. |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
21 **/ |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
22 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
23 |
5765
247fc5368693
un-sharing DatabaseConstraint and ISqlLookupFormatter with orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5762
diff
changeset
|
24 #include "../PrecompiledHeadersServer.h" |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
25 #include "ISqlLookupFormatter.h" |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
26 |
5765
247fc5368693
un-sharing DatabaseConstraint and ISqlLookupFormatter with orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5762
diff
changeset
|
27 #include "../../../OrthancFramework/Sources/OrthancException.h" |
247fc5368693
un-sharing DatabaseConstraint and ISqlLookupFormatter with orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5762
diff
changeset
|
28 #include "../../../OrthancFramework/Sources/Toolbox.h" |
247fc5368693
un-sharing DatabaseConstraint and ISqlLookupFormatter with orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5762
diff
changeset
|
29 #include "../Database/FindRequest.h" |
3100
f6de9d25b20d
removing build dependency on plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3079
diff
changeset
|
30 #include "DatabaseConstraint.h" |
5825
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
31 #include "../Database/MainDicomTagsRegistry.h" |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
32 |
5477 | 33 #include <cassert> |
4304 | 34 #include <boost/lexical_cast.hpp> |
5227
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
35 #include <list> |
4304 | 36 |
37 | |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
38 namespace Orthanc |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
39 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
40 static std::string FormatLevel(ResourceType level) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
41 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
42 switch (level) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
43 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
44 case ResourceType_Patient: |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
45 return "patients"; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
46 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
47 case ResourceType_Study: |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
48 return "studies"; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
49 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
50 case ResourceType_Series: |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
51 return "series"; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
52 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
53 case ResourceType_Instance: |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
54 return "instances"; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
55 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
56 default: |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
57 throw OrthancException(ErrorCode_InternalError); |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
58 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
59 } |
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, |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
85 const DatabaseConstraint& 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, |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
257 const DatabaseConstraint& constraint, |
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 |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
287 |
5825
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
288 static void FormatJoinForOrdering(std::string& target, |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
289 const DicomTag& tag, |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
290 size_t index, |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
291 ResourceType requestLevel) |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
292 { |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
293 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
|
294 |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
295 target.clear(); |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
296 |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
297 ResourceType tagLevel; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
298 DicomTagType tagType; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
299 MainDicomTagsRegistry registry; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
300 |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
301 registry.LookupTag(tagLevel, tagType, tag); |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
302 |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
303 if (tagLevel == ResourceType_Patient && requestLevel == ResourceType_Study) |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
304 { // Patient tags are copied at study level |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
305 tagLevel = ResourceType_Study; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
306 } |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
307 |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
308 std::string tagTable; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
309 if (tagType == DicomTagType_Identifier) |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
310 { |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
311 tagTable = "DicomIdentifiers "; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
312 } |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
313 else |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
314 { |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
315 tagTable = "MainDicomTags "; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
316 } |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
317 |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
318 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
|
319 |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
320 if (tagLevel == requestLevel) |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
321 { |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
322 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
|
323 ".internalId AND " + tagFilter; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
324 } |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
325 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
|
326 { |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
327 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
|
328 " 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
|
329 } |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
330 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
|
331 { |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
332 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
|
333 " 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
|
334 " 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
|
335 } |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
336 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
|
337 { |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
338 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
|
339 " 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
|
340 " 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
|
341 " 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
|
342 } |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
343 } |
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 static void FormatJoinForOrdering(std::string& target, |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
346 const MetadataType& metadata, |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
347 size_t index, |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
348 ResourceType requestLevel) |
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 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
|
351 |
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 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
|
354 ".internalId AND " + arg + ".type = " + |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
355 boost::lexical_cast<std::string>(metadata); |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
356 } |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
357 |
5227
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
358 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
|
359 const std::string& prefix, |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
360 const std::string& separator) |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
361 { |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
362 if (values.empty()) |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
363 { |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
364 return ""; |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
365 } |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
366 else |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
367 { |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
368 std::string s = prefix; |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
369 |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
370 bool first = true; |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
371 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
|
372 { |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
373 if (first) |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
374 { |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
375 first = false; |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
376 } |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
377 else |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
378 { |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
379 s += separator; |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
380 } |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
381 |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
382 s += *it; |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
383 } |
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 return s; |
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 } |
5422 | 388 |
389 static bool FormatComparison2(std::string& target, | |
390 ISqlLookupFormatter& formatter, | |
391 const DatabaseConstraint& constraint, | |
392 bool escapeBrackets) | |
393 { | |
394 std::string comparison; | |
395 std::string tagFilter = ("tagGroup = " + boost::lexical_cast<std::string>(constraint.GetTag().GetGroup()) | |
396 + " AND tagElement = " + boost::lexical_cast<std::string>(constraint.GetTag().GetElement())); | |
397 | |
398 switch (constraint.GetConstraintType()) | |
399 { | |
400 case ConstraintType_Equal: | |
401 case ConstraintType_SmallerOrEqual: | |
402 case ConstraintType_GreaterOrEqual: | |
403 { | |
404 std::string op; | |
405 switch (constraint.GetConstraintType()) | |
406 { | |
407 case ConstraintType_Equal: | |
408 op = "="; | |
409 break; | |
410 | |
411 case ConstraintType_SmallerOrEqual: | |
412 op = "<="; | |
413 break; | |
414 | |
415 case ConstraintType_GreaterOrEqual: | |
416 op = ">="; | |
417 break; | |
418 | |
419 default: | |
420 throw OrthancException(ErrorCode_InternalError); | |
421 } | |
422 | |
423 std::string parameter = formatter.GenerateParameter(constraint.GetSingleValue()); | |
424 | |
425 if (constraint.IsCaseSensitive()) | |
426 { | |
427 comparison = " AND value " + op + " " + parameter; | |
428 } | |
429 else | |
430 { | |
431 comparison = " AND lower(value) " + op + " lower(" + parameter + ")"; | |
432 } | |
433 | |
434 break; | |
435 } | |
436 | |
437 case ConstraintType_List: | |
438 { | |
439 std::vector<std::string> comparisonValues; | |
440 for (size_t i = 0; i < constraint.GetValuesCount(); i++) | |
441 { | |
442 std::string parameter = formatter.GenerateParameter(constraint.GetValue(i)); | |
443 | |
444 if (constraint.IsCaseSensitive()) | |
445 { | |
446 comparisonValues.push_back(parameter); | |
447 } | |
448 else | |
449 { | |
450 comparisonValues.push_back("lower(" + parameter + ")"); | |
451 } | |
452 } | |
453 | |
454 std::string values; | |
455 Toolbox::JoinStrings(values, comparisonValues, ", "); | |
456 | |
457 if (constraint.IsCaseSensitive()) | |
458 { | |
459 comparison = " AND value IN (" + values + ")"; | |
460 } | |
461 else | |
462 { | |
463 comparison = " AND lower(value) IN (" + values + ")"; | |
464 } | |
465 | |
466 break; | |
467 } | |
468 | |
469 case ConstraintType_Wildcard: | |
470 { | |
471 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
|
472 |
5422 | 473 if (value == "*") |
474 { | |
475 if (!constraint.IsMandatory()) | |
476 { | |
477 // Universal constraint on an optional tag, ignore it | |
478 return false; | |
479 } | |
480 } | |
481 else | |
482 { | |
483 std::string escaped; | |
484 escaped.reserve(value.size()); | |
485 | |
486 for (size_t i = 0; i < value.size(); i++) | |
487 { | |
488 if (value[i] == '*') | |
489 { | |
490 escaped += "%"; | |
491 } | |
492 else if (value[i] == '?') | |
493 { | |
494 escaped += "_"; | |
495 } | |
496 else if (value[i] == '%') | |
497 { | |
498 escaped += "\\%"; | |
499 } | |
500 else if (value[i] == '_') | |
501 { | |
502 escaped += "\\_"; | |
503 } | |
504 else if (value[i] == '\\') | |
505 { | |
506 escaped += "\\\\"; | |
507 } | |
508 else if (escapeBrackets && value[i] == '[') | |
509 { | |
510 escaped += "\\["; | |
511 } | |
512 else if (escapeBrackets && value[i] == ']') | |
513 { | |
514 escaped += "\\]"; | |
515 } | |
516 else | |
517 { | |
518 escaped += value[i]; | |
519 } | |
520 } | |
521 | |
522 std::string parameter = formatter.GenerateParameter(escaped); | |
523 | |
524 if (constraint.IsCaseSensitive()) | |
525 { | |
526 comparison = " AND value LIKE " + parameter + " " + formatter.FormatWildcardEscape(); | |
527 } | |
528 else | |
529 { | |
530 comparison = " AND lower(value) LIKE lower(" + parameter + ") " + formatter.FormatWildcardEscape(); | |
531 } | |
532 } | |
533 | |
534 break; | |
535 } | |
536 | |
537 default: | |
538 return false; | |
539 } | |
540 | |
541 if (constraint.IsMandatory()) | |
542 { | |
543 target = tagFilter + comparison; | |
544 } | |
545 else if (comparison.empty()) | |
546 { | |
547 target = tagFilter + " AND value IS NULL"; | |
548 } | |
549 else | |
550 { | |
551 target = tagFilter + " AND value IS NULL OR " + comparison; | |
552 } | |
553 | |
554 return true; | |
555 } | |
556 | |
557 | |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
558 void ISqlLookupFormatter::GetLookupLevels(ResourceType& lowerLevel, |
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
559 ResourceType& upperLevel, |
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
560 const ResourceType& queryLevel, |
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
561 const DatabaseConstraints& lookup) |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
562 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
563 assert(ResourceType_Patient < ResourceType_Study && |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
564 ResourceType_Study < ResourceType_Series && |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
565 ResourceType_Series < ResourceType_Instance); |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
566 |
5422 | 567 lowerLevel = queryLevel; |
568 upperLevel = queryLevel; | |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
569 |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
570 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
|
571 { |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
572 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
|
573 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
574 if (level < upperLevel) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
575 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
576 upperLevel = level; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
577 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
578 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
579 if (level > lowerLevel) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
580 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
581 lowerLevel = level; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
582 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
583 } |
5422 | 584 } |
585 | |
586 | |
587 void ISqlLookupFormatter::Apply(std::string& sql, | |
588 ISqlLookupFormatter& formatter, | |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
589 const DatabaseConstraints& lookup, |
5422 | 590 ResourceType queryLevel, |
591 const std::set<std::string>& labels, | |
592 LabelsConstraint labelsConstraint, | |
593 size_t limit) | |
594 { | |
595 ResourceType lowerLevel, upperLevel; | |
596 GetLookupLevels(lowerLevel, upperLevel, queryLevel, lookup); | |
597 | |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
598 assert(upperLevel <= queryLevel && |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
599 queryLevel <= lowerLevel); |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
600 |
4817
b8fcd331b4b3
added ISqlLookupFormatter::IsEscapeBrackets()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
601 const bool escapeBrackets = formatter.IsEscapeBrackets(); |
b8fcd331b4b3
added ISqlLookupFormatter::IsEscapeBrackets()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
602 |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
603 std::string joins, comparisons; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
604 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
605 size_t count = 0; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
606 |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
607 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
|
608 { |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
609 const DatabaseConstraint& constraint = lookup.GetConstraint(i); |
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
610 |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
611 std::string comparison; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
612 |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
613 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
|
614 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
615 std::string join; |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
616 FormatJoin(join, constraint, count); |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
617 joins += join; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
618 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
619 if (!comparison.empty()) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
620 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
621 comparisons += " AND " + comparison; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
622 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
623 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
624 count ++; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
625 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
626 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
627 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
628 sql = ("SELECT " + |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
629 FormatLevel(queryLevel) + ".publicId, " + |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
630 FormatLevel(queryLevel) + ".internalId" + |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
631 " FROM Resources AS " + FormatLevel(queryLevel)); |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
632 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
633 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
|
634 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
635 sql += (" INNER JOIN Resources " + |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
636 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
|
637 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
|
638 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
|
639 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
640 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
641 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
|
642 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
643 sql += (" INNER JOIN Resources " + |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
644 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
|
645 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
|
646 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
|
647 } |
5227
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
648 |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
649 std::list<std::string> where; |
5256 | 650 where.push_back(FormatLevel(queryLevel) + ".resourceType = " + |
651 formatter.FormatResourceType(queryLevel) + comparisons); | |
5227
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
652 |
5248
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
653 if (!labels.empty()) |
5227
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
654 { |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
655 /** |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
656 * "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
|
657 * 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
|
658 * question are NOT NULL." |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
659 * 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
|
660 **/ |
5248
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
661 |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
662 std::list<std::string> formattedLabels; |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
663 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
|
664 { |
5248
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
665 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
|
666 } |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
667 |
5248
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
668 std::string condition; |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
669 switch (labelsConstraint) |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
670 { |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
671 case LabelsConstraint_Any: |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
672 condition = "> 0"; |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
673 break; |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
674 |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
675 case LabelsConstraint_All: |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
676 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
|
677 break; |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
678 |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
679 case LabelsConstraint_None: |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
680 condition = "= 0"; |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
681 break; |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
682 |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
683 default: |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
684 throw OrthancException(ErrorCode_ParameterOutOfRange); |
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 |
5256 | 687 where.push_back("(SELECT COUNT(1) FROM Labels AS selectedLabels WHERE selectedLabels.id = " + FormatLevel(queryLevel) + |
688 ".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
|
689 } |
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 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
|
692 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
693 if (limit != 0) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
694 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
695 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
|
696 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
697 } |
5422 | 698 |
5765
247fc5368693
un-sharing DatabaseConstraint and ISqlLookupFormatter with orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5762
diff
changeset
|
699 |
5748
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
700 void ISqlLookupFormatter::Apply(std::string& sql, |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
701 ISqlLookupFormatter& formatter, |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
702 const FindRequest& request) |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
703 { |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
704 const bool escapeBrackets = formatter.IsEscapeBrackets(); |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
705 ResourceType queryLevel = request.GetLevel(); |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
706 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
|
707 |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
708 ResourceType lowerLevel, upperLevel; |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
709 GetLookupLevels(lowerLevel, upperLevel, queryLevel, request.GetDicomTagConstraints()); |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
710 |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
711 assert(upperLevel <= queryLevel && |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
712 queryLevel <= lowerLevel); |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
713 |
5825
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
714 std::string ordering; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
715 std::string orderingJoins; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
716 |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
717 if (request.GetOrdering().size() > 0) |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
718 { |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
719 int counter = 0; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
720 std::vector<std::string> orderByFields; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
721 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
|
722 { |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
723 std::string orderingJoin; |
5796
16ce3c920f71
rewrote SQLite find using CTEs instead of temporary tables
Alain Mazy <am@orthanc.team>
parents:
5765
diff
changeset
|
724 |
5825
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
725 switch ((*it)->GetKeyType()) |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
726 { |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
727 case FindRequest::KeyType_DicomTag: |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
728 FormatJoinForOrdering(orderingJoin, (*it)->GetDicomTag(), counter, request.GetLevel()); |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
729 break; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
730 case FindRequest::KeyType_Metadata: |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
731 FormatJoinForOrdering(orderingJoin, (*it)->GetMetadataType(), counter, request.GetLevel()); |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
732 break; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
733 default: |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
734 throw OrthancException(ErrorCode_InternalError); |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
735 } |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
736 orderingJoins += orderingJoin; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
737 |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
738 std::string orderByField = "order" + boost::lexical_cast<std::string>(counter) + ".value"; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
739 if ((*it)->GetDirection() == FindRequest::OrderingDirection_Ascending) |
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 orderByField += " ASC"; |
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 else |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
744 { |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
745 orderByField += " DESC"; |
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 orderByFields.push_back(orderByField); |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
748 ++counter; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
749 } |
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 std::string orderByFieldsString; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
752 Toolbox::JoinStrings(orderByFieldsString, orderByFields, ", "); |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
753 ordering = "ROW_NUMBER() OVER (ORDER BY " + orderByFieldsString + ") AS rowNumber"; |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
754 } |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
755 else |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
756 { |
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
757 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
|
758 } |
5750
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
759 |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
760 sql = ("SELECT " + |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
761 strQueryLevel + ".publicId, " + |
5796
16ce3c920f71
rewrote SQLite find using CTEs instead of temporary tables
Alain Mazy <am@orthanc.team>
parents:
5765
diff
changeset
|
762 strQueryLevel + ".internalId, " + |
16ce3c920f71
rewrote SQLite find using CTEs instead of temporary tables
Alain Mazy <am@orthanc.team>
parents:
5765
diff
changeset
|
763 ordering + |
5750
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
764 " FROM Resources AS " + strQueryLevel); |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
765 |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
766 |
5748
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
767 std::string joins, comparisons; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
768 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
769 { |
5826
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
770 // handle parent constraints |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
771 if (request.GetOrthancIdentifiers().IsDefined() && request.GetOrthancIdentifiers().DetectLevel() <= queryLevel) |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
772 { |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
773 ResourceType topParentLevel = request.GetOrthancIdentifiers().DetectLevel(); |
5748
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
774 |
5826
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
775 if (topParentLevel == queryLevel) |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
776 { |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
777 comparisons += " AND " + FormatLevel(topParentLevel) + ".publicId = " + formatter.GenerateParameter(request.GetOrthancIdentifiers().GetLevel(topParentLevel)); |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
778 } |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
779 else |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
780 { |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
781 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
|
782 |
5826
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
783 for (int level = queryLevel; level > topParentLevel; level--) |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
784 { |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
785 joins += " INNER JOIN Resources " + |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
786 FormatLevel("parent", static_cast<ResourceType>(level - 1)) + " ON " + |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
787 FormatLevel("parent", static_cast<ResourceType>(level - 1)) + ".internalId = "; |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
788 if (level == queryLevel) |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
789 { |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
790 joins += FormatLevel(static_cast<ResourceType>(level)) + ".parentId"; |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
791 } |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
792 else |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
793 { |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
794 joins += FormatLevel("parent", static_cast<ResourceType>(level)) + ".parentId"; |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
795 } |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
796 } |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
797 } |
d73dfb4548c6
tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents:
5825
diff
changeset
|
798 } |
5748
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
799 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
800 size_t count = 0; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
801 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
802 const DatabaseConstraints& dicomTagsConstraints = request.GetDicomTagConstraints(); |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
803 for (size_t i = 0; i < dicomTagsConstraints.GetSize(); i++) |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
804 { |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
805 const DatabaseConstraint& constraint = dicomTagsConstraints.GetConstraint(i); |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
806 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
807 std::string comparison; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
808 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
809 if (FormatComparison(comparison, formatter, constraint, count, escapeBrackets)) |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
810 { |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
811 std::string join; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
812 FormatJoin(join, constraint, count); |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
813 joins += join; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
814 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
815 if (!comparison.empty()) |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
816 { |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
817 comparisons += " AND " + comparison; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
818 } |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
819 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
820 count ++; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
821 } |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
822 } |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
823 } |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
824 |
5750
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
825 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
|
826 { |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
827 sql += (" INNER JOIN Resources " + |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
828 FormatLevel(static_cast<ResourceType>(level)) + " ON " + |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
829 FormatLevel(static_cast<ResourceType>(level)) + ".internalId=" + |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
830 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
|
831 } |
5748
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
832 |
5750
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
833 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
|
834 { |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
835 sql += (" INNER JOIN Resources " + |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
836 FormatLevel(static_cast<ResourceType>(level)) + " ON " + |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
837 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
|
838 FormatLevel(static_cast<ResourceType>(level)) + ".parentId"); |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
839 } |
5748
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
840 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
841 std::list<std::string> where; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
842 where.push_back(strQueryLevel + ".resourceType = " + |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
843 formatter.FormatResourceType(queryLevel) + comparisons); |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
844 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
845 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
846 if (!request.GetLabels().empty()) |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
847 { |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
848 /** |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
849 * "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
|
850 * 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
|
851 * question are NOT NULL." |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
852 * 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
|
853 **/ |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
854 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
855 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
|
856 std::list<std::string> formattedLabels; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
857 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
|
858 { |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
859 formattedLabels.push_back(formatter.GenerateParameter(*it)); |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
860 } |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
861 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
862 std::string condition; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
863 switch (request.GetLabelsConstraint()) |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
864 { |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
865 case LabelsConstraint_Any: |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
866 condition = "> 0"; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
867 break; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
868 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
869 case LabelsConstraint_All: |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
870 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
|
871 break; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
872 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
873 case LabelsConstraint_None: |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
874 condition = "= 0"; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
875 break; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
876 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
877 default: |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
878 throw OrthancException(ErrorCode_ParameterOutOfRange); |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
879 } |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
880 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
881 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
|
882 ".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
|
883 } |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
884 |
5825
881cd0965146
added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents:
5796
diff
changeset
|
885 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
|
886 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
887 if (request.HasLimits()) |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
888 { |
5762
d52b3f394f69
FormatLimits (SQLServer needs custom code)
Alain Mazy <am@orthanc.team>
parents:
5752
diff
changeset
|
889 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
|
890 } |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
891 } |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
892 |
5422 | 893 |
894 void ISqlLookupFormatter::ApplySingleLevel(std::string& sql, | |
895 ISqlLookupFormatter& formatter, | |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
896 const DatabaseConstraints& lookup, |
5422 | 897 ResourceType queryLevel, |
898 const std::set<std::string>& labels, | |
899 LabelsConstraint labelsConstraint, | |
900 size_t limit | |
901 ) | |
902 { | |
903 ResourceType lowerLevel, upperLevel; | |
904 GetLookupLevels(lowerLevel, upperLevel, queryLevel, lookup); | |
905 | |
906 assert(upperLevel == queryLevel && | |
907 queryLevel == lowerLevel); | |
908 | |
909 const bool escapeBrackets = formatter.IsEscapeBrackets(); | |
910 | |
911 std::vector<std::string> mainDicomTagsComparisons, dicomIdentifiersComparisons; | |
912 | |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
913 for (size_t i = 0; i < lookup.GetSize(); i++) |
5422 | 914 { |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
915 const DatabaseConstraint& constraint = lookup.GetConstraint(i); |
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
916 |
5422 | 917 std::string comparison; |
918 | |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
919 if (FormatComparison2(comparison, formatter, constraint, escapeBrackets)) |
5422 | 920 { |
921 if (!comparison.empty()) | |
922 { | |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
923 if (constraint.IsIdentifier()) |
5422 | 924 { |
925 dicomIdentifiersComparisons.push_back(comparison); | |
926 } | |
927 else | |
928 { | |
929 mainDicomTagsComparisons.push_back(comparison); | |
930 } | |
931 } | |
932 } | |
933 } | |
934 | |
935 sql = ("SELECT publicId, internalId " | |
936 "FROM Resources " | |
937 "WHERE resourceType = " + formatter.FormatResourceType(queryLevel) | |
938 + " "); | |
939 | |
940 if (dicomIdentifiersComparisons.size() > 0) | |
941 { | |
942 for (std::vector<std::string>::const_iterator it = dicomIdentifiersComparisons.begin(); it < dicomIdentifiersComparisons.end(); ++it) | |
943 { | |
944 sql += (" AND internalId IN (SELECT id FROM DicomIdentifiers WHERE " + *it + ") "); | |
945 } | |
946 } | |
947 | |
948 if (mainDicomTagsComparisons.size() > 0) | |
949 { | |
950 for (std::vector<std::string>::const_iterator it = mainDicomTagsComparisons.begin(); it < mainDicomTagsComparisons.end(); ++it) | |
951 { | |
952 sql += (" AND internalId IN (SELECT id FROM MainDicomTags WHERE " + *it + ") "); | |
953 } | |
954 } | |
955 | |
956 if (!labels.empty()) | |
957 { | |
958 /** | |
959 * "In SQL Server, NOT EXISTS and NOT IN predicates are the best | |
960 * way to search for missing values, as long as both columns in | |
961 * question are NOT NULL." | |
962 * https://explainextended.com/2009/09/15/not-in-vs-not-exists-vs-left-join-is-null-sql-server/ | |
963 **/ | |
964 | |
965 std::list<std::string> formattedLabels; | |
966 for (std::set<std::string>::const_iterator it = labels.begin(); it != labels.end(); ++it) | |
967 { | |
968 formattedLabels.push_back(formatter.GenerateParameter(*it)); | |
969 } | |
970 | |
971 std::string condition; | |
972 std::string inOrNotIn; | |
973 switch (labelsConstraint) | |
974 { | |
975 case LabelsConstraint_Any: | |
976 condition = "> 0"; | |
977 inOrNotIn = "IN"; | |
978 break; | |
979 | |
980 case LabelsConstraint_All: | |
981 condition = "= " + boost::lexical_cast<std::string>(labels.size()); | |
982 inOrNotIn = "IN"; | |
983 break; | |
984 | |
985 case LabelsConstraint_None: | |
986 condition = "> 0"; | |
987 inOrNotIn = "NOT IN"; | |
988 break; | |
989 | |
990 default: | |
991 throw OrthancException(ErrorCode_ParameterOutOfRange); | |
992 } | |
993 | |
994 sql += (" AND internalId " + inOrNotIn + " (SELECT id" | |
995 " FROM (SELECT id, COUNT(1) AS labelsCount " | |
996 "FROM Labels " | |
997 "WHERE label IN (" + Join(formattedLabels, "", ", ") + ") GROUP BY id" | |
998 ") AS temp " | |
999 " WHERE labelsCount " + condition + ")"); | |
1000 } | |
1001 | |
1002 if (limit != 0) | |
1003 { | |
1004 sql += " LIMIT " + boost::lexical_cast<std::string>(limit); | |
1005 } | |
1006 } | |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1007 } |