diff 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
line wrap: on
line diff
--- a/Framework/Plugins/IndexBackend.cpp	Sun Apr 16 14:46:17 2023 +0200
+++ b/Framework/Plugins/IndexBackend.cpp	Thu Jun 22 12:15:48 2023 +0200
@@ -2072,41 +2072,63 @@
     LookupFormatter formatter(manager.GetDialect());
 
     std::string sql;
-    Orthanc::ISqlLookupFormatter::Apply(sql, formatter, lookup, Orthanc::Plugins::Convert(queryLevel),
-                                        labels, labelsConstraint, limit);
-
-    if (requestSomeInstance)
+    bool enableNewStudyCode = true;
+
+    if (enableNewStudyCode && queryLevel == OrthancPluginResourceType_Study)
     {
-      // Composite query to find some instance if requested
-      switch (queryLevel)
+      // separate path for the studies since it has been specifically optimized
+      Orthanc::ISqlLookupFormatter::ApplyExperimental(sql, formatter, lookup, Orthanc::Plugins::Convert(queryLevel), labels, labelsConstraint, limit);
+
+      if (requestSomeInstance)
+      {
+        sql = ("SELECT studies_series.studies_public_id, MIN(instances.publicId) AS instances_public_id "
+                "FROM (SELECT studies.publicId AS studies_public_id, MIN(series.internalId) AS series_internal_id "
+                      "FROM (" + sql + 
+                            ") AS studies "
+                            "INNER JOIN Resources series ON series.parentId = studies.internalId "
+                            "GROUP BY studies.publicId "
+                      ") AS studies_series "
+                "INNER JOIN Resources instances ON instances.parentId = studies_series.series_internal_id "
+                "GROUP BY studies_series.studies_public_id");
+      }
+    }
+    else
+    {
+      Orthanc::ISqlLookupFormatter::Apply(sql, formatter, lookup, Orthanc::Plugins::Convert(queryLevel),
+                                          labels, labelsConstraint, limit);      
+
+      if (requestSomeInstance)
       {
-        case OrthancPluginResourceType_Patient:
-          sql = ("SELECT patients.publicId, MIN(instances.publicId) FROM (" + sql + ") patients "
-                 "INNER JOIN Resources studies   ON studies.parentId   = patients.internalId "
-                 "INNER JOIN Resources series    ON series.parentId    = studies.internalId "
-                 "INNER JOIN Resources instances ON instances.parentId = series.internalId "
-                 "GROUP BY patients.publicId");
-          break;
-
-        case OrthancPluginResourceType_Study:
-          sql = ("SELECT studies.publicId, MIN(instances.publicId) FROM (" + sql + ") studies "
-                 "INNER JOIN Resources series    ON series.parentId    = studies.internalId "
-                 "INNER JOIN Resources instances ON instances.parentId = series.internalId "
-                 "GROUP BY studies.publicId");                 
-          break;
-
-        case OrthancPluginResourceType_Series:
-          sql = ("SELECT series.publicId, MIN(instances.publicId) FROM (" + sql + ") series "
-                 "INNER JOIN Resources instances ON instances.parentId = series.internalId "
-                 "GROUP BY series.publicId");
-          break;
-
-        case OrthancPluginResourceType_Instance:
-          sql = ("SELECT instances.publicId, instances.publicId FROM (" + sql + ") instances");
-          break;
-
-        default:
-          throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
+        // Composite query to find some instance if requested
+        switch (queryLevel)
+        {
+          case OrthancPluginResourceType_Patient:
+            sql = ("SELECT patients.publicId, MIN(instances.publicId) FROM (" + sql + ") patients "
+                  "INNER JOIN Resources studies   ON studies.parentId   = patients.internalId "
+                  "INNER JOIN Resources series    ON series.parentId    = studies.internalId "
+                  "INNER JOIN Resources instances ON instances.parentId = series.internalId "
+                  "GROUP BY patients.publicId");
+            break;
+
+          case OrthancPluginResourceType_Study:
+            sql = ("SELECT studies.publicId, MIN(instances.publicId) FROM (" + sql + ") studies "
+                  "INNER JOIN Resources series    ON series.parentId    = studies.internalId "
+                  "INNER JOIN Resources instances ON instances.parentId = series.internalId "
+                  "GROUP BY studies.publicId");                 
+            break;
+          case OrthancPluginResourceType_Series:
+            sql = ("SELECT series.publicId, MIN(instances.publicId) FROM (" + sql + ") series "
+                  "INNER JOIN Resources instances ON instances.parentId = series.internalId "
+                  "GROUP BY series.publicId");
+            break;
+
+          case OrthancPluginResourceType_Instance:
+            sql = ("SELECT instances.publicId, instances.publicId FROM (" + sql + ") instances");
+            break;
+
+          default:
+            throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
+        }
       }
     }