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 };