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