comparison Framework/Plugins/IndexBackend.cpp @ 414:f2d3b5c5a68d

Optimizing tools/find at studies level only. Integ Tests are ok with PG
author Alain Mazy <am@osimis.io>
date Thu, 22 Jun 2023 12:15:48 +0200
parents 614031f7a16d
children 7e123f047771
comparison
equal deleted inserted replaced
413:afb30d17f090 414:f2d3b5c5a68d
2070 bool requestSomeInstance) 2070 bool requestSomeInstance)
2071 { 2071 {
2072 LookupFormatter formatter(manager.GetDialect()); 2072 LookupFormatter formatter(manager.GetDialect());
2073 2073
2074 std::string sql; 2074 std::string sql;
2075 Orthanc::ISqlLookupFormatter::Apply(sql, formatter, lookup, Orthanc::Plugins::Convert(queryLevel), 2075 bool enableNewStudyCode = true;
2076 labels, labelsConstraint, limit); 2076
2077 2077 if (enableNewStudyCode && queryLevel == OrthancPluginResourceType_Study)
2078 if (requestSomeInstance) 2078 {
2079 { 2079 // separate path for the studies since it has been specifically optimized
2080 // Composite query to find some instance if requested 2080 Orthanc::ISqlLookupFormatter::ApplyExperimental(sql, formatter, lookup, Orthanc::Plugins::Convert(queryLevel), labels, labelsConstraint, limit);
2081 switch (queryLevel) 2081
2082 { 2082 if (requestSomeInstance)
2083 case OrthancPluginResourceType_Patient: 2083 {
2084 sql = ("SELECT patients.publicId, MIN(instances.publicId) FROM (" + sql + ") patients " 2084 sql = ("SELECT studies_series.studies_public_id, MIN(instances.publicId) AS instances_public_id "
2085 "INNER JOIN Resources studies ON studies.parentId = patients.internalId " 2085 "FROM (SELECT studies.publicId AS studies_public_id, MIN(series.internalId) AS series_internal_id "
2086 "INNER JOIN Resources series ON series.parentId = studies.internalId " 2086 "FROM (" + sql +
2087 "INNER JOIN Resources instances ON instances.parentId = series.internalId " 2087 ") AS studies "
2088 "GROUP BY patients.publicId"); 2088 "INNER JOIN Resources series ON series.parentId = studies.internalId "
2089 break; 2089 "GROUP BY studies.publicId "
2090 2090 ") AS studies_series "
2091 case OrthancPluginResourceType_Study: 2091 "INNER JOIN Resources instances ON instances.parentId = studies_series.series_internal_id "
2092 sql = ("SELECT studies.publicId, MIN(instances.publicId) FROM (" + sql + ") studies " 2092 "GROUP BY studies_series.studies_public_id");
2093 "INNER JOIN Resources series ON series.parentId = studies.internalId " 2093 }
2094 "INNER JOIN Resources instances ON instances.parentId = series.internalId " 2094 }
2095 "GROUP BY studies.publicId"); 2095 else
2096 break; 2096 {
2097 2097 Orthanc::ISqlLookupFormatter::Apply(sql, formatter, lookup, Orthanc::Plugins::Convert(queryLevel),
2098 case OrthancPluginResourceType_Series: 2098 labels, labelsConstraint, limit);
2099 sql = ("SELECT series.publicId, MIN(instances.publicId) FROM (" + sql + ") series " 2099
2100 "INNER JOIN Resources instances ON instances.parentId = series.internalId " 2100 if (requestSomeInstance)
2101 "GROUP BY series.publicId"); 2101 {
2102 break; 2102 // Composite query to find some instance if requested
2103 2103 switch (queryLevel)
2104 case OrthancPluginResourceType_Instance: 2104 {
2105 sql = ("SELECT instances.publicId, instances.publicId FROM (" + sql + ") instances"); 2105 case OrthancPluginResourceType_Patient:
2106 break; 2106 sql = ("SELECT patients.publicId, MIN(instances.publicId) FROM (" + sql + ") patients "
2107 2107 "INNER JOIN Resources studies ON studies.parentId = patients.internalId "
2108 default: 2108 "INNER JOIN Resources series ON series.parentId = studies.internalId "
2109 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); 2109 "INNER JOIN Resources instances ON instances.parentId = series.internalId "
2110 "GROUP BY patients.publicId");
2111 break;
2112
2113 case OrthancPluginResourceType_Study:
2114 sql = ("SELECT studies.publicId, MIN(instances.publicId) FROM (" + sql + ") studies "
2115 "INNER JOIN Resources series ON series.parentId = studies.internalId "
2116 "INNER JOIN Resources instances ON instances.parentId = series.internalId "
2117 "GROUP BY studies.publicId");
2118 break;
2119 case OrthancPluginResourceType_Series:
2120 sql = ("SELECT series.publicId, MIN(instances.publicId) FROM (" + sql + ") series "
2121 "INNER JOIN Resources instances ON instances.parentId = series.internalId "
2122 "GROUP BY series.publicId");
2123 break;
2124
2125 case OrthancPluginResourceType_Instance:
2126 sql = ("SELECT instances.publicId, instances.publicId FROM (" + sql + ") instances");
2127 break;
2128
2129 default:
2130 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
2131 }
2110 } 2132 }
2111 } 2133 }
2112 2134
2113 DatabaseManager::StandaloneStatement statement(manager, sql); 2135 DatabaseManager::StandaloneStatement statement(manager, sql);
2114 formatter.PrepareStatement(statement); 2136 formatter.PrepareStatement(statement);