Mercurial > hg > orthanc
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 { |