Mercurial > hg > orthanc
comparison OrthancServer/Sources/Database/SQLiteDatabaseWrapper.cpp @ 5588:1b0fc6685f57 find-refactoring
add index of resources into FindResponse
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Fri, 03 May 2024 17:20:27 +0200 |
parents | fc3914c07dd3 |
children | b51ee994cd6f |
comparison
equal
deleted
inserted
replaced
5587:0f5586c498d1 | 5588:1b0fc6685f57 |
---|---|
1176 response.Add(new FindResponse::Item(request.GetLevel(), statement.ColumnString(0))); | 1176 response.Add(new FindResponse::Item(request.GetLevel(), statement.ColumnString(0))); |
1177 } | 1177 } |
1178 } | 1178 } |
1179 else | 1179 else |
1180 { | 1180 { |
1181 std::map<std::string, FindResponse::Item*> items; // cache to the response items | 1181 { |
1182 | 1182 // first create a temporary table that with the filtered and ordered results |
1183 {// first create a temporary table that with the filtered and ordered results | |
1184 sqlLookup = "CREATE TEMPORARY TABLE FilteredResourcesIds AS " + sqlLookup; | 1183 sqlLookup = "CREATE TEMPORARY TABLE FilteredResourcesIds AS " + sqlLookup; |
1185 | 1184 |
1186 SQLite::Statement statement(db_, SQLITE_FROM_HERE_DYNAMIC(sqlLookup), sqlLookup); | 1185 SQLite::Statement statement(db_, SQLITE_FROM_HERE_DYNAMIC(sqlLookup), sqlLookup); |
1187 formatter.Bind(statement); | 1186 formatter.Bind(statement); |
1188 statement.Run(); | 1187 statement.Run(); |
1194 formatter.Bind(statement); | 1193 formatter.Bind(statement); |
1195 | 1194 |
1196 while (statement.Step()) | 1195 while (statement.Step()) |
1197 { | 1196 { |
1198 const std::string resourceId = statement.ColumnString(0); | 1197 const std::string resourceId = statement.ColumnString(0); |
1199 | 1198 response.Add(new FindResponse::Item(request.GetLevel(), resourceId)); |
1200 FindResponse::Item* item = new FindResponse::Item(request.GetLevel(), resourceId); | |
1201 items[resourceId] = item; | |
1202 response.Add(item); | |
1203 } | 1199 } |
1204 } | 1200 } |
1205 | 1201 |
1206 // request Each response content through INNER JOIN with the temporary table | 1202 // request Each response content through INNER JOIN with the temporary table |
1207 if (request.HasResponseContent(FindRequest::ResponseContent_MainDicomTags)) | 1203 if (request.HasResponseContent(FindRequest::ResponseContent_MainDicomTags)) |
1213 formatter.Bind(statement); | 1209 formatter.Bind(statement); |
1214 | 1210 |
1215 while (statement.Step()) | 1211 while (statement.Step()) |
1216 { | 1212 { |
1217 const std::string& resourceId = statement.ColumnString(0); | 1213 const std::string& resourceId = statement.ColumnString(0); |
1218 items[resourceId]->AddStringDicomTag(request.GetLevel(), | 1214 assert(response.HasItem(resourceId)); |
1219 statement.ColumnInt(1), | 1215 response.GetItem(resourceId).AddStringDicomTag(request.GetLevel(), |
1220 statement.ColumnInt(2), | 1216 statement.ColumnInt(1), |
1221 statement.ColumnString(3)); | 1217 statement.ColumnInt(2), |
1218 statement.ColumnString(3)); | |
1222 } | 1219 } |
1223 } | 1220 } |
1224 | 1221 |
1225 if (request.HasResponseContent(FindRequest::ResponseContent_Children)) | 1222 if (request.HasResponseContent(FindRequest::ResponseContent_Children)) |
1226 { | 1223 { |
1232 formatter.Bind(statement); | 1229 formatter.Bind(statement); |
1233 | 1230 |
1234 while (statement.Step()) | 1231 while (statement.Step()) |
1235 { | 1232 { |
1236 const std::string& resourceId = statement.ColumnString(0); | 1233 const std::string& resourceId = statement.ColumnString(0); |
1237 items[resourceId]->AddChildIdentifier(GetChildResourceType(request.GetLevel()), statement.ColumnString(1)); | 1234 assert(response.HasItem(resourceId)); |
1235 response.GetItem(resourceId).AddChildIdentifier(GetChildResourceType(request.GetLevel()), statement.ColumnString(1)); | |
1238 } | 1236 } |
1239 } | 1237 } |
1240 | 1238 |
1241 if (request.HasResponseContent(FindRequest::ResponseContent_Parent)) | 1239 if (request.HasResponseContent(FindRequest::ResponseContent_Parent)) |
1242 { | 1240 { |
1248 | 1246 |
1249 while (statement.Step()) | 1247 while (statement.Step()) |
1250 { | 1248 { |
1251 const std::string& resourceId = statement.ColumnString(0); | 1249 const std::string& resourceId = statement.ColumnString(0); |
1252 const std::string& parentId = statement.ColumnString(1); | 1250 const std::string& parentId = statement.ColumnString(1); |
1253 items[resourceId]->SetParentIdentifier(parentId); | 1251 assert(response.HasItem(resourceId)); |
1252 response.GetItem(resourceId).SetParentIdentifier(parentId); | |
1254 } | 1253 } |
1255 } | 1254 } |
1256 | 1255 |
1257 if (request.HasResponseContent(FindRequest::ResponseContent_Metadata)) | 1256 if (request.HasResponseContent(FindRequest::ResponseContent_Metadata)) |
1258 { | 1257 { |
1262 " INNER JOIN FilteredResourcesIds filtered ON filtered.internalId = Metadata.id"); | 1261 " INNER JOIN FilteredResourcesIds filtered ON filtered.internalId = Metadata.id"); |
1263 | 1262 |
1264 while (statement.Step()) | 1263 while (statement.Step()) |
1265 { | 1264 { |
1266 const std::string& resourceId = statement.ColumnString(0); | 1265 const std::string& resourceId = statement.ColumnString(0); |
1267 items[resourceId]->AddMetadata(static_cast<MetadataType>(statement.ColumnInt(1)), | 1266 assert(response.HasItem(resourceId)); |
1268 statement.ColumnString(2)); | 1267 response.GetItem(resourceId).AddMetadata(static_cast<MetadataType>(statement.ColumnInt(1)), |
1268 statement.ColumnString(2)); | |
1269 } | 1269 } |
1270 } | 1270 } |
1271 | 1271 |
1272 if (request.HasResponseContent(FindRequest::ResponseContent_Labels)) | 1272 if (request.HasResponseContent(FindRequest::ResponseContent_Labels)) |
1273 { | 1273 { |
1277 " INNER JOIN FilteredResourcesIds filtered ON filtered.internalId = Labels.id"); | 1277 " INNER JOIN FilteredResourcesIds filtered ON filtered.internalId = Labels.id"); |
1278 | 1278 |
1279 while (statement.Step()) | 1279 while (statement.Step()) |
1280 { | 1280 { |
1281 const std::string& resourceId = statement.ColumnString(0); | 1281 const std::string& resourceId = statement.ColumnString(0); |
1282 items[resourceId]->AddLabel(statement.ColumnString(1)); | 1282 assert(response.HasItem(resourceId)); |
1283 response.GetItem(resourceId).AddLabel(statement.ColumnString(1)); | |
1283 } | 1284 } |
1284 } | 1285 } |
1285 | 1286 |
1286 if (request.HasResponseContent(FindRequest::ResponseContent_Attachments)) | 1287 if (request.HasResponseContent(FindRequest::ResponseContent_Attachments)) |
1287 { | 1288 { |
1299 statement.ColumnInt64(3), | 1300 statement.ColumnInt64(3), |
1300 statement.ColumnString(6), | 1301 statement.ColumnString(6), |
1301 static_cast<CompressionType>(statement.ColumnInt(4)), | 1302 static_cast<CompressionType>(statement.ColumnInt(4)), |
1302 statement.ColumnInt64(5), | 1303 statement.ColumnInt64(5), |
1303 statement.ColumnString(7)); | 1304 statement.ColumnString(7)); |
1304 items[resourceId]->AddAttachment(attachment); | 1305 |
1306 assert(response.HasItem(resourceId)); | |
1307 response.GetItem(resourceId).AddAttachment(attachment); | |
1305 }; | 1308 }; |
1306 } | 1309 } |
1307 | 1310 |
1308 // TODO-FIND: implement other responseContent: ResponseContent_ChildInstanceId, ResponseContent_ChildrenMetadata (later: ResponseContent_IsStable) | 1311 // TODO-FIND: implement other responseContent: ResponseContent_ChildInstanceId, ResponseContent_ChildrenMetadata (later: ResponseContent_IsStable) |
1309 | 1312 |