Mercurial > hg > orthanc-databases
comparison Framework/Plugins/IndexBackend.cpp @ 560:b0ce1ebc9b90 find-refactoring
optimization
author | Alain Mazy <am@orthanc.team> |
---|---|
date | Sat, 14 Sep 2024 11:52:21 +0200 |
parents | e18ec71019fa |
children | 6c76a050a341 |
comparison
equal
deleted
inserted
replaced
559:e18ec71019fa | 560:b0ce1ebc9b90 |
---|---|
3114 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); | 3114 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); |
3115 } | 3115 } |
3116 return content; | 3116 return content; |
3117 } | 3117 } |
3118 | 3118 |
3119 std::string JoinRequestedMetadata(const Orthanc::DatabasePluginMessages::Find_Request_ChildrenSpecification* childrenSpec) | |
3120 { | |
3121 std::set<std::string> metadataTypes; | |
3122 for (int i = 0; i < childrenSpec->retrieve_metadata_size(); ++i) | |
3123 { | |
3124 metadataTypes.insert(boost::lexical_cast<std::string>(childrenSpec->retrieve_metadata(i))); | |
3125 } | |
3126 std::string joinedMetadataTypes; | |
3127 Orthanc::Toolbox::JoinStrings(joinedMetadataTypes, metadataTypes, ", "); | |
3128 | |
3129 return joinedMetadataTypes; | |
3130 } | |
3131 | |
3132 std::string JoinRequestedTags(const Orthanc::DatabasePluginMessages::Find_Request_ChildrenSpecification* childrenSpec) | |
3133 { | |
3134 std::set<std::string> tags; | |
3135 for (int i = 0; i < childrenSpec->retrieve_main_dicom_tags_size(); ++i) | |
3136 { | |
3137 tags.insert("(" + boost::lexical_cast<std::string>(childrenSpec->retrieve_main_dicom_tags(i).group()) | |
3138 + ", " + boost::lexical_cast<std::string>(childrenSpec->retrieve_main_dicom_tags(i).element()) + ")"); | |
3139 } | |
3140 std::string joinedTags; | |
3141 Orthanc::Toolbox::JoinStrings(joinedTags, tags, ", "); | |
3142 | |
3143 return joinedTags; | |
3144 } | |
3145 | |
3119 | 3146 |
3120 #define C0_QUERY_ID 0 | 3147 #define C0_QUERY_ID 0 |
3121 #define C1_INTERNAL_ID 1 | 3148 #define C1_INTERNAL_ID 1 |
3122 #define C2_ROW_NUMBER 2 | 3149 #define C2_ROW_NUMBER 2 |
3123 #define C3_STRING_1 3 | 3150 #define C3_STRING_1 3 |
3368 " tagElement AS c7_int2, " | 3395 " tagElement AS c7_int2, " |
3369 " NULL::BIGINT AS c8_big_int1, " | 3396 " NULL::BIGINT AS c8_big_int1, " |
3370 " NULL::BIGINT AS c9_big_int2 " | 3397 " NULL::BIGINT AS c9_big_int2 " |
3371 "FROM Lookup " | 3398 "FROM Lookup " |
3372 " INNER JOIN Resources childLevel ON childLevel.parentId = Lookup.internalId " | 3399 " INNER JOIN Resources childLevel ON childLevel.parentId = Lookup.internalId " |
3373 " INNER JOIN MainDicomTags ON MainDicomTags.id = childLevel.internalId "; | 3400 " INNER JOIN MainDicomTags ON MainDicomTags.id = childLevel.internalId AND (tagGroup, tagElement) IN (" + JoinRequestedTags(childrenSpec) + ")"; |
3374 } | 3401 } |
3375 | 3402 |
3376 // need children identifiers ? | 3403 // need children identifiers ? |
3377 if (childrenSpec->retrieve_identifiers()) | 3404 if (childrenSpec->retrieve_identifiers()) |
3378 { | 3405 { |
3390 "FROM Resources AS currentLevel " | 3417 "FROM Resources AS currentLevel " |
3391 " INNER JOIN Lookup ON currentLevel.internalId = Lookup.internalId " | 3418 " INNER JOIN Lookup ON currentLevel.internalId = Lookup.internalId " |
3392 " INNER JOIN Resources childLevel ON currentLevel.internalId = childLevel.parentId "; | 3419 " INNER JOIN Resources childLevel ON currentLevel.internalId = childLevel.parentId "; |
3393 } | 3420 } |
3394 | 3421 |
3395 if (childrenSpec->retrieve_metadata_size() > 0) // TODO-FIND: retrieve only the requested metadata ? | 3422 if (childrenSpec->retrieve_metadata_size() > 0) |
3396 { | 3423 { |
3397 sql += "UNION SELECT " | 3424 sql += "UNION SELECT " |
3398 " " TOSTRING(QUERY_CHILDREN_METADATA) " AS c0_queryId, " | 3425 " " TOSTRING(QUERY_CHILDREN_METADATA) " AS c0_queryId, " |
3399 " Lookup.internalId AS c1_internalId, " | 3426 " Lookup.internalId AS c1_internalId, " |
3400 " NULL::BIGINT AS c2_rowNumber, " | 3427 " NULL::BIGINT AS c2_rowNumber, " |
3405 " NULL::INT AS c7_int2, " | 3432 " NULL::INT AS c7_int2, " |
3406 " NULL::BIGINT AS c8_big_int1, " | 3433 " NULL::BIGINT AS c8_big_int1, " |
3407 " NULL::BIGINT AS c9_big_int2 " | 3434 " NULL::BIGINT AS c9_big_int2 " |
3408 "FROM Lookup " | 3435 "FROM Lookup " |
3409 " INNER JOIN Resources childLevel ON childLevel.parentId = Lookup.internalId " | 3436 " INNER JOIN Resources childLevel ON childLevel.parentId = Lookup.internalId " |
3410 " INNER JOIN Metadata ON Metadata.id = childLevel.internalId "; | 3437 " INNER JOIN Metadata ON Metadata.id = childLevel.internalId AND Metadata.type IN (" + JoinRequestedMetadata(childrenSpec) + ") "; |
3411 } | 3438 } |
3412 | 3439 |
3413 if (request.level() <= Orthanc::DatabasePluginMessages::ResourceType::RESOURCE_STUDY) | 3440 if (request.level() <= Orthanc::DatabasePluginMessages::ResourceType::RESOURCE_STUDY) |
3414 { | 3441 { |
3415 const Orthanc::DatabasePluginMessages::Find_Request_ChildrenSpecification* grandchildrenSpec = NULL; | 3442 const Orthanc::DatabasePluginMessages::Find_Request_ChildrenSpecification* grandchildrenSpec = NULL; |
3444 "INNER JOIN Lookup ON currentLevel.internalId = Lookup.internalId " | 3471 "INNER JOIN Lookup ON currentLevel.internalId = Lookup.internalId " |
3445 "INNER JOIN Resources childLevel ON currentLevel.internalId = childLevel.parentId " | 3472 "INNER JOIN Resources childLevel ON currentLevel.internalId = childLevel.parentId " |
3446 "INNER JOIN Resources grandChildLevel ON childLevel.internalId = grandChildLevel.parentId "; | 3473 "INNER JOIN Resources grandChildLevel ON childLevel.internalId = grandChildLevel.parentId "; |
3447 } | 3474 } |
3448 | 3475 |
3449 if (grandchildrenSpec->retrieve_main_dicom_tags_size() > 0) // TODO-FIND: retrieve only the requested tags ? | 3476 if (grandchildrenSpec->retrieve_main_dicom_tags_size() > 0) |
3450 { | 3477 { |
3451 sql += "UNION SELECT " | 3478 sql += "UNION SELECT " |
3452 " " TOSTRING(QUERY_GRAND_CHILDREN_MAIN_DICOM_TAGS) " AS c0_queryId, " | 3479 " " TOSTRING(QUERY_GRAND_CHILDREN_MAIN_DICOM_TAGS) " AS c0_queryId, " |
3453 " Lookup.internalId AS c1_internalId, " | 3480 " Lookup.internalId AS c1_internalId, " |
3454 " NULL::BIGINT AS c2_rowNumber, " | 3481 " NULL::BIGINT AS c2_rowNumber, " |
3460 " NULL::BIGINT AS c8_big_int1, " | 3487 " NULL::BIGINT AS c8_big_int1, " |
3461 " NULL::BIGINT AS c9_big_int2 " | 3488 " NULL::BIGINT AS c9_big_int2 " |
3462 "FROM Lookup " | 3489 "FROM Lookup " |
3463 " INNER JOIN Resources childLevel ON childLevel.parentId = Lookup.internalId " | 3490 " INNER JOIN Resources childLevel ON childLevel.parentId = Lookup.internalId " |
3464 " INNER JOIN Resources grandChildLevel ON childLevel.parentId = Lookup.internalId " | 3491 " INNER JOIN Resources grandChildLevel ON childLevel.parentId = Lookup.internalId " |
3465 " INNER JOIN MainDicomTags ON MainDicomTags.id = grandChildLevel.internalId "; | 3492 " INNER JOIN MainDicomTags ON MainDicomTags.id = grandChildLevel.internalId AND (tagGroup, tagElement) IN (" + JoinRequestedTags(grandchildrenSpec) + ")"; |
3466 } | 3493 } |
3467 | 3494 |
3468 if (grandchildrenSpec->retrieve_metadata_size() > 0) // TODO-FIND: retrieve only the requested metadata ? | 3495 if (grandchildrenSpec->retrieve_metadata_size() > 0) |
3469 { | 3496 { |
3470 sql += "UNION SELECT " | 3497 sql += "UNION SELECT " |
3471 " " TOSTRING(QUERY_GRAND_CHILDREN_METADATA) " AS c0_queryId, " | 3498 " " TOSTRING(QUERY_GRAND_CHILDREN_METADATA) " AS c0_queryId, " |
3472 " Lookup.internalId AS c1_internalId, " | 3499 " Lookup.internalId AS c1_internalId, " |
3473 " NULL::BIGINT AS c2_rowNumber, " | 3500 " NULL::BIGINT AS c2_rowNumber, " |
3479 " NULL::BIGINT AS c8_big_int1, " | 3506 " NULL::BIGINT AS c8_big_int1, " |
3480 " NULL::BIGINT AS c9_big_int2 " | 3507 " NULL::BIGINT AS c9_big_int2 " |
3481 "FROM Lookup " | 3508 "FROM Lookup " |
3482 " INNER JOIN Resources childLevel ON childLevel.parentId = Lookup.internalId " | 3509 " INNER JOIN Resources childLevel ON childLevel.parentId = Lookup.internalId " |
3483 " INNER JOIN Resources grandChildLevel ON childLevel.parentId = Lookup.internalId " | 3510 " INNER JOIN Resources grandChildLevel ON childLevel.parentId = Lookup.internalId " |
3484 " INNER JOIN Metadata ON Metadata.id = grandChildLevel.internalId "; | 3511 " INNER JOIN Metadata ON Metadata.id = grandChildLevel.internalId AND Metadata.type IN (" + JoinRequestedMetadata(grandchildrenSpec) + ") "; |
3485 } | 3512 } |
3486 | 3513 |
3487 if (request.level() == Orthanc::DatabasePluginMessages::ResourceType::RESOURCE_PATIENT) | 3514 if (request.level() == Orthanc::DatabasePluginMessages::ResourceType::RESOURCE_PATIENT) |
3488 { | 3515 { |
3489 const Orthanc::DatabasePluginMessages::Find_Request_ChildrenSpecification* grandgrandchildrenSpec = &(request.children_instances()); | 3516 const Orthanc::DatabasePluginMessages::Find_Request_ChildrenSpecification* grandgrandchildrenSpec = &(request.children_instances()); |