annotate OrthancServer/Sources/Search/ISqlLookupFormatter.cpp @ 5828:7030fa489669 find-refactoring

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