Mercurial > hg > orthanc
comparison OrthancServer/Sources/Database/SQLiteDatabaseWrapper.cpp @ 5590:8b32213af23e find-refactoring
replaced FindRequest::ResponseContent by booleans
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Fri, 03 May 2024 18:17:53 +0200 |
parents | b51ee994cd6f |
children | 1e2631b8b9af |
comparison
equal
deleted
inserted
replaced
5589:b51ee994cd6f | 5590:8b32213af23e |
---|---|
1164 request.GetLevel(), | 1164 request.GetLevel(), |
1165 request.GetLabels(), | 1165 request.GetLabels(), |
1166 request.GetLabelsConstraint(), | 1166 request.GetLabelsConstraint(), |
1167 (request.HasLimits() ? request.GetLimitsCount() : 0)); // TODO: handles since and count | 1167 (request.HasLimits() ? request.GetLimitsCount() : 0)); // TODO: handles since and count |
1168 | 1168 |
1169 if (request.IsResponseIdentifiersOnly()) | |
1170 { | 1169 { |
1170 // first create a temporary table that with the filtered and ordered results | |
1171 sqlLookup = "CREATE TEMPORARY TABLE FilteredResourcesIds AS " + sqlLookup; | |
1172 | |
1171 SQLite::Statement statement(db_, SQLITE_FROM_HERE_DYNAMIC(sqlLookup), sqlLookup); | 1173 SQLite::Statement statement(db_, SQLITE_FROM_HERE_DYNAMIC(sqlLookup), sqlLookup); |
1172 formatter.Bind(statement); | 1174 formatter.Bind(statement); |
1175 statement.Run(); | |
1176 } | |
1177 | |
1178 { | |
1179 // create the response item with the public ids only | |
1180 SQLite::Statement statement(db_, SQLITE_FROM_HERE, "SELECT publicId FROM FilteredResourcesIds"); | |
1181 formatter.Bind(statement); | |
1173 | 1182 |
1174 while (statement.Step()) | 1183 while (statement.Step()) |
1175 { | 1184 { |
1176 response.Add(new FindResponse::Resource(request.GetLevel(), statement.ColumnString(0))); | 1185 const std::string resourceId = statement.ColumnString(0); |
1186 response.Add(new FindResponse::Resource(request.GetLevel(), resourceId)); | |
1177 } | 1187 } |
1178 } | 1188 } |
1179 else | 1189 |
1190 // request Each response content through INNER JOIN with the temporary table | |
1191 if (request.IsRetrieveTagsAtLevel(request.GetLevel())) | |
1180 { | 1192 { |
1193 // TODO-FIND: handle the case where we request tags from multiple levels | |
1194 SQLite::Statement statement(db_, SQLITE_FROM_HERE, | |
1195 "SELECT publicId, tagGroup, tagElement, value FROM MainDicomTags AS tags " | |
1196 " INNER JOIN FilteredResourcesIds ON tags.id = FilteredResourcesIds.internalId"); | |
1197 formatter.Bind(statement); | |
1198 | |
1199 while (statement.Step()) | |
1181 { | 1200 { |
1182 // first create a temporary table that with the filtered and ordered results | 1201 const std::string& resourceId = statement.ColumnString(0); |
1183 sqlLookup = "CREATE TEMPORARY TABLE FilteredResourcesIds AS " + sqlLookup; | 1202 assert(response.HasResource(resourceId)); |
1184 | 1203 response.GetResource(resourceId).AddStringDicomTag(request.GetLevel(), |
1185 SQLite::Statement statement(db_, SQLITE_FROM_HERE_DYNAMIC(sqlLookup), sqlLookup); | 1204 statement.ColumnInt(1), |
1186 formatter.Bind(statement); | 1205 statement.ColumnInt(2), |
1187 statement.Run(); | 1206 statement.ColumnString(3)); |
1188 } | 1207 } |
1189 | 1208 } |
1209 | |
1210 if (request.IsRetrieveChildrenIdentifiers()) | |
1211 { | |
1212 SQLite::Statement statement(db_, SQLITE_FROM_HERE, | |
1213 "SELECT filtered.publicId, childLevel.publicId AS childPublicId " | |
1214 "FROM Resources as currentLevel " | |
1215 " INNER JOIN FilteredResourcesIds filtered ON filtered.internalId = currentLevel.internalId " | |
1216 " INNER JOIN Resources childLevel ON childLevel.parentId = currentLevel.internalId"); | |
1217 formatter.Bind(statement); | |
1218 | |
1219 while (statement.Step()) | |
1190 { | 1220 { |
1191 // create the response item with the public ids only | 1221 const std::string& resourceId = statement.ColumnString(0); |
1192 SQLite::Statement statement(db_, SQLITE_FROM_HERE, "SELECT publicId FROM FilteredResourcesIds"); | 1222 assert(response.HasResource(resourceId)); |
1193 formatter.Bind(statement); | 1223 response.GetResource(resourceId).AddChildIdentifier(GetChildResourceType(request.GetLevel()), statement.ColumnString(1)); |
1194 | |
1195 while (statement.Step()) | |
1196 { | |
1197 const std::string resourceId = statement.ColumnString(0); | |
1198 response.Add(new FindResponse::Resource(request.GetLevel(), resourceId)); | |
1199 } | |
1200 } | 1224 } |
1201 | 1225 } |
1202 // request Each response content through INNER JOIN with the temporary table | 1226 |
1203 if (request.HasResponseContent(FindRequest::ResponseContent_MainDicomTags)) | 1227 if (request.IsRetrieveParentIdentifier()) |
1228 { | |
1229 SQLite::Statement statement(db_, SQLITE_FROM_HERE, | |
1230 "SELECT filtered.publicId, parentLevel.publicId AS parentPublicId " | |
1231 "FROM Resources as currentLevel " | |
1232 " INNER JOIN FilteredResourcesIds filtered ON filtered.internalId = currentLevel.internalId " | |
1233 " INNER JOIN Resources parentLevel ON currentLevel.parentId = parentLevel.internalId"); | |
1234 | |
1235 while (statement.Step()) | |
1204 { | 1236 { |
1205 // TODO-FIND: handle the case where we request tags from multiple levels | 1237 const std::string& resourceId = statement.ColumnString(0); |
1206 SQLite::Statement statement(db_, SQLITE_FROM_HERE, | 1238 const std::string& parentId = statement.ColumnString(1); |
1207 "SELECT publicId, tagGroup, tagElement, value FROM MainDicomTags AS tags " | 1239 assert(response.HasResource(resourceId)); |
1208 " INNER JOIN FilteredResourcesIds ON tags.id = FilteredResourcesIds.internalId"); | 1240 response.GetResource(resourceId).SetParentIdentifier(parentId); |
1209 formatter.Bind(statement); | |
1210 | |
1211 while (statement.Step()) | |
1212 { | |
1213 const std::string& resourceId = statement.ColumnString(0); | |
1214 assert(response.HasResource(resourceId)); | |
1215 response.GetResource(resourceId).AddStringDicomTag(request.GetLevel(), | |
1216 statement.ColumnInt(1), | |
1217 statement.ColumnInt(2), | |
1218 statement.ColumnString(3)); | |
1219 } | |
1220 } | 1241 } |
1221 | 1242 } |
1222 if (request.HasResponseContent(FindRequest::ResponseContent_Children)) | 1243 |
1244 if (request.IsRetrieveMetadata()) | |
1245 { | |
1246 SQLite::Statement statement(db_, SQLITE_FROM_HERE, | |
1247 "SELECT filtered.publicId, metadata.type, metadata.value " | |
1248 "FROM Metadata " | |
1249 " INNER JOIN FilteredResourcesIds filtered ON filtered.internalId = Metadata.id"); | |
1250 | |
1251 while (statement.Step()) | |
1223 { | 1252 { |
1224 SQLite::Statement statement(db_, SQLITE_FROM_HERE, | 1253 const std::string& resourceId = statement.ColumnString(0); |
1225 "SELECT filtered.publicId, childLevel.publicId AS childPublicId " | 1254 assert(response.HasResource(resourceId)); |
1226 "FROM Resources as currentLevel " | 1255 response.GetResource(resourceId).AddMetadata(static_cast<MetadataType>(statement.ColumnInt(1)), |
1227 " INNER JOIN FilteredResourcesIds filtered ON filtered.internalId = currentLevel.internalId " | 1256 statement.ColumnString(2)); |
1228 " INNER JOIN Resources childLevel ON childLevel.parentId = currentLevel.internalId"); | |
1229 formatter.Bind(statement); | |
1230 | |
1231 while (statement.Step()) | |
1232 { | |
1233 const std::string& resourceId = statement.ColumnString(0); | |
1234 assert(response.HasResource(resourceId)); | |
1235 response.GetResource(resourceId).AddChildIdentifier(GetChildResourceType(request.GetLevel()), statement.ColumnString(1)); | |
1236 } | |
1237 } | 1257 } |
1238 | 1258 } |
1239 if (request.HasResponseContent(FindRequest::ResponseContent_Parent)) | 1259 |
1260 if (request.IsRetrieveLabels()) | |
1261 { | |
1262 SQLite::Statement statement(db_, SQLITE_FROM_HERE, | |
1263 "SELECT filtered.publicId, label " | |
1264 "FROM Labels " | |
1265 " INNER JOIN FilteredResourcesIds filtered ON filtered.internalId = Labels.id"); | |
1266 | |
1267 while (statement.Step()) | |
1240 { | 1268 { |
1241 SQLite::Statement statement(db_, SQLITE_FROM_HERE, | 1269 const std::string& resourceId = statement.ColumnString(0); |
1242 "SELECT filtered.publicId, parentLevel.publicId AS parentPublicId " | 1270 assert(response.HasResource(resourceId)); |
1243 "FROM Resources as currentLevel " | 1271 response.GetResource(resourceId).AddLabel(statement.ColumnString(1)); |
1244 " INNER JOIN FilteredResourcesIds filtered ON filtered.internalId = currentLevel.internalId " | |
1245 " INNER JOIN Resources parentLevel ON currentLevel.parentId = parentLevel.internalId"); | |
1246 | |
1247 while (statement.Step()) | |
1248 { | |
1249 const std::string& resourceId = statement.ColumnString(0); | |
1250 const std::string& parentId = statement.ColumnString(1); | |
1251 assert(response.HasResource(resourceId)); | |
1252 response.GetResource(resourceId).SetParentIdentifier(parentId); | |
1253 } | |
1254 } | 1272 } |
1255 | 1273 } |
1256 if (request.HasResponseContent(FindRequest::ResponseContent_Metadata)) | 1274 |
1275 if (request.IsRetrieveAttachments()) | |
1276 { | |
1277 SQLite::Statement statement(db_, SQLITE_FROM_HERE, | |
1278 "SELECT filtered.publicId, uuid, fileType, uncompressedSize, compressionType, compressedSize, " | |
1279 " uncompressedMD5, compressedMD5 " | |
1280 "FROM AttachedFiles " | |
1281 " INNER JOIN FilteredResourcesIds filtered ON filtered.internalId = AttachedFiles.id"); | |
1282 | |
1283 while (statement.Step()) | |
1257 { | 1284 { |
1258 SQLite::Statement statement(db_, SQLITE_FROM_HERE, | 1285 const std::string& resourceId = statement.ColumnString(0); |
1259 "SELECT filtered.publicId, metadata.type, metadata.value " | 1286 FileInfo attachment = FileInfo(statement.ColumnString(1), |
1260 "FROM Metadata " | 1287 static_cast<FileContentType>(statement.ColumnInt(2)), |
1261 " INNER JOIN FilteredResourcesIds filtered ON filtered.internalId = Metadata.id"); | 1288 statement.ColumnInt64(3), |
1262 | 1289 statement.ColumnString(6), |
1263 while (statement.Step()) | 1290 static_cast<CompressionType>(statement.ColumnInt(4)), |
1264 { | 1291 statement.ColumnInt64(5), |
1265 const std::string& resourceId = statement.ColumnString(0); | 1292 statement.ColumnString(7)); |
1266 assert(response.HasResource(resourceId)); | 1293 |
1267 response.GetResource(resourceId).AddMetadata(static_cast<MetadataType>(statement.ColumnInt(1)), | 1294 assert(response.HasResource(resourceId)); |
1268 statement.ColumnString(2)); | 1295 response.GetResource(resourceId).AddAttachment(attachment); |
1269 } | 1296 }; |
1270 } | |
1271 | |
1272 if (request.HasResponseContent(FindRequest::ResponseContent_Labels)) | |
1273 { | |
1274 SQLite::Statement statement(db_, SQLITE_FROM_HERE, | |
1275 "SELECT filtered.publicId, label " | |
1276 "FROM Labels " | |
1277 " INNER JOIN FilteredResourcesIds filtered ON filtered.internalId = Labels.id"); | |
1278 | |
1279 while (statement.Step()) | |
1280 { | |
1281 const std::string& resourceId = statement.ColumnString(0); | |
1282 assert(response.HasResource(resourceId)); | |
1283 response.GetResource(resourceId).AddLabel(statement.ColumnString(1)); | |
1284 } | |
1285 } | |
1286 | |
1287 if (request.HasResponseContent(FindRequest::ResponseContent_Attachments)) | |
1288 { | |
1289 SQLite::Statement statement(db_, SQLITE_FROM_HERE, | |
1290 "SELECT filtered.publicId, uuid, fileType, uncompressedSize, compressionType, compressedSize, " | |
1291 " uncompressedMD5, compressedMD5 " | |
1292 "FROM AttachedFiles " | |
1293 " INNER JOIN FilteredResourcesIds filtered ON filtered.internalId = AttachedFiles.id"); | |
1294 | |
1295 while (statement.Step()) | |
1296 { | |
1297 const std::string& resourceId = statement.ColumnString(0); | |
1298 FileInfo attachment = FileInfo(statement.ColumnString(1), | |
1299 static_cast<FileContentType>(statement.ColumnInt(2)), | |
1300 statement.ColumnInt64(3), | |
1301 statement.ColumnString(6), | |
1302 static_cast<CompressionType>(statement.ColumnInt(4)), | |
1303 statement.ColumnInt64(5), | |
1304 statement.ColumnString(7)); | |
1305 | |
1306 assert(response.HasResource(resourceId)); | |
1307 response.GetResource(resourceId).AddAttachment(attachment); | |
1308 }; | |
1309 } | |
1310 | |
1311 // TODO-FIND: implement other responseContent: ResponseContent_ChildInstanceId, ResponseContent_ChildrenMetadata (later: ResponseContent_IsStable) | |
1312 | |
1313 } | 1297 } |
1298 | |
1299 // TODO-FIND: implement other responseContent: ResponseContent_ChildInstanceId, ResponseContent_ChildrenMetadata (later: ResponseContent_IsStable) | |
1300 | |
1314 } | 1301 } |
1315 | 1302 |
1316 #endif | 1303 #endif |
1317 } | 1304 } |
1318 }; | 1305 }; |