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