Mercurial > hg > orthanc-databases
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); |