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());