annotate OrthancServer/ResourceFinder.cpp @ 1352:382439943749

ResourceFinder
author Sebastien Jodogne <s.jodogne@gmail.com>
date Mon, 11 May 2015 17:25:53 +0200
parents
children d7da97e21161
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1352
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1 /**
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2 * Orthanc - A Lightweight, RESTful DICOM Store
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3 * Copyright (C) 2012-2015 Sebastien Jodogne, Medical Physics
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4 * Department, University Hospital of Liege, Belgium
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
5 *
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
6 * This program is free software: you can redistribute it and/or
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
7 * modify it under the terms of the GNU General Public License as
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
8 * published by the Free Software Foundation, either version 3 of the
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
9 * License, or (at your option) any later version.
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
10 *
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
11 * In addition, as a special exception, the copyright holders of this
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
12 * program give permission to link the code of its release with the
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
13 * OpenSSL project's "OpenSSL" library (or with modified versions of it
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
14 * that use the same license as the "OpenSSL" library), and distribute
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
15 * the linked executables. You must obey the GNU General Public License
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
16 * in all respects for all of the code used other than "OpenSSL". If you
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
17 * modify file(s) with this exception, you may extend this exception to
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
18 * your version of the file(s), but you are not obligated to do so. If
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
19 * you do not wish to do so, delete this exception statement from your
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
20 * version. If you delete this exception statement from all source files
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
21 * in the program, then also delete it here.
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
22 *
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
23 * This program is distributed in the hope that it will be useful, but
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
24 * WITHOUT ANY WARRANTY; without even the implied warranty of
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
25 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
26 * General Public License for more details.
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
27 *
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
28 * You should have received a copy of the GNU General Public License
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
29 * along with this program. If not, see <http://www.gnu.org/licenses/>.
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
30 **/
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
31
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
32
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
33 #include "PrecompiledHeadersServer.h"
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
34 #include "ResourceFinder.h"
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
35
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
36 #include "FromDcmtkBridge.h"
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
37
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
38 #include <glog/logging.h>
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
39 #include <boost/algorithm/string/predicate.hpp>
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
40
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
41 namespace Orthanc
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
42 {
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
43 static bool Compare(const std::string& a,
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
44 const std::string& b,
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
45 bool caseSensitive)
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
46 {
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
47 if (caseSensitive)
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
48 {
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
49 return a == b;
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
50 }
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
51 else
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
52 {
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
53 return boost::iequals(a, b);
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
54 }
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
55 }
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
56
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
57
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
58 namespace
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
59 {
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
60 class CandidateResources
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
61 {
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
62 private:
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
63 ServerIndex& index_;
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
64 ResourceType level_;
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
65 bool isFilterApplied_;
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
66 std::set<std::string> filtered_;
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
67
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
68
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
69 static void ListToSet(std::set<std::string>& target,
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
70 const std::list<std::string>& source)
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
71 {
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
72 for (std::list<std::string>::const_iterator
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
73 it = source.begin(); it != source.end(); ++it)
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
74 {
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
75 target.insert(*it);
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
76 }
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
77 }
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
78
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
79
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
80 public:
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
81 CandidateResources(ServerIndex& index) :
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
82 index_(index),
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
83 level_(ResourceType_Patient),
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
84 isFilterApplied_(false)
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
85 {
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
86 }
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
87
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
88 ResourceType GetLevel() const
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
89 {
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
90 return level_;
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
91 }
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
92
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
93 void GoDown()
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
94 {
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
95 assert(level_ != ResourceType_Instance);
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
96
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
97 if (isFilterApplied_)
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
98 {
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
99 std::set<std::string> tmp = filtered_;
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
100
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
101 filtered_.clear();
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
102
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
103 for (std::set<std::string>::const_iterator
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
104 it = tmp.begin(); it != tmp.end(); ++it)
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
105 {
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
106 std::list<std::string> children;
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
107 index_.GetChildren(children, *it);
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
108 ListToSet(filtered_, children);
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
109 }
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
110 }
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
111
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
112 switch (level_)
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
113 {
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
114 case ResourceType_Patient:
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
115 level_ = ResourceType_Study;
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
116 break;
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
117
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
118 case ResourceType_Study:
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
119 level_ = ResourceType_Series;
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
120 break;
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
121
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
122 case ResourceType_Series:
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
123 level_ = ResourceType_Instance;
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
124 break;
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
125
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
126 default:
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
127 throw OrthancException(ErrorCode_InternalError);
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
128 }
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
129 }
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
130
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
131
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
132 void Flatten(std::list<std::string>& resources) const
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
133 {
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
134 resources.clear();
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
135
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
136 if (isFilterApplied_)
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
137 {
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
138 for (std::set<std::string>::const_iterator
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
139 it = filtered_.begin(); it != filtered_.end(); ++it)
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
140 {
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
141 resources.push_back(*it);
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
142 }
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
143 }
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
144 else
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
145 {
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
146 Json::Value tmp;
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
147 index_.GetAllUuids(tmp, level_);
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
148 for (Json::Value::ArrayIndex i = 0; i < tmp.size(); i++)
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
149 {
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
150 resources.push_back(tmp[i].asString());
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
151 }
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
152 }
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
153 }
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
154
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
155
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
156 void RestrictIdentifier(const DicomTag& tag,
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
157 const std::string& value)
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
158 {
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
159 assert((level_ == ResourceType_Patient && tag == DICOM_TAG_PATIENT_ID) ||
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
160 (level_ == ResourceType_Study && tag == DICOM_TAG_STUDY_INSTANCE_UID) ||
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
161 (level_ == ResourceType_Study && tag == DICOM_TAG_ACCESSION_NUMBER) ||
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
162 (level_ == ResourceType_Series && tag == DICOM_TAG_SERIES_INSTANCE_UID) ||
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
163 (level_ == ResourceType_Instance && tag == DICOM_TAG_SOP_INSTANCE_UID));
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
164
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
165 LOG(INFO) << "Lookup for identifier tag "
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
166 << FromDcmtkBridge::GetName(tag) << " (value: " << value << ")";
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
167
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
168 std::list<std::string> resources;
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
169 index_.LookupIdentifier(resources, tag, value, level_);
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
170
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
171 if (isFilterApplied_)
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
172 {
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
173 std::set<std::string> s;
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
174 ListToSet(s, resources);
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
175
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
176 std::set<std::string> tmp = filtered_;
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
177 filtered_.clear();
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
178
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
179 for (std::set<std::string>::const_iterator
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
180 it = tmp.begin(); it != tmp.end(); ++it)
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
181 {
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
182 if (s.find(*it) != s.end())
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
183 {
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
184 filtered_.insert(*it);
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
185 }
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
186 }
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
187 }
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
188 else
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
189 {
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
190 assert(filtered_.empty());
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
191 isFilterApplied_ = true;
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
192 ListToSet(filtered_, resources);
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
193 }
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
194 }
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
195
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
196
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
197 void RestrictMainDicomTags(const ResourceFinder::Query& query,
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
198 bool caseSensitive)
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
199 {
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
200 std::list<std::string> resources;
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
201 Flatten(resources);
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
202
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
203 isFilterApplied_ = true;
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
204 filtered_.clear();
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
205
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
206 for (std::list<std::string>::const_iterator
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
207 it = resources.begin(); it != resources.end(); it++)
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
208 {
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
209 DicomMap mainTags;
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
210 if (index_.GetMainDicomTags(mainTags, *it, level_))
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
211 {
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
212 for (ResourceFinder::Query::const_iterator
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
213 tag = query.begin(); tag != query.end(); ++tag)
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
214 {
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
215 assert(DicomMap::IsMainDicomTag(tag->first, level_));
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
216 LOG(INFO) << "Lookup for main DICOM tag "
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
217 << FromDcmtkBridge::GetName(tag->first) << " (value: " << tag->second << ")";
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
218
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
219 const DicomValue* value = mainTags.TestAndGetValue(tag->first);
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
220 if (value != NULL &&
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
221 Compare(value->AsString(), tag->second, caseSensitive))
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
222 {
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
223 filtered_.insert(*it);
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
224 }
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
225 }
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
226 }
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
227 }
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
228 }
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
229 };
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
230 }
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
231
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
232
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
233 ResourceFinder::ResourceFinder(ServerContext& context) :
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
234 context_(context),
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
235 level_(ResourceType_Patient),
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
236 caseSensitive_(true)
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
237 {
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
238 }
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
239
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
240
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
241 void ResourceFinder::AddTag(const std::string& tag,
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
242 const std::string& value)
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
243 {
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
244 AddTag(FromDcmtkBridge::ParseTag(tag.c_str()), value);
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
245 }
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
246
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
247
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
248 void ResourceFinder::Apply(std::list<std::string>& result)
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
249 {
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
250 result.clear();
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
251 }
382439943749 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
252 }