Mercurial > hg > orthanc
annotate OrthancServer/Sources/Search/ISqlLookupFormatter.cpp @ 5750:f39406a9eda4 find-refactoring
ExtendedFind in SQLite continued (6 tests still failing)
author | Alain Mazy <am@orthanc.team> |
---|---|
date | Tue, 03 Sep 2024 09:34:41 +0200 |
parents | 4bc650d88463 |
children | 717acb0ea546 |
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 |
4096
d633e5bb7ba3
reusing of ISqlLookupFormatter and DatabaseConstraint in orthanc-databases project
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4045
diff
changeset
|
24 #if !defined(ORTHANC_BUILDING_SERVER_LIBRARY) |
d633e5bb7ba3
reusing of ISqlLookupFormatter and DatabaseConstraint in orthanc-databases project
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4045
diff
changeset
|
25 # error Macro ORTHANC_BUILDING_SERVER_LIBRARY must be defined |
d633e5bb7ba3
reusing of ISqlLookupFormatter and DatabaseConstraint in orthanc-databases project
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4045
diff
changeset
|
26 #endif |
d633e5bb7ba3
reusing of ISqlLookupFormatter and DatabaseConstraint in orthanc-databases project
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4045
diff
changeset
|
27 |
d633e5bb7ba3
reusing of ISqlLookupFormatter and DatabaseConstraint in orthanc-databases project
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4045
diff
changeset
|
28 #if ORTHANC_BUILDING_SERVER_LIBRARY == 1 |
d633e5bb7ba3
reusing of ISqlLookupFormatter and DatabaseConstraint in orthanc-databases project
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4045
diff
changeset
|
29 # include "../PrecompiledHeadersServer.h" |
d633e5bb7ba3
reusing of ISqlLookupFormatter and DatabaseConstraint in orthanc-databases project
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4045
diff
changeset
|
30 #endif |
d633e5bb7ba3
reusing of ISqlLookupFormatter and DatabaseConstraint in orthanc-databases project
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4045
diff
changeset
|
31 |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
32 #include "ISqlLookupFormatter.h" |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
33 |
4096
d633e5bb7ba3
reusing of ISqlLookupFormatter and DatabaseConstraint in orthanc-databases project
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4045
diff
changeset
|
34 #if ORTHANC_BUILDING_SERVER_LIBRARY == 1 |
d633e5bb7ba3
reusing of ISqlLookupFormatter and DatabaseConstraint in orthanc-databases project
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4045
diff
changeset
|
35 # include "../../../OrthancFramework/Sources/OrthancException.h" |
5422 | 36 # include "../../../OrthancFramework/Sources/Toolbox.h" |
5748
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
37 # include "../Database/FindRequest.h" |
4096
d633e5bb7ba3
reusing of ISqlLookupFormatter and DatabaseConstraint in orthanc-databases project
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4045
diff
changeset
|
38 #else |
d633e5bb7ba3
reusing of ISqlLookupFormatter and DatabaseConstraint in orthanc-databases project
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4045
diff
changeset
|
39 # include <OrthancException.h> |
5422 | 40 # include <Toolbox.h> |
4096
d633e5bb7ba3
reusing of ISqlLookupFormatter and DatabaseConstraint in orthanc-databases project
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4045
diff
changeset
|
41 #endif |
d633e5bb7ba3
reusing of ISqlLookupFormatter and DatabaseConstraint in orthanc-databases project
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4045
diff
changeset
|
42 |
3100
f6de9d25b20d
removing build dependency on plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3079
diff
changeset
|
43 #include "DatabaseConstraint.h" |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
44 |
5477 | 45 #include <cassert> |
4304 | 46 #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
|
47 #include <list> |
4304 | 48 |
49 | |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
50 namespace Orthanc |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
51 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
52 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
|
53 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
54 switch (level) |
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 case ResourceType_Patient: |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
57 return "patients"; |
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 case ResourceType_Study: |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
60 return "studies"; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
61 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
62 case ResourceType_Series: |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
63 return "series"; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
64 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
65 case ResourceType_Instance: |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
66 return "instances"; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
67 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
68 default: |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
69 throw OrthancException(ErrorCode_InternalError); |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
70 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
71 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
72 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
73 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
74 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
|
75 ISqlLookupFormatter& formatter, |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
76 const DatabaseConstraint& constraint, |
4817
b8fcd331b4b3
added ISqlLookupFormatter::IsEscapeBrackets()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
77 size_t index, |
b8fcd331b4b3
added ISqlLookupFormatter::IsEscapeBrackets()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
78 bool escapeBrackets) |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
79 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
80 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
|
81 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
82 std::string comparison; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
83 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
84 switch (constraint.GetConstraintType()) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
85 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
86 case ConstraintType_Equal: |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
87 case ConstraintType_SmallerOrEqual: |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
88 case ConstraintType_GreaterOrEqual: |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
89 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
90 std::string op; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
91 switch (constraint.GetConstraintType()) |
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 case ConstraintType_Equal: |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
94 op = "="; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
95 break; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
96 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
97 case ConstraintType_SmallerOrEqual: |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
98 op = "<="; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
99 break; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
100 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
101 case ConstraintType_GreaterOrEqual: |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
102 op = ">="; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
103 break; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
104 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
105 default: |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
106 throw OrthancException(ErrorCode_InternalError); |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
107 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
108 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
109 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
|
110 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
111 if (constraint.IsCaseSensitive()) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
112 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
113 comparison = tag + ".value " + op + " " + parameter; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
114 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
115 else |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
116 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
117 comparison = "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
|
118 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
119 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
120 break; |
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 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
123 case ConstraintType_List: |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
124 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
125 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
|
126 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
127 if (!comparison.empty()) |
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 comparison += ", "; |
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 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
|
133 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
134 if (constraint.IsCaseSensitive()) |
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 comparison += parameter; |
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 else |
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 comparison += "lower(" + parameter + ")"; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
141 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
142 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
143 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
144 if (constraint.IsCaseSensitive()) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
145 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
146 comparison = tag + ".value IN (" + comparison + ")"; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
147 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
148 else |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
149 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
150 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
|
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 break; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
154 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
155 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
156 case ConstraintType_Wildcard: |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
157 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
158 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
|
159 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
160 if (value == "*") |
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 if (!constraint.IsMandatory()) |
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 // 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
|
165 return false; |
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 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
168 else |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
169 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
170 std::string escaped; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
171 escaped.reserve(value.size()); |
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 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
|
174 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
175 if (value[i] == '*') |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
176 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
177 escaped += "%"; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
178 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
179 else if (value[i] == '?') |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
180 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
181 escaped += "_"; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
182 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
183 else if (value[i] == '%') |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
184 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
185 escaped += "\\%"; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
186 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
187 else if (value[i] == '_') |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
188 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
189 escaped += "\\_"; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
190 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
191 else if (value[i] == '\\') |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
192 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
193 escaped += "\\\\"; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
194 } |
4817
b8fcd331b4b3
added ISqlLookupFormatter::IsEscapeBrackets()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
195 else if (escapeBrackets && value[i] == '[') |
b8fcd331b4b3
added ISqlLookupFormatter::IsEscapeBrackets()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
196 { |
b8fcd331b4b3
added ISqlLookupFormatter::IsEscapeBrackets()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
197 escaped += "\\["; |
b8fcd331b4b3
added ISqlLookupFormatter::IsEscapeBrackets()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
198 } |
b8fcd331b4b3
added ISqlLookupFormatter::IsEscapeBrackets()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
199 else if (escapeBrackets && value[i] == ']') |
b8fcd331b4b3
added ISqlLookupFormatter::IsEscapeBrackets()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
200 { |
b8fcd331b4b3
added ISqlLookupFormatter::IsEscapeBrackets()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
201 escaped += "\\]"; |
b8fcd331b4b3
added ISqlLookupFormatter::IsEscapeBrackets()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
202 } |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
203 else |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
204 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
205 escaped += value[i]; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
206 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
207 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
208 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
209 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
|
210 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
211 if (constraint.IsCaseSensitive()) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
212 { |
3079
65e2bfa953ef
ISqlLookupFormatter::FormatWildcardEscape()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3078
diff
changeset
|
213 comparison = (tag + ".value LIKE " + parameter + " " + |
65e2bfa953ef
ISqlLookupFormatter::FormatWildcardEscape()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3078
diff
changeset
|
214 formatter.FormatWildcardEscape()); |
3058
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 else |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
217 { |
3079
65e2bfa953ef
ISqlLookupFormatter::FormatWildcardEscape()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3078
diff
changeset
|
218 comparison = ("lower(" + tag + ".value) LIKE lower(" + |
65e2bfa953ef
ISqlLookupFormatter::FormatWildcardEscape()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3078
diff
changeset
|
219 parameter + ") " + formatter.FormatWildcardEscape()); |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
220 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
221 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
222 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
223 break; |
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 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
226 default: |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
227 return false; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
228 } |
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 if (constraint.IsMandatory()) |
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 target = comparison; |
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 else if (comparison.empty()) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
235 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
236 target = tag + ".value IS NULL"; |
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 else |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
239 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
240 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
|
241 } |
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 return true; |
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 |
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 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
|
248 const DatabaseConstraint& constraint, |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
249 size_t index) |
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 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
|
252 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
253 if (constraint.IsMandatory()) |
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 target = " INNER JOIN "; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
256 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
257 else |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
258 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
259 target = " LEFT JOIN "; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
260 } |
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.IsIdentifier()) |
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 += "DicomIdentifiers "; |
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 += "MainDicomTags "; |
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 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
|
272 ".internalId AND " + tag + ".tagGroup = " + |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
273 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
|
274 " AND " + tag + ".tagElement = " + |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
275 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
|
276 } |
5227
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
277 |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
278 |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
279 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
|
280 const std::string& prefix, |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
281 const std::string& separator) |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
282 { |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
283 if (values.empty()) |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
284 { |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
285 return ""; |
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 else |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
288 { |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
289 std::string s = prefix; |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
290 |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
291 bool first = true; |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
292 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
|
293 { |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
294 if (first) |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
295 { |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
296 first = false; |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
297 } |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
298 else |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
299 { |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
300 s += separator; |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
301 } |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
302 |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
303 s += *it; |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
304 } |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
305 |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
306 return s; |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
307 } |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
308 } |
5422 | 309 |
310 static bool FormatComparison2(std::string& target, | |
311 ISqlLookupFormatter& formatter, | |
312 const DatabaseConstraint& constraint, | |
313 bool escapeBrackets) | |
314 { | |
315 std::string comparison; | |
316 std::string tagFilter = ("tagGroup = " + boost::lexical_cast<std::string>(constraint.GetTag().GetGroup()) | |
317 + " AND tagElement = " + boost::lexical_cast<std::string>(constraint.GetTag().GetElement())); | |
318 | |
319 switch (constraint.GetConstraintType()) | |
320 { | |
321 case ConstraintType_Equal: | |
322 case ConstraintType_SmallerOrEqual: | |
323 case ConstraintType_GreaterOrEqual: | |
324 { | |
325 std::string op; | |
326 switch (constraint.GetConstraintType()) | |
327 { | |
328 case ConstraintType_Equal: | |
329 op = "="; | |
330 break; | |
331 | |
332 case ConstraintType_SmallerOrEqual: | |
333 op = "<="; | |
334 break; | |
335 | |
336 case ConstraintType_GreaterOrEqual: | |
337 op = ">="; | |
338 break; | |
339 | |
340 default: | |
341 throw OrthancException(ErrorCode_InternalError); | |
342 } | |
343 | |
344 std::string parameter = formatter.GenerateParameter(constraint.GetSingleValue()); | |
345 | |
346 if (constraint.IsCaseSensitive()) | |
347 { | |
348 comparison = " AND value " + op + " " + parameter; | |
349 } | |
350 else | |
351 { | |
352 comparison = " AND lower(value) " + op + " lower(" + parameter + ")"; | |
353 } | |
354 | |
355 break; | |
356 } | |
357 | |
358 case ConstraintType_List: | |
359 { | |
360 std::vector<std::string> comparisonValues; | |
361 for (size_t i = 0; i < constraint.GetValuesCount(); i++) | |
362 { | |
363 std::string parameter = formatter.GenerateParameter(constraint.GetValue(i)); | |
364 | |
365 if (constraint.IsCaseSensitive()) | |
366 { | |
367 comparisonValues.push_back(parameter); | |
368 } | |
369 else | |
370 { | |
371 comparisonValues.push_back("lower(" + parameter + ")"); | |
372 } | |
373 } | |
374 | |
375 std::string values; | |
376 Toolbox::JoinStrings(values, comparisonValues, ", "); | |
377 | |
378 if (constraint.IsCaseSensitive()) | |
379 { | |
380 comparison = " AND value IN (" + values + ")"; | |
381 } | |
382 else | |
383 { | |
384 comparison = " AND lower(value) IN (" + values + ")"; | |
385 } | |
386 | |
387 break; | |
388 } | |
389 | |
390 case ConstraintType_Wildcard: | |
391 { | |
392 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
|
393 |
5422 | 394 if (value == "*") |
395 { | |
396 if (!constraint.IsMandatory()) | |
397 { | |
398 // Universal constraint on an optional tag, ignore it | |
399 return false; | |
400 } | |
401 } | |
402 else | |
403 { | |
404 std::string escaped; | |
405 escaped.reserve(value.size()); | |
406 | |
407 for (size_t i = 0; i < value.size(); i++) | |
408 { | |
409 if (value[i] == '*') | |
410 { | |
411 escaped += "%"; | |
412 } | |
413 else if (value[i] == '?') | |
414 { | |
415 escaped += "_"; | |
416 } | |
417 else if (value[i] == '%') | |
418 { | |
419 escaped += "\\%"; | |
420 } | |
421 else if (value[i] == '_') | |
422 { | |
423 escaped += "\\_"; | |
424 } | |
425 else if (value[i] == '\\') | |
426 { | |
427 escaped += "\\\\"; | |
428 } | |
429 else if (escapeBrackets && value[i] == '[') | |
430 { | |
431 escaped += "\\["; | |
432 } | |
433 else if (escapeBrackets && value[i] == ']') | |
434 { | |
435 escaped += "\\]"; | |
436 } | |
437 else | |
438 { | |
439 escaped += value[i]; | |
440 } | |
441 } | |
442 | |
443 std::string parameter = formatter.GenerateParameter(escaped); | |
444 | |
445 if (constraint.IsCaseSensitive()) | |
446 { | |
447 comparison = " AND value LIKE " + parameter + " " + formatter.FormatWildcardEscape(); | |
448 } | |
449 else | |
450 { | |
451 comparison = " AND lower(value) LIKE lower(" + parameter + ") " + formatter.FormatWildcardEscape(); | |
452 } | |
453 } | |
454 | |
455 break; | |
456 } | |
457 | |
458 default: | |
459 return false; | |
460 } | |
461 | |
462 if (constraint.IsMandatory()) | |
463 { | |
464 target = tagFilter + comparison; | |
465 } | |
466 else if (comparison.empty()) | |
467 { | |
468 target = tagFilter + " AND value IS NULL"; | |
469 } | |
470 else | |
471 { | |
472 target = tagFilter + " AND value IS NULL OR " + comparison; | |
473 } | |
474 | |
475 return true; | |
476 } | |
477 | |
478 | |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
479 void ISqlLookupFormatter::GetLookupLevels(ResourceType& lowerLevel, |
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
480 ResourceType& upperLevel, |
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
481 const ResourceType& queryLevel, |
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
482 const DatabaseConstraints& lookup) |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
483 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
484 assert(ResourceType_Patient < ResourceType_Study && |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
485 ResourceType_Study < ResourceType_Series && |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
486 ResourceType_Series < ResourceType_Instance); |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
487 |
5422 | 488 lowerLevel = queryLevel; |
489 upperLevel = queryLevel; | |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
490 |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
491 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
|
492 { |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
493 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
|
494 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
495 if (level < upperLevel) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
496 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
497 upperLevel = level; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
498 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
499 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
500 if (level > lowerLevel) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
501 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
502 lowerLevel = level; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
503 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
504 } |
5422 | 505 } |
506 | |
507 | |
508 void ISqlLookupFormatter::Apply(std::string& sql, | |
509 ISqlLookupFormatter& formatter, | |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
510 const DatabaseConstraints& lookup, |
5422 | 511 ResourceType queryLevel, |
512 const std::set<std::string>& labels, | |
513 LabelsConstraint labelsConstraint, | |
514 size_t limit) | |
515 { | |
516 ResourceType lowerLevel, upperLevel; | |
517 GetLookupLevels(lowerLevel, upperLevel, queryLevel, lookup); | |
518 | |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
519 assert(upperLevel <= queryLevel && |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
520 queryLevel <= lowerLevel); |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
521 |
4817
b8fcd331b4b3
added ISqlLookupFormatter::IsEscapeBrackets()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
522 const bool escapeBrackets = formatter.IsEscapeBrackets(); |
b8fcd331b4b3
added ISqlLookupFormatter::IsEscapeBrackets()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
523 |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
524 std::string joins, comparisons; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
525 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
526 size_t count = 0; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
527 |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
528 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
|
529 { |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
530 const DatabaseConstraint& constraint = lookup.GetConstraint(i); |
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
531 |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
532 std::string comparison; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
533 |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
534 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
|
535 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
536 std::string join; |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
537 FormatJoin(join, constraint, count); |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
538 joins += join; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
539 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
540 if (!comparison.empty()) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
541 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
542 comparisons += " AND " + comparison; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
543 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
544 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
545 count ++; |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
546 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
547 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
548 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
549 sql = ("SELECT " + |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
550 FormatLevel(queryLevel) + ".publicId, " + |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
551 FormatLevel(queryLevel) + ".internalId" + |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
552 " FROM Resources AS " + FormatLevel(queryLevel)); |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
553 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
554 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
|
555 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
556 sql += (" INNER JOIN Resources " + |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
557 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
|
558 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
|
559 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
|
560 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
561 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
562 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
|
563 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
564 sql += (" INNER JOIN Resources " + |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
565 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
|
566 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
|
567 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
|
568 } |
5227
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
569 |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
570 std::list<std::string> where; |
5256 | 571 where.push_back(FormatLevel(queryLevel) + ".resourceType = " + |
572 formatter.FormatResourceType(queryLevel) + comparisons); | |
5227
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
573 |
5248
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
574 if (!labels.empty()) |
5227
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
575 { |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
576 /** |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
577 * "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
|
578 * 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
|
579 * question are NOT NULL." |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
580 * 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
|
581 **/ |
5248
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
582 |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
583 std::list<std::string> formattedLabels; |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
584 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
|
585 { |
5248
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
586 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
|
587 } |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
588 |
5248
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
589 std::string condition; |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
590 switch (labelsConstraint) |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
591 { |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
592 case LabelsConstraint_Any: |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
593 condition = "> 0"; |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
594 break; |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
595 |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
596 case LabelsConstraint_All: |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
597 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
|
598 break; |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
599 |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
600 case LabelsConstraint_None: |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
601 condition = "= 0"; |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
602 break; |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
603 |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
604 default: |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
605 throw OrthancException(ErrorCode_ParameterOutOfRange); |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
606 } |
a7d95f951f8a
replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5227
diff
changeset
|
607 |
5256 | 608 where.push_back("(SELECT COUNT(1) FROM Labels AS selectedLabels WHERE selectedLabels.id = " + FormatLevel(queryLevel) + |
609 ".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
|
610 } |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
611 |
988dab8deb1c
"/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
612 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
|
613 |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
614 if (limit != 0) |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
615 { |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
616 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
|
617 } |
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
618 } |
5422 | 619 |
5748
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
620 #if ORTHANC_BUILDING_SERVER_LIBRARY == 1 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
621 void ISqlLookupFormatter::Apply(std::string& sql, |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
622 ISqlLookupFormatter& formatter, |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
623 const FindRequest& request) |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
624 { |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
625 const bool escapeBrackets = formatter.IsEscapeBrackets(); |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
626 ResourceType queryLevel = request.GetLevel(); |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
627 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
|
628 |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
629 ResourceType lowerLevel, upperLevel; |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
630 GetLookupLevels(lowerLevel, upperLevel, queryLevel, request.GetDicomTagConstraints()); |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
631 |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
632 assert(upperLevel <= queryLevel && |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
633 queryLevel <= lowerLevel); |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
634 |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
635 |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
636 sql = ("SELECT " + |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
637 strQueryLevel + ".publicId, " + |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
638 strQueryLevel + ".internalId" + |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
639 " FROM Resources AS " + strQueryLevel); |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
640 |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
641 |
5748
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
642 std::string joins, comparisons; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
643 |
5750
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
644 if (request.GetOrthancIdentifiers().IsDefined() && request.GetOrthancIdentifiers().DetectLevel() <= queryLevel) |
5748
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
645 { |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
646 // single child resource matching, there should not be other constraints (at least for now) |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
647 assert(request.GetDicomTagConstraints().GetSize() == 0); |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
648 assert(request.GetLabels().size() == 0); |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
649 assert(request.HasLimits() == false); |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
650 |
5750
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
651 ResourceType topParentLevel = request.GetOrthancIdentifiers().DetectLevel(); |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
652 const std::string& strTopParentLevel = FormatLevel(topParentLevel); |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
653 |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
654 comparisons = " AND " + strTopParentLevel + ".publicId = " + formatter.GenerateParameter(request.GetOrthancIdentifiers().GetLevel(topParentLevel)); |
5748
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
655 |
5750
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
656 for (int level = queryLevel; level > topParentLevel; level--) |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
657 { |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
658 sql += (" INNER JOIN Resources " + |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
659 FormatLevel(static_cast<ResourceType>(level - 1)) + " ON " + |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
660 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
|
661 FormatLevel(static_cast<ResourceType>(level)) + ".parentId"); |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
662 } |
5748
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
663 } |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
664 else |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
665 { |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
666 size_t count = 0; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
667 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
668 const DatabaseConstraints& dicomTagsConstraints = request.GetDicomTagConstraints(); |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
669 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
|
670 { |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
671 const DatabaseConstraint& constraint = dicomTagsConstraints.GetConstraint(i); |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
672 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
673 std::string comparison; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
674 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
675 if (FormatComparison(comparison, formatter, constraint, count, escapeBrackets)) |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
676 { |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
677 std::string join; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
678 FormatJoin(join, constraint, count); |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
679 joins += join; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
680 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
681 if (!comparison.empty()) |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
682 { |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
683 comparisons += " AND " + comparison; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
684 } |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
685 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
686 count ++; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
687 } |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
688 } |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
689 } |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
690 |
5750
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
691 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
|
692 { |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
693 sql += (" INNER JOIN Resources " + |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
694 FormatLevel(static_cast<ResourceType>(level)) + " ON " + |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
695 FormatLevel(static_cast<ResourceType>(level)) + ".internalId=" + |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
696 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
|
697 } |
5748
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
698 |
5750
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
699 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
|
700 { |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
701 sql += (" INNER JOIN Resources " + |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
702 FormatLevel(static_cast<ResourceType>(level)) + " ON " + |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
703 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
|
704 FormatLevel(static_cast<ResourceType>(level)) + ".parentId"); |
f39406a9eda4
ExtendedFind in SQLite continued (6 tests still failing)
Alain Mazy <am@orthanc.team>
parents:
5748
diff
changeset
|
705 } |
5748
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
706 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
707 std::list<std::string> where; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
708 where.push_back(strQueryLevel + ".resourceType = " + |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
709 formatter.FormatResourceType(queryLevel) + comparisons); |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
710 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
711 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
712 if (!request.GetLabels().empty()) |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
713 { |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
714 /** |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
715 * "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
|
716 * 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
|
717 * question are NOT NULL." |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
718 * 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
|
719 **/ |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
720 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
721 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
|
722 std::list<std::string> formattedLabels; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
723 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
|
724 { |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
725 formattedLabels.push_back(formatter.GenerateParameter(*it)); |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
726 } |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
727 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
728 std::string condition; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
729 switch (request.GetLabelsConstraint()) |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
730 { |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
731 case LabelsConstraint_Any: |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
732 condition = "> 0"; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
733 break; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
734 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
735 case LabelsConstraint_All: |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
736 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
|
737 break; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
738 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
739 case LabelsConstraint_None: |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
740 condition = "= 0"; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
741 break; |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
742 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
743 default: |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
744 throw OrthancException(ErrorCode_ParameterOutOfRange); |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
745 } |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
746 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
747 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
|
748 ".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
|
749 } |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
750 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
751 sql += joins + Join(where, " WHERE ", " AND "); |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
752 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
753 if (request.HasLimits()) |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
754 { |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
755 sql += " LIMIT " + boost::lexical_cast<std::string>(request.GetLimitsCount()); |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
756 sql += " OFFSET " + boost::lexical_cast<std::string>(request.GetLimitsSince()); |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
757 } |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
758 |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
759 } |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
760 #endif |
4bc650d88463
WIP: started to implement IntegratedFind in SQLite
Alain Mazy <am@orthanc.team>
parents:
5680
diff
changeset
|
761 |
5422 | 762 |
763 void ISqlLookupFormatter::ApplySingleLevel(std::string& sql, | |
764 ISqlLookupFormatter& formatter, | |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
765 const DatabaseConstraints& lookup, |
5422 | 766 ResourceType queryLevel, |
767 const std::set<std::string>& labels, | |
768 LabelsConstraint labelsConstraint, | |
769 size_t limit | |
770 ) | |
771 { | |
772 ResourceType lowerLevel, upperLevel; | |
773 GetLookupLevels(lowerLevel, upperLevel, queryLevel, lookup); | |
774 | |
775 assert(upperLevel == queryLevel && | |
776 queryLevel == lowerLevel); | |
777 | |
778 const bool escapeBrackets = formatter.IsEscapeBrackets(); | |
779 | |
780 std::vector<std::string> mainDicomTagsComparisons, dicomIdentifiersComparisons; | |
781 | |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
782 for (size_t i = 0; i < lookup.GetSize(); i++) |
5422 | 783 { |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
784 const DatabaseConstraint& constraint = lookup.GetConstraint(i); |
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
785 |
5422 | 786 std::string comparison; |
787 | |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
788 if (FormatComparison2(comparison, formatter, constraint, escapeBrackets)) |
5422 | 789 { |
790 if (!comparison.empty()) | |
791 { | |
5680
68fc5af30c03
added container class DatabaseConstraints
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5640
diff
changeset
|
792 if (constraint.IsIdentifier()) |
5422 | 793 { |
794 dicomIdentifiersComparisons.push_back(comparison); | |
795 } | |
796 else | |
797 { | |
798 mainDicomTagsComparisons.push_back(comparison); | |
799 } | |
800 } | |
801 } | |
802 } | |
803 | |
804 sql = ("SELECT publicId, internalId " | |
805 "FROM Resources " | |
806 "WHERE resourceType = " + formatter.FormatResourceType(queryLevel) | |
807 + " "); | |
808 | |
809 if (dicomIdentifiersComparisons.size() > 0) | |
810 { | |
811 for (std::vector<std::string>::const_iterator it = dicomIdentifiersComparisons.begin(); it < dicomIdentifiersComparisons.end(); ++it) | |
812 { | |
813 sql += (" AND internalId IN (SELECT id FROM DicomIdentifiers WHERE " + *it + ") "); | |
814 } | |
815 } | |
816 | |
817 if (mainDicomTagsComparisons.size() > 0) | |
818 { | |
819 for (std::vector<std::string>::const_iterator it = mainDicomTagsComparisons.begin(); it < mainDicomTagsComparisons.end(); ++it) | |
820 { | |
821 sql += (" AND internalId IN (SELECT id FROM MainDicomTags WHERE " + *it + ") "); | |
822 } | |
823 } | |
824 | |
825 if (!labels.empty()) | |
826 { | |
827 /** | |
828 * "In SQL Server, NOT EXISTS and NOT IN predicates are the best | |
829 * way to search for missing values, as long as both columns in | |
830 * question are NOT NULL." | |
831 * https://explainextended.com/2009/09/15/not-in-vs-not-exists-vs-left-join-is-null-sql-server/ | |
832 **/ | |
833 | |
834 std::list<std::string> formattedLabels; | |
835 for (std::set<std::string>::const_iterator it = labels.begin(); it != labels.end(); ++it) | |
836 { | |
837 formattedLabels.push_back(formatter.GenerateParameter(*it)); | |
838 } | |
839 | |
840 std::string condition; | |
841 std::string inOrNotIn; | |
842 switch (labelsConstraint) | |
843 { | |
844 case LabelsConstraint_Any: | |
845 condition = "> 0"; | |
846 inOrNotIn = "IN"; | |
847 break; | |
848 | |
849 case LabelsConstraint_All: | |
850 condition = "= " + boost::lexical_cast<std::string>(labels.size()); | |
851 inOrNotIn = "IN"; | |
852 break; | |
853 | |
854 case LabelsConstraint_None: | |
855 condition = "> 0"; | |
856 inOrNotIn = "NOT IN"; | |
857 break; | |
858 | |
859 default: | |
860 throw OrthancException(ErrorCode_ParameterOutOfRange); | |
861 } | |
862 | |
863 sql += (" AND internalId " + inOrNotIn + " (SELECT id" | |
864 " FROM (SELECT id, COUNT(1) AS labelsCount " | |
865 "FROM Labels " | |
866 "WHERE label IN (" + Join(formattedLabels, "", ", ") + ") GROUP BY id" | |
867 ") AS temp " | |
868 " WHERE labelsCount " + condition + ")"); | |
869 } | |
870 | |
871 if (limit != 0) | |
872 { | |
873 sql += " LIMIT " + boost::lexical_cast<std::string>(limit); | |
874 } | |
875 } | |
876 | |
3058
6faf575ba9cc
refactoring: class ISqlLookupFormatter to be used in orthanc-databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
877 } |