comparison OrthancServer/Sources/Database/SQLiteDatabaseWrapper.cpp @ 5723:b1c86368af2b find-refactoring

moved experimental code to graveyard
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 19 Jul 2024 10:19:57 +0200
parents 77875b51cf95
children afd421225eb4
comparison
equal deleted inserted replaced
5720:89d559e67b03 5723:b1c86368af2b
1137 while (s.Step()) 1137 while (s.Step())
1138 { 1138 {
1139 target.insert(s.ColumnString(0)); 1139 target.insert(s.ColumnString(0));
1140 } 1140 }
1141 } 1141 }
1142
1143
1144 #if 0
1145 // TODO-FIND: Remove this implementation, as it should be done by
1146 // the compatibility mode implemented by "GenericFind"
1147
1148 virtual void ExecuteFind(FindResponse& response,
1149 const FindRequest& request,
1150 const std::vector<DatabaseConstraint>& normalized) ORTHANC_OVERRIDE
1151 {
1152 #if 0
1153 Compatibility::GenericFind find(*this);
1154 find.Execute(response, request);
1155 #else
1156 {
1157 SQLite::Statement s(db_, SQLITE_FROM_HERE, "DROP TABLE IF EXISTS FilteredResourcesIds");
1158 s.Run();
1159 }
1160
1161 {
1162
1163 LookupFormatter formatter;
1164
1165 std::string sqlLookup;
1166 LookupFormatter::Apply(sqlLookup,
1167 formatter,
1168 normalized,
1169 request.GetLevel(),
1170 request.GetLabels(),
1171 request.GetLabelsConstraint(),
1172 (request.HasLimits() ? request.GetLimitsCount() : 0)); // TODO: handles since and count
1173
1174 {
1175 // first create a temporary table that with the filtered and ordered results
1176 sqlLookup = "CREATE TEMPORARY TABLE FilteredResourcesIds AS " + sqlLookup;
1177
1178 SQLite::Statement statement(db_, SQLITE_FROM_HERE_DYNAMIC(sqlLookup), sqlLookup);
1179 formatter.Bind(statement);
1180 statement.Run();
1181 }
1182
1183 {
1184 // create the response item with the public ids only
1185 SQLite::Statement statement(db_, SQLITE_FROM_HERE, "SELECT publicId FROM FilteredResourcesIds");
1186 formatter.Bind(statement);
1187
1188 while (statement.Step())
1189 {
1190 const std::string resourceId = statement.ColumnString(0);
1191 response.Add(new FindResponse::Resource(request.GetLevel(), resourceId));
1192 }
1193 }
1194
1195 // request Each response content through INNER JOIN with the temporary table
1196 if (request.IsRetrieveMainDicomTags())
1197 {
1198 // TODO-FIND: handle the case where we request tags from multiple levels
1199 SQLite::Statement statement(db_, SQLITE_FROM_HERE,
1200 "SELECT publicId, tagGroup, tagElement, value FROM MainDicomTags AS tags "
1201 " INNER JOIN FilteredResourcesIds ON tags.id = FilteredResourcesIds.internalId");
1202 formatter.Bind(statement);
1203
1204 while (statement.Step())
1205 {
1206 const std::string& resourceId = statement.ColumnString(0);
1207 assert(response.HasResource(resourceId));
1208 response.GetResource(resourceId).AddStringDicomTag(statement.ColumnInt(1),
1209 statement.ColumnInt(2),
1210 statement.ColumnString(3));
1211 }
1212 }
1213
1214 if (request.IsRetrieveChildrenIdentifiers())
1215 {
1216 SQLite::Statement statement(db_, SQLITE_FROM_HERE,
1217 "SELECT filtered.publicId, childLevel.publicId AS childPublicId "
1218 "FROM Resources as currentLevel "
1219 " INNER JOIN FilteredResourcesIds filtered ON filtered.internalId = currentLevel.internalId "
1220 " INNER JOIN Resources childLevel ON childLevel.parentId = currentLevel.internalId");
1221 formatter.Bind(statement);
1222
1223 while (statement.Step())
1224 {
1225 const std::string& resourceId = statement.ColumnString(0);
1226 assert(response.HasResource(resourceId));
1227 response.GetResource(resourceId).AddChildIdentifier(GetChildResourceType(request.GetLevel()), statement.ColumnString(1));
1228 }
1229 }
1230
1231 if (request.IsRetrieveParentIdentifier())
1232 {
1233 SQLite::Statement statement(db_, SQLITE_FROM_HERE,
1234 "SELECT filtered.publicId, parentLevel.publicId AS parentPublicId "
1235 "FROM Resources as currentLevel "
1236 " INNER JOIN FilteredResourcesIds filtered ON filtered.internalId = currentLevel.internalId "
1237 " INNER JOIN Resources parentLevel ON currentLevel.parentId = parentLevel.internalId");
1238
1239 while (statement.Step())
1240 {
1241 const std::string& resourceId = statement.ColumnString(0);
1242 const std::string& parentId = statement.ColumnString(1);
1243 assert(response.HasResource(resourceId));
1244 response.GetResource(resourceId).SetParentIdentifier(parentId);
1245 }
1246 }
1247
1248 if (request.IsRetrieveMetadata())
1249 {
1250 SQLite::Statement statement(db_, SQLITE_FROM_HERE,
1251 "SELECT filtered.publicId, metadata.type, metadata.value "
1252 "FROM Metadata "
1253 " INNER JOIN FilteredResourcesIds filtered ON filtered.internalId = Metadata.id");
1254
1255 while (statement.Step())
1256 {
1257 const std::string& resourceId = statement.ColumnString(0);
1258 assert(response.HasResource(resourceId));
1259 response.GetResource(resourceId).AddMetadata(static_cast<MetadataType>(statement.ColumnInt(1)),
1260 statement.ColumnString(2));
1261 }
1262 }
1263
1264 if (request.IsRetrieveLabels())
1265 {
1266 SQLite::Statement statement(db_, SQLITE_FROM_HERE,
1267 "SELECT filtered.publicId, label "
1268 "FROM Labels "
1269 " INNER JOIN FilteredResourcesIds filtered ON filtered.internalId = Labels.id");
1270
1271 while (statement.Step())
1272 {
1273 const std::string& resourceId = statement.ColumnString(0);
1274 assert(response.HasResource(resourceId));
1275 response.GetResource(resourceId).AddLabel(statement.ColumnString(1));
1276 }
1277 }
1278
1279 if (request.IsRetrieveAttachments())
1280 {
1281 SQLite::Statement statement(db_, SQLITE_FROM_HERE,
1282 "SELECT filtered.publicId, uuid, fileType, uncompressedSize, compressionType, compressedSize, "
1283 " uncompressedMD5, compressedMD5 "
1284 "FROM AttachedFiles "
1285 " INNER JOIN FilteredResourcesIds filtered ON filtered.internalId = AttachedFiles.id");
1286
1287 while (statement.Step())
1288 {
1289 const std::string& resourceId = statement.ColumnString(0);
1290 FileInfo attachment = FileInfo(statement.ColumnString(1),
1291 static_cast<FileContentType>(statement.ColumnInt(2)),
1292 statement.ColumnInt64(3),
1293 statement.ColumnString(6),
1294 static_cast<CompressionType>(statement.ColumnInt(4)),
1295 statement.ColumnInt64(5),
1296 statement.ColumnString(7));
1297
1298 assert(response.HasResource(resourceId));
1299 response.GetResource(resourceId).AddAttachment(attachment);
1300 };
1301 }
1302
1303 // TODO-FIND: implement other responseContent: ResponseContent_ChildInstanceId, ResponseContent_ChildrenMetadata (later: ResponseContent_IsStable)
1304
1305 }
1306
1307 #endif
1308 }
1309 #endif
1310
1311 }; 1142 };
1312 1143
1313 1144
1314 class SQLiteDatabaseWrapper::SignalFileDeleted : public SQLite::IScalarFunction 1145 class SQLiteDatabaseWrapper::SignalFileDeleted : public SQLite::IScalarFunction
1315 { 1146 {