diff Framework/Plugins/IndexBackend.cpp @ 580:35d2df9572b1 find-refactoring

count-resources
author Alain Mazy <am@orthanc.team>
date Tue, 15 Oct 2024 15:52:39 +0200
parents 77c8544bbd7d
children a80775ee5eea
line wrap: on
line diff
--- a/Framework/Plugins/IndexBackend.cpp	Tue Oct 08 17:57:22 2024 +0200
+++ b/Framework/Plugins/IndexBackend.cpp	Tue Oct 15 15:52:39 2024 +0200
@@ -3187,6 +3187,24 @@
 #define STRINGIFY(x) #x
 #define TOSTRING(x) STRINGIFY(x)
 
+  void IndexBackend::ExecuteCount(Orthanc::DatabasePluginMessages::TransactionResponse& response,
+                                  DatabaseManager& manager,
+                                  const Orthanc::DatabasePluginMessages::Find_Request& request)
+  {
+    std::string sql;
+
+    LookupFormatter formatter(manager.GetDialect());
+    std::string lookupSql;
+    ISqlLookupFormatter::Apply(lookupSql, formatter, request);
+
+    sql = "WITH Lookup AS (" + lookupSql + ") SELECT COUNT(*) FROM Lookup";
+
+    DatabaseManager::StandaloneStatement statement(manager, sql);  // TODO-FIND: cache dynamic statement ?  Probably worth it since it can be very complex queries !
+    formatter.PrepareStatement(statement);
+    statement.Execute(formatter.GetDictionary());
+    response.mutable_count_resources()->set_count(statement.ReadInteger64(0));
+  }
+
   void IndexBackend::ExecuteFind(Orthanc::DatabasePluginMessages::TransactionResponse& response,
                                     DatabaseManager& manager,
                                     const Orthanc::DatabasePluginMessages::Find_Request& request)