comparison OrthancServer/Sources/Database/SQLiteDatabaseWrapper.cpp @ 5746:afd421225eb4 find-refactoring-clean

WIP: started to implement IntegratedFind in SQLite
author Alain Mazy <am@orthanc.team>
date Fri, 30 Aug 2024 18:03:37 +0200
parents b1c86368af2b
children f39406a9eda4
comparison
equal deleted inserted replaced
5745:bbeefd4567dc 5746:afd421225eb4
380 resourcesId.push_back(s.ColumnString(0)); 380 resourcesId.push_back(s.ColumnString(0));
381 } 381 }
382 } 382 }
383 } 383 }
384 384
385 virtual void ExecuteFind(FindResponse& response,
386 const FindRequest& request,
387 const Capabilities& capabilities) ORTHANC_OVERRIDE
388 {
389 LookupFormatter formatter;
390
391 std::string sql;
392 LookupFormatter::Apply(sql, formatter, request);
393
394 sql = "CREATE TEMPORARY TABLE Lookup AS " + sql;
395
396 {
397 SQLite::Statement s(db_, SQLITE_FROM_HERE, "DROP TABLE IF EXISTS Lookup");
398 s.Run();
399 }
400
401 {
402 SQLite::Statement statement(db_, sql);
403 formatter.Bind(statement);
404 statement.Run();
405 }
406
407 {
408 SQLite::Statement s(db_, SQLITE_FROM_HERE, "SELECT publicId, internalId FROM Lookup");
409 while (s.Step())
410 {
411 response.Add(new FindResponse::Resource(request.GetLevel(), s.ColumnInt64(1), s.ColumnString(0)));
412 }
413 }
414
415 if (request.IsRetrieveMainDicomTags())
416 {
417 sql = "SELECT id, tagGroup, tagElement, value "
418 "FROM MainDicomTags "
419 "INNER JOIN Lookup ON MainDicomTags.id = Lookup.internalId";
420
421 SQLite::Statement s(db_, SQLITE_FROM_HERE, sql);
422 while (s.Step())
423 {
424 FindResponse::Resource& res = response.GetResourceByInternalId(s.ColumnInt64(0));
425 res.AddStringDicomTag(request.GetLevel(),
426 static_cast<uint16_t>(s.ColumnInt(1)),
427 static_cast<uint16_t>(s.ColumnInt(2)),
428 s.ColumnString(3));
429 }
430 }
431
432 if (request.IsRetrieveParentIdentifier())
433 {
434 sql = "SELECT currentLevel.internalId, parentLevel.publicId "
435 "FROM Resources AS currentLevel "
436 "INNER JOIN Lookup ON currentLevel.internalId = Lookup.internalId "
437 "INNER JOIN Resources parentLevel ON currentLevel.parentId = parentLevel.internalId ";
438
439 SQLite::Statement s(db_, SQLITE_FROM_HERE, sql);
440 while (s.Step())
441 {
442 FindResponse::Resource& res = response.GetResourceByInternalId(s.ColumnInt64(0));
443 res.SetParentIdentifier(s.ColumnString(1));
444 }
445 }
446
447 if (request.IsRetrieveMetadata())
448 {
449 sql = "SELECT id, type, value "
450 "FROM Metadata "
451 "INNER JOIN Lookup ON Metadata.id = Lookup.internalId";
452
453 SQLite::Statement s(db_, SQLITE_FROM_HERE, sql);
454 while (s.Step())
455 {
456 FindResponse::Resource& res = response.GetResourceByInternalId(s.ColumnInt64(0));
457 res.AddMetadata(request.GetLevel(),
458 static_cast<MetadataType>(s.ColumnInt(1)),
459 s.ColumnString(2));
460 }
461 }
462
463 if (request.IsRetrieveLabels())
464 {
465 sql = "SELECT id, label "
466 "FROM Labels "
467 "INNER JOIN Lookup ON Labels.id = Lookup.internalId";
468
469 SQLite::Statement s(db_, SQLITE_FROM_HERE, sql);
470 while (s.Step())
471 {
472 FindResponse::Resource& res = response.GetResourceByInternalId(s.ColumnInt64(0));
473 res.AddLabel(s.ColumnString(1));
474 }
475 }
476
477 if (request.GetLevel() <= ResourceType_Series && request.GetChildrenSpecification(static_cast<ResourceType>(request.GetLevel() + 1)).IsRetrieveIdentifiers())
478 {
479 sql = "SELECT currentLevel.internalId, childLevel.publicId "
480 "FROM Resources AS currentLevel "
481 "INNER JOIN Lookup ON currentLevel.internalId = Lookup.internalId "
482 "INNER JOIN Resources childLevel ON currentLevel.internalId = childLevel.parentId ";
483
484 SQLite::Statement s(db_, SQLITE_FROM_HERE, sql);
485 while (s.Step())
486 {
487 FindResponse::Resource& res = response.GetResourceByInternalId(s.ColumnInt64(0));
488 res.AddChildIdentifier(static_cast<ResourceType>(request.GetLevel() + 1), s.ColumnString(1));
489 }
490 }
491
492 if (request.GetLevel() <= ResourceType_Study && request.GetChildrenSpecification(static_cast<ResourceType>(request.GetLevel() + 2)).IsRetrieveIdentifiers())
493 {
494 sql = "SELECT currentLevel.internalId, grandChildLevel.publicId "
495 "FROM Resources AS currentLevel "
496 "INNER JOIN Lookup ON currentLevel.internalId = Lookup.internalId "
497 "INNER JOIN Resources childLevel ON currentLevel.internalId = childLevel.parentId "
498 "INNER JOIN Resources grandChildLevel ON childLevel.internalId = grandChildLevel.parentId ";
499
500 SQLite::Statement s(db_, SQLITE_FROM_HERE, sql);
501 while (s.Step())
502 {
503 FindResponse::Resource& res = response.GetResourceByInternalId(s.ColumnInt64(0));
504 res.AddChildIdentifier(static_cast<ResourceType>(request.GetLevel() + 2), s.ColumnString(1));
505 }
506 }
507 }
508
509
385 510
386 // From the "ICreateInstance" interface 511 // From the "ICreateInstance" interface
387 virtual void AttachChild(int64_t parent, 512 virtual void AttachChild(int64_t parent,
388 int64_t child) ORTHANC_OVERRIDE 513 int64_t child) ORTHANC_OVERRIDE
389 { 514 {