comparison Framework/Plugins/IndexBackend.cpp @ 415:7e123f047771

LookupResources optimization continued
author Alain Mazy <am@osimis.io>
date Thu, 22 Jun 2023 18:07:41 +0200
parents f2d3b5c5a68d
children d700c8f9fc24
comparison
equal deleted inserted replaced
414:f2d3b5c5a68d 415:7e123f047771
2061 #if ORTHANC_PLUGINS_HAS_DATABASE_CONSTRAINT == 1 2061 #if ORTHANC_PLUGINS_HAS_DATABASE_CONSTRAINT == 1
2062 // New primitive since Orthanc 1.5.2 2062 // New primitive since Orthanc 1.5.2
2063 void IndexBackend::LookupResources(IDatabaseBackendOutput& output, 2063 void IndexBackend::LookupResources(IDatabaseBackendOutput& output,
2064 DatabaseManager& manager, 2064 DatabaseManager& manager,
2065 const std::vector<Orthanc::DatabaseConstraint>& lookup, 2065 const std::vector<Orthanc::DatabaseConstraint>& lookup,
2066 OrthancPluginResourceType queryLevel, 2066 OrthancPluginResourceType queryLevel_,
2067 const std::set<std::string>& labels, 2067 const std::set<std::string>& labels,
2068 Orthanc::LabelsConstraint labelsConstraint, 2068 Orthanc::LabelsConstraint labelsConstraint,
2069 uint32_t limit, 2069 uint32_t limit,
2070 bool requestSomeInstance) 2070 bool requestSomeInstance)
2071 { 2071 {
2072 LookupFormatter formatter(manager.GetDialect()); 2072 LookupFormatter formatter(manager.GetDialect());
2073 Orthanc::ResourceType queryLevel = Orthanc::Plugins::Convert(queryLevel_);
2074 Orthanc::ResourceType lowerLevel, upperLevel;
2075 Orthanc::ISqlLookupFormatter::GetLookupLevels(lowerLevel, upperLevel, queryLevel, lookup);
2073 2076
2074 std::string sql; 2077 std::string sql;
2075 bool enableNewStudyCode = true; 2078 bool enableNewStudyCode = true;
2076 2079
2077 if (enableNewStudyCode && queryLevel == OrthancPluginResourceType_Study) 2080 if (enableNewStudyCode && lowerLevel == queryLevel && upperLevel == queryLevel)
2078 { 2081 {
2079 // separate path for the studies since it has been specifically optimized 2082 Orthanc::ISqlLookupFormatter::ApplySingleLevel(sql, formatter, lookup, queryLevel, labels, labelsConstraint, limit);
2080 Orthanc::ISqlLookupFormatter::ApplyExperimental(sql, formatter, lookup, Orthanc::Plugins::Convert(queryLevel), labels, labelsConstraint, limit);
2081
2082 if (requestSomeInstance)
2083 {
2084 sql = ("SELECT studies_series.studies_public_id, MIN(instances.publicId) AS instances_public_id "
2085 "FROM (SELECT studies.publicId AS studies_public_id, MIN(series.internalId) AS series_internal_id "
2086 "FROM (" + sql +
2087 ") AS studies "
2088 "INNER JOIN Resources series ON series.parentId = studies.internalId "
2089 "GROUP BY studies.publicId "
2090 ") AS studies_series "
2091 "INNER JOIN Resources instances ON instances.parentId = studies_series.series_internal_id "
2092 "GROUP BY studies_series.studies_public_id");
2093 }
2094 }
2095 else
2096 {
2097 Orthanc::ISqlLookupFormatter::Apply(sql, formatter, lookup, Orthanc::Plugins::Convert(queryLevel),
2098 labels, labelsConstraint, limit);
2099 2083
2100 if (requestSomeInstance) 2084 if (requestSomeInstance)
2101 { 2085 {
2102 // Composite query to find some instance if requested 2086 // Composite query to find some instance if requested
2103 switch (queryLevel) 2087 switch (queryLevel)
2104 { 2088 {
2105 case OrthancPluginResourceType_Patient: 2089 case Orthanc::ResourceType_Patient:
2090 sql = ("SELECT patients_studies.patients_public_id, MIN(instances.publicId) AS instances_public_id "
2091 "FROM (SELECT patients.publicId AS patients_public_id, MIN(studies.internalId) AS studies_internal_id "
2092 "FROM (" + sql +
2093 ") AS patients "
2094 "INNER JOIN Resources studies ON studies.parentId = patients.internalId "
2095 "GROUP BY patients.publicId "
2096 ") AS patients_studies "
2097 "INNER JOIN Resources series ON series.parentId = patients_studies.studies_internal_id "
2098 "INNER JOIN Resources instances ON instances.parentId = series.internalId "
2099 "GROUP BY patients_studies.patients_public_id");
2100 break;
2101 case Orthanc::ResourceType_Study:
2102 sql = ("SELECT studies_series.studies_public_id, MIN(instances.publicId) AS instances_public_id "
2103 "FROM (SELECT studies.publicId AS studies_public_id, MIN(series.internalId) AS series_internal_id "
2104 "FROM (" + sql +
2105 ") AS studies "
2106 "INNER JOIN Resources series ON series.parentId = studies.internalId "
2107 "GROUP BY studies.publicId "
2108 ") AS studies_series "
2109 "INNER JOIN Resources instances ON instances.parentId = studies_series.series_internal_id "
2110 "GROUP BY studies_series.studies_public_id");
2111 break;
2112 case Orthanc::ResourceType_Series:
2113 sql = ("SELECT series.publicId AS series_public_id, MIN(instances.publicId) AS instances_public_id "
2114 "FROM (" + sql +
2115 ") AS series "
2116 "INNER JOIN Resources instances ON instances.parentId = series.internalId "
2117 "GROUP BY series.publicId ");
2118 break;
2119
2120 case Orthanc::ResourceType_Instance:
2121 sql = ("SELECT instances.publicId, instances.publicId FROM (" + sql + ") instances");
2122 break;
2123
2124 default:
2125 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
2126 }
2127 }
2128 }
2129 else
2130 {
2131 Orthanc::ISqlLookupFormatter::Apply(sql, formatter, lookup, queryLevel, labels, labelsConstraint, limit);
2132
2133 if (requestSomeInstance)
2134 {
2135 // Composite query to find some instance if requested
2136 switch (queryLevel)
2137 {
2138 case Orthanc::ResourceType_Patient:
2106 sql = ("SELECT patients.publicId, MIN(instances.publicId) FROM (" + sql + ") patients " 2139 sql = ("SELECT patients.publicId, MIN(instances.publicId) FROM (" + sql + ") patients "
2107 "INNER JOIN Resources studies ON studies.parentId = patients.internalId " 2140 "INNER JOIN Resources studies ON studies.parentId = patients.internalId "
2108 "INNER JOIN Resources series ON series.parentId = studies.internalId " 2141 "INNER JOIN Resources series ON series.parentId = studies.internalId "
2109 "INNER JOIN Resources instances ON instances.parentId = series.internalId " 2142 "INNER JOIN Resources instances ON instances.parentId = series.internalId "
2110 "GROUP BY patients.publicId"); 2143 "GROUP BY patients.publicId");
2111 break; 2144 break;
2112 2145
2113 case OrthancPluginResourceType_Study: 2146 case Orthanc::ResourceType_Study:
2114 sql = ("SELECT studies.publicId, MIN(instances.publicId) FROM (" + sql + ") studies " 2147 sql = ("SELECT studies.publicId, MIN(instances.publicId) FROM (" + sql + ") studies "
2115 "INNER JOIN Resources series ON series.parentId = studies.internalId " 2148 "INNER JOIN Resources series ON series.parentId = studies.internalId "
2116 "INNER JOIN Resources instances ON instances.parentId = series.internalId " 2149 "INNER JOIN Resources instances ON instances.parentId = series.internalId "
2117 "GROUP BY studies.publicId"); 2150 "GROUP BY studies.publicId");
2118 break; 2151 break;
2119 case OrthancPluginResourceType_Series: 2152 case Orthanc::ResourceType_Series:
2120 sql = ("SELECT series.publicId, MIN(instances.publicId) FROM (" + sql + ") series " 2153 sql = ("SELECT series.publicId, MIN(instances.publicId) FROM (" + sql + ") series "
2121 "INNER JOIN Resources instances ON instances.parentId = series.internalId " 2154 "INNER JOIN Resources instances ON instances.parentId = series.internalId "
2122 "GROUP BY series.publicId"); 2155 "GROUP BY series.publicId");
2123 break; 2156 break;
2124 2157
2125 case OrthancPluginResourceType_Instance: 2158 case Orthanc::ResourceType_Instance:
2126 sql = ("SELECT instances.publicId, instances.publicId FROM (" + sql + ") instances"); 2159 sql = ("SELECT instances.publicId, instances.publicId FROM (" + sql + ") instances");
2127 break; 2160 break;
2128 2161
2129 default: 2162 default:
2130 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); 2163 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);