comparison UnitTestsSources/DatabaseLookupTests.cpp @ 3025:039a9d262d64 db-changes

preparing to speed up find in databases
author Sebastien Jodogne <s.jodogne@gmail.com>
date Mon, 17 Dec 2018 17:05:28 +0100
parents 1723cbba55c7
children fd587cf51a89
comparison
equal deleted inserted replaced
3024:ef17a587e10d 3025:039a9d262d64
42 42
43 TEST(DatabaseLookup, SingleConstraint) 43 TEST(DatabaseLookup, SingleConstraint)
44 { 44 {
45 { 45 {
46 ASSERT_THROW(DicomTagConstraint tag(DICOM_TAG_PATIENT_NAME, ConstraintType_Equal, 46 ASSERT_THROW(DicomTagConstraint tag(DICOM_TAG_PATIENT_NAME, ConstraintType_Equal,
47 "HEL*LO", true), OrthancException); 47 "HEL*LO", true, true), OrthancException);
48 ASSERT_THROW(DicomTagConstraint tag(DICOM_TAG_PATIENT_NAME, ConstraintType_Equal, 48 ASSERT_THROW(DicomTagConstraint tag(DICOM_TAG_PATIENT_NAME, ConstraintType_Equal,
49 "HEL?LO", true), OrthancException); 49 "HEL?LO", true, true), OrthancException);
50 ASSERT_THROW(DicomTagConstraint tag(DICOM_TAG_PATIENT_NAME, ConstraintType_Equal, 50 ASSERT_THROW(DicomTagConstraint tag(DICOM_TAG_PATIENT_NAME, ConstraintType_Equal,
51 true), OrthancException); 51 true, true), OrthancException);
52 52
53 DicomTagConstraint tag(DICOM_TAG_PATIENT_NAME, ConstraintType_Equal, "HELLO", true); 53 DicomTagConstraint tag(DICOM_TAG_PATIENT_NAME, ConstraintType_Equal, "HELLO", true, true);
54 ASSERT_TRUE(tag.IsMatch("HELLO")); 54 ASSERT_TRUE(tag.IsMatch("HELLO"));
55 ASSERT_FALSE(tag.IsMatch("hello")); 55 ASSERT_FALSE(tag.IsMatch("hello"));
56 56
57 ASSERT_TRUE(tag.IsCaseSensitive()); 57 ASSERT_TRUE(tag.IsCaseSensitive());
58 ASSERT_EQ(ConstraintType_Equal, tag.GetConstraintType()); 58 ASSERT_EQ(ConstraintType_Equal, tag.GetType());
59
60 ASSERT_FALSE(tag.HasTagInfo());
61 ASSERT_THROW(tag.GetTagType(), OrthancException);
62 ASSERT_THROW(tag.GetLevel(), OrthancException);
63
64 tag.SetTagInfo(DicomTagType_Identifier, ResourceType_Series);
65 ASSERT_TRUE(tag.HasTagInfo());
66 ASSERT_EQ(DicomTagType_Identifier, tag.GetTagType());
67 ASSERT_EQ(ResourceType_Series, tag.GetLevel());
68 59
69 DicomMap m; 60 DicomMap m;
70 ASSERT_FALSE(tag.IsMatch(m)); 61 ASSERT_FALSE(tag.IsMatch(m));
71 m.SetNullValue(DICOM_TAG_PATIENT_NAME); 62 m.SetNullValue(DICOM_TAG_PATIENT_NAME);
72 ASSERT_FALSE(tag.IsMatch(m)); 63 ASSERT_FALSE(tag.IsMatch(m));
75 m.SetValue(DICOM_TAG_PATIENT_NAME, "HELLO", false /* string */); 66 m.SetValue(DICOM_TAG_PATIENT_NAME, "HELLO", false /* string */);
76 ASSERT_TRUE(tag.IsMatch(m)); 67 ASSERT_TRUE(tag.IsMatch(m));
77 } 68 }
78 69
79 { 70 {
80 DicomTagConstraint tag(DICOM_TAG_PATIENT_NAME, ConstraintType_Equal, "HELlo", false); 71 DicomTagConstraint tag(DICOM_TAG_PATIENT_NAME, ConstraintType_Equal, "HELlo", false, true);
81 ASSERT_TRUE(tag.IsMatch("HELLO")); 72 ASSERT_TRUE(tag.IsMatch("HELLO"));
82 ASSERT_TRUE(tag.IsMatch("hello")); 73 ASSERT_TRUE(tag.IsMatch("hello"));
83 74
84 ASSERT_EQ("HELlo", tag.GetValue()); 75 ASSERT_EQ("HELlo", tag.GetValue());
85 } 76 }
86 77
87 { 78 {
88 DicomTagConstraint tag(DICOM_TAG_PATIENT_NAME, ConstraintType_Wildcard, "HE*L?O", true); 79 DicomTagConstraint tag(DICOM_TAG_PATIENT_NAME, ConstraintType_Wildcard, "HE*L?O", true, true);
89 ASSERT_TRUE(tag.IsMatch("HELLO")); 80 ASSERT_TRUE(tag.IsMatch("HELLO"));
90 ASSERT_TRUE(tag.IsMatch("HELLLLLO")); 81 ASSERT_TRUE(tag.IsMatch("HELLLLLO"));
91 ASSERT_TRUE(tag.IsMatch("HELxO")); 82 ASSERT_TRUE(tag.IsMatch("HELxO"));
92 ASSERT_FALSE(tag.IsMatch("hello")); 83 ASSERT_FALSE(tag.IsMatch("hello"));
93 } 84 }
94 85
95 { 86 {
96 DicomTagConstraint tag(DICOM_TAG_PATIENT_NAME, ConstraintType_Wildcard, "HE*l?o", false); 87 DicomTagConstraint tag(DICOM_TAG_PATIENT_NAME, ConstraintType_Wildcard, "HE*l?o", false, true);
97 ASSERT_TRUE(tag.IsMatch("HELLO")); 88 ASSERT_TRUE(tag.IsMatch("HELLO"));
98 ASSERT_TRUE(tag.IsMatch("HELLLLLO")); 89 ASSERT_TRUE(tag.IsMatch("HELLLLLO"));
99 ASSERT_TRUE(tag.IsMatch("HELxO")); 90 ASSERT_TRUE(tag.IsMatch("HELxO"));
100 ASSERT_TRUE(tag.IsMatch("hello")); 91 ASSERT_TRUE(tag.IsMatch("hello"));
101 92
102 ASSERT_FALSE(tag.IsCaseSensitive()); 93 ASSERT_FALSE(tag.IsCaseSensitive());
103 ASSERT_EQ(ConstraintType_Wildcard, tag.GetConstraintType()); 94 ASSERT_EQ(ConstraintType_Wildcard, tag.GetType());
104 } 95 }
105 96
106 { 97 {
107 DicomTagConstraint tag(DICOM_TAG_PATIENT_NAME, ConstraintType_SmallerOrEqual, "123", true); 98 DicomTagConstraint tag(DICOM_TAG_PATIENT_NAME, ConstraintType_SmallerOrEqual, "123", true, true);
108 ASSERT_TRUE(tag.IsMatch("120")); 99 ASSERT_TRUE(tag.IsMatch("120"));
109 ASSERT_TRUE(tag.IsMatch("123")); 100 ASSERT_TRUE(tag.IsMatch("123"));
110 ASSERT_FALSE(tag.IsMatch("124")); 101 ASSERT_FALSE(tag.IsMatch("124"));
111 } 102 ASSERT_TRUE(tag.IsMandatory());
112 103 }
113 { 104
114 DicomTagConstraint tag(DICOM_TAG_PATIENT_NAME, ConstraintType_GreaterOrEqual, "123", true); 105 {
106 DicomTagConstraint tag(DICOM_TAG_PATIENT_NAME, ConstraintType_GreaterOrEqual, "123", true, false);
115 ASSERT_FALSE(tag.IsMatch("122")); 107 ASSERT_FALSE(tag.IsMatch("122"));
116 ASSERT_TRUE(tag.IsMatch("123")); 108 ASSERT_TRUE(tag.IsMatch("123"));
117 ASSERT_TRUE(tag.IsMatch("124")); 109 ASSERT_TRUE(tag.IsMatch("124"));
118 } 110 ASSERT_FALSE(tag.IsMandatory());
119 111 }
120 { 112
121 DicomTagConstraint tag(DICOM_TAG_PATIENT_NAME, ConstraintType_List, true); 113 {
114 DicomTagConstraint tag(DICOM_TAG_PATIENT_NAME, ConstraintType_List, true, true);
122 ASSERT_FALSE(tag.IsMatch("CT")); 115 ASSERT_FALSE(tag.IsMatch("CT"));
123 ASSERT_FALSE(tag.IsMatch("MR")); 116 ASSERT_FALSE(tag.IsMatch("MR"));
124 117
125 tag.AddValue("CT"); 118 tag.AddValue("CT");
126 ASSERT_TRUE(tag.IsMatch("CT")); 119 ASSERT_TRUE(tag.IsMatch("CT"));
135 ASSERT_THROW(tag.GetValue(), OrthancException); 128 ASSERT_THROW(tag.GetValue(), OrthancException);
136 ASSERT_EQ(2u, tag.GetValues().size()); 129 ASSERT_EQ(2u, tag.GetValues().size());
137 } 130 }
138 131
139 { 132 {
140 DicomTagConstraint tag(DICOM_TAG_PATIENT_NAME, ConstraintType_List, false); 133 DicomTagConstraint tag(DICOM_TAG_PATIENT_NAME, ConstraintType_List, false, true);
141 134
142 tag.AddValue("ct"); 135 tag.AddValue("ct");
143 tag.AddValue("mr"); 136 tag.AddValue("mr");
144 137
145 ASSERT_TRUE(tag.IsMatch("CT")); 138 ASSERT_TRUE(tag.IsMatch("CT"));
153 146
154 TEST(DatabaseLookup, FromDicom) 147 TEST(DatabaseLookup, FromDicom)
155 { 148 {
156 { 149 {
157 DatabaseLookup lookup; 150 DatabaseLookup lookup;
158 lookup.AddDicomConstraint(DICOM_TAG_PATIENT_ID, "HELLO", true); 151 lookup.AddDicomConstraint(DICOM_TAG_PATIENT_ID, "HELLO", true, true);
159 ASSERT_EQ(1u, lookup.GetConstraintsCount()); 152 ASSERT_EQ(1u, lookup.GetConstraintsCount());
160 ASSERT_EQ(ConstraintType_Equal, lookup.GetConstraint(0).GetConstraintType()); 153 ASSERT_EQ(ConstraintType_Equal, lookup.GetConstraint(0).GetType());
161 ASSERT_EQ("HELLO", lookup.GetConstraint(0).GetValue()); 154 ASSERT_EQ("HELLO", lookup.GetConstraint(0).GetValue());
162 ASSERT_TRUE(lookup.GetConstraint(0).IsCaseSensitive()); 155 ASSERT_TRUE(lookup.GetConstraint(0).IsCaseSensitive());
163 156 }
164 ASSERT_TRUE(lookup.GetConstraint(0).HasTagInfo()); 157
165 ASSERT_EQ(DicomTagType_Identifier, lookup.GetConstraint(0).GetTagType()); 158 {
166 ASSERT_EQ(ResourceType_Patient, lookup.GetConstraint(0).GetLevel()); 159 DatabaseLookup lookup;
167 } 160 lookup.AddDicomConstraint(DICOM_TAG_PATIENT_ID, "HELLO", false, true);
168
169 {
170 DatabaseLookup lookup;
171 lookup.AddDicomConstraint(DICOM_TAG_PATIENT_ID, "HELLO", false);
172 ASSERT_EQ(1u, lookup.GetConstraintsCount()); 161 ASSERT_EQ(1u, lookup.GetConstraintsCount());
173 162
174 // This is *not* a PN VR => "false" above is *not* used 163 // This is *not* a PN VR => "false" above is *not* used
175 ASSERT_TRUE(lookup.GetConstraint(0).IsCaseSensitive()); 164 ASSERT_TRUE(lookup.GetConstraint(0).IsCaseSensitive());
176 } 165 }
177 166
178 { 167 {
179 DatabaseLookup lookup; 168 DatabaseLookup lookup;
180 lookup.AddDicomConstraint(DICOM_TAG_PATIENT_NAME, "HELLO", true); 169 lookup.AddDicomConstraint(DICOM_TAG_PATIENT_NAME, "HELLO", true, true);
181 ASSERT_EQ(1u, lookup.GetConstraintsCount()); 170 ASSERT_EQ(1u, lookup.GetConstraintsCount());
182 ASSERT_TRUE(lookup.GetConstraint(0).IsCaseSensitive()); 171 ASSERT_TRUE(lookup.GetConstraint(0).IsCaseSensitive());
183 } 172 }
184 173
185 { 174 {
186 DatabaseLookup lookup; 175 DatabaseLookup lookup;
187 lookup.AddDicomConstraint(DICOM_TAG_PATIENT_NAME, "HELLO", false); 176 lookup.AddDicomConstraint(DICOM_TAG_PATIENT_NAME, "HELLO", false, true);
188 ASSERT_EQ(1u, lookup.GetConstraintsCount()); 177 ASSERT_EQ(1u, lookup.GetConstraintsCount());
189 178
190 // This is a PN VR => "false" above is used 179 // This is a PN VR => "false" above is used
191 ASSERT_FALSE(lookup.GetConstraint(0).IsCaseSensitive()); 180 ASSERT_FALSE(lookup.GetConstraint(0).IsCaseSensitive());
192 } 181 }
193 182
194 { 183 {
195 DatabaseLookup lookup; 184 DatabaseLookup lookup;
196 lookup.AddDicomConstraint(DICOM_TAG_SERIES_DESCRIPTION, "2012-2016", false); 185 lookup.AddDicomConstraint(DICOM_TAG_SERIES_DESCRIPTION, "2012-2016", false, true);
197
198 ASSERT_TRUE(lookup.GetConstraint(0).HasTagInfo());
199 ASSERT_EQ(DicomTagType_Main, lookup.GetConstraint(0).GetTagType());
200 ASSERT_EQ(ResourceType_Series, lookup.GetConstraint(0).GetLevel());
201 186
202 // This is not a data VR 187 // This is not a data VR
203 ASSERT_EQ(ConstraintType_Equal, lookup.GetConstraint(0).GetConstraintType()); 188 ASSERT_EQ(ConstraintType_Equal, lookup.GetConstraint(0).GetType());
204 } 189 }
205 190
206 { 191 {
207 DatabaseLookup lookup; 192 DatabaseLookup lookup;
208 lookup.AddDicomConstraint(DICOM_TAG_PATIENT_BIRTH_DATE, "2012-2016", false); 193 lookup.AddDicomConstraint(DICOM_TAG_PATIENT_BIRTH_DATE, "2012-2016", false, true);
209 194
210 // This is a data VR => range is effective 195 // This is a data VR => range is effective
211 ASSERT_EQ(2u, lookup.GetConstraintsCount()); 196 ASSERT_EQ(2u, lookup.GetConstraintsCount());
212 197
213 ASSERT_TRUE(lookup.GetConstraint(0).GetConstraintType() != lookup.GetConstraint(1).GetConstraintType()); 198 ASSERT_TRUE(lookup.GetConstraint(0).GetType() != lookup.GetConstraint(1).GetType());
214 199
215 for (size_t i = 0; i < 2; i++) 200 for (size_t i = 0; i < 2; i++)
216 { 201 {
217 ASSERT_TRUE(lookup.GetConstraint(i).GetConstraintType() == ConstraintType_SmallerOrEqual || 202 ASSERT_TRUE(lookup.GetConstraint(i).GetType() == ConstraintType_SmallerOrEqual ||
218 lookup.GetConstraint(i).GetConstraintType() == ConstraintType_GreaterOrEqual); 203 lookup.GetConstraint(i).GetType() == ConstraintType_GreaterOrEqual);
219 } 204 }
220 } 205 }
221 206
222 { 207 {
223 DatabaseLookup lookup; 208 DatabaseLookup lookup;
224 lookup.AddDicomConstraint(DICOM_TAG_PATIENT_BIRTH_DATE, "2012-", false); 209 lookup.AddDicomConstraint(DICOM_TAG_PATIENT_BIRTH_DATE, "2012-", false, true);
225 210
226 ASSERT_EQ(1u, lookup.GetConstraintsCount()); 211 ASSERT_EQ(1u, lookup.GetConstraintsCount());
227 ASSERT_EQ(ConstraintType_GreaterOrEqual, lookup.GetConstraint(0).GetConstraintType()); 212 ASSERT_EQ(ConstraintType_GreaterOrEqual, lookup.GetConstraint(0).GetType());
228 ASSERT_EQ("2012", lookup.GetConstraint(0).GetValue()); 213 ASSERT_EQ("2012", lookup.GetConstraint(0).GetValue());
229 } 214 }
230 215
231 { 216 {
232 DatabaseLookup lookup; 217 DatabaseLookup lookup;
233 lookup.AddDicomConstraint(DICOM_TAG_PATIENT_BIRTH_DATE, "-2016", false); 218 lookup.AddDicomConstraint(DICOM_TAG_PATIENT_BIRTH_DATE, "-2016", false, true);
234 219
235 ASSERT_EQ(1u, lookup.GetConstraintsCount()); 220 ASSERT_EQ(1u, lookup.GetConstraintsCount());
236 ASSERT_EQ(DICOM_TAG_PATIENT_BIRTH_DATE, lookup.GetConstraint(0).GetTag()); 221 ASSERT_EQ(DICOM_TAG_PATIENT_BIRTH_DATE, lookup.GetConstraint(0).GetTag());
237 ASSERT_EQ(ConstraintType_SmallerOrEqual, lookup.GetConstraint(0).GetConstraintType()); 222 ASSERT_EQ(ConstraintType_SmallerOrEqual, lookup.GetConstraint(0).GetType());
238 ASSERT_EQ("2016", lookup.GetConstraint(0).GetValue()); 223 ASSERT_EQ("2016", lookup.GetConstraint(0).GetValue());
239 } 224 }
240 225
241 { 226 {
242 DatabaseLookup lookup; 227 DatabaseLookup lookup;
243 lookup.AddDicomConstraint(DICOM_TAG_MODALITIES_IN_STUDY, "CT\\MR", false); 228 lookup.AddDicomConstraint(DICOM_TAG_MODALITIES_IN_STUDY, "CT\\MR", false, true);
244 229
245 ASSERT_EQ(1u, lookup.GetConstraintsCount()); 230 ASSERT_EQ(1u, lookup.GetConstraintsCount());
246 ASSERT_EQ(DICOM_TAG_MODALITY, lookup.GetConstraint(0).GetTag()); 231 ASSERT_EQ(DICOM_TAG_MODALITY, lookup.GetConstraint(0).GetTag());
247 ASSERT_EQ(ResourceType_Series, lookup.GetConstraint(0).GetLevel()); 232 ASSERT_EQ(ConstraintType_List, lookup.GetConstraint(0).GetType());
248 ASSERT_EQ(ConstraintType_List, lookup.GetConstraint(0).GetConstraintType());
249 233
250 const std::set<std::string>& values = lookup.GetConstraint(0).GetValues(); 234 const std::set<std::string>& values = lookup.GetConstraint(0).GetValues();
251 ASSERT_EQ(2u, values.size()); 235 ASSERT_EQ(2u, values.size());
252 ASSERT_TRUE(values.find("CT") != values.end()); 236 ASSERT_TRUE(values.find("CT") != values.end());
253 ASSERT_TRUE(values.find("MR") != values.end()); 237 ASSERT_TRUE(values.find("MR") != values.end());
254 ASSERT_TRUE(values.find("nope") == values.end()); 238 ASSERT_TRUE(values.find("nope") == values.end());
255 } 239 }
256 240
257 { 241 {
258 DatabaseLookup lookup; 242 DatabaseLookup lookup;
259 lookup.AddDicomConstraint(DICOM_TAG_STUDY_DESCRIPTION, "CT\\MR", false); 243 lookup.AddDicomConstraint(DICOM_TAG_STUDY_DESCRIPTION, "CT\\MR", false, true);
260 244
261 ASSERT_EQ(1u, lookup.GetConstraintsCount()); 245 ASSERT_EQ(1u, lookup.GetConstraintsCount());
262 ASSERT_EQ(DICOM_TAG_STUDY_DESCRIPTION, lookup.GetConstraint(0).GetTag()); 246 ASSERT_EQ(DICOM_TAG_STUDY_DESCRIPTION, lookup.GetConstraint(0).GetTag());
263 ASSERT_EQ(ResourceType_Study, lookup.GetConstraint(0).GetLevel()); 247 ASSERT_EQ(ConstraintType_List, lookup.GetConstraint(0).GetType());
264 ASSERT_EQ(ConstraintType_List, lookup.GetConstraint(0).GetConstraintType());
265 248
266 const std::set<std::string>& values = lookup.GetConstraint(0).GetValues(); 249 const std::set<std::string>& values = lookup.GetConstraint(0).GetValues();
267 ASSERT_EQ(2u, values.size()); 250 ASSERT_EQ(2u, values.size());
268 ASSERT_TRUE(values.find("CT") != values.end()); 251 ASSERT_TRUE(values.find("CT") != values.end());
269 ASSERT_TRUE(values.find("MR") != values.end()); 252 ASSERT_TRUE(values.find("MR") != values.end());
270 ASSERT_TRUE(values.find("nope") == values.end()); 253 ASSERT_TRUE(values.find("nope") == values.end());
271 } 254 }
272 255
273 { 256 {
274 DatabaseLookup lookup; 257 DatabaseLookup lookup;
275 lookup.AddDicomConstraint(DICOM_TAG_STUDY_DESCRIPTION, "HE*O", false); 258 lookup.AddDicomConstraint(DICOM_TAG_STUDY_DESCRIPTION, "HE*O", false, true);
276 259
277 ASSERT_EQ(1u, lookup.GetConstraintsCount()); 260 ASSERT_EQ(1u, lookup.GetConstraintsCount());
278 ASSERT_EQ(ConstraintType_Wildcard, lookup.GetConstraint(0).GetConstraintType()); 261 ASSERT_EQ(ConstraintType_Wildcard, lookup.GetConstraint(0).GetType());
279 } 262 }
280 263
281 { 264 {
282 DatabaseLookup lookup; 265 DatabaseLookup lookup;
283 lookup.AddDicomConstraint(DICOM_TAG_STUDY_DESCRIPTION, "HE?O", false); 266 lookup.AddDicomConstraint(DICOM_TAG_STUDY_DESCRIPTION, "HE?O", false, true);
284 267
285 ASSERT_EQ(1u, lookup.GetConstraintsCount()); 268 ASSERT_EQ(1u, lookup.GetConstraintsCount());
286 ASSERT_EQ(ConstraintType_Wildcard, lookup.GetConstraint(0).GetConstraintType()); 269 ASSERT_EQ(ConstraintType_Wildcard, lookup.GetConstraint(0).GetType());
287 } 270 }
288 271
289 { 272 {
290 DatabaseLookup lookup; 273 DatabaseLookup lookup;
291 lookup.AddDicomConstraint(DICOM_TAG_RELATED_FRAME_OF_REFERENCE_UID, "TEST", false); 274 lookup.AddDicomConstraint(DICOM_TAG_RELATED_FRAME_OF_REFERENCE_UID, "TEST", false, true);
292 275 lookup.AddDicomConstraint(DICOM_TAG_PATIENT_NAME, "TEST2", false, false);
293 ASSERT_TRUE(lookup.GetConstraint(0).HasTagInfo()); 276 ASSERT_TRUE(lookup.GetConstraint(0).IsMandatory());
294 ASSERT_EQ(DicomTagType_Generic, lookup.GetConstraint(0).GetTagType()); 277 ASSERT_FALSE(lookup.GetConstraint(1).IsMandatory());
295 ASSERT_EQ(ResourceType_Instance, lookup.GetConstraint(0).GetLevel());
296 } 278 }
297 } 279 }