From 45777a4e3e9195e01b7cbbf623b19b49fc145090 Mon Sep 17 00:00:00 2001
From: MarcosPierasNL <pieras.marcos@gmail.com>
Date: Wed, 29 Jan 2025 14:14:59 +0100
Subject: [PATCH 1/5] feat: adds multiple queries

---
 src/readers/insightProcessor.ts |  9 +++++++--
 src/readers/queryService.ts     | 12 ++++++++++--
 2 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/src/readers/insightProcessor.ts b/src/readers/insightProcessor.ts
index 10c7068..9b7e25f 100644
--- a/src/readers/insightProcessor.ts
+++ b/src/readers/insightProcessor.ts
@@ -84,9 +84,14 @@ export const insightProcessor = async () => {
     if (insight.userId == null) return;
     const ss = await ums.getUserSaveState(insight.userId, insight.saveStateId);
 
+    const activeQuery = ss.queries.activeQueryId;
+    if (activeQuery == null || activeQuery == -1) {
+      log.error('No active query found in SaveState:', ss);
+      return;
+    }
     const visualizations = ss.visualizations.openVisualizationArray;
-    const visualQuery = ss.queries[0].graph;
-    const queryBuilderSettings = ss.queries[0].settings;
+    const visualQuery = ss.queries.openQueryArray[activeQuery].graph;
+    const queryBuilderSettings = ss.queries.openQueryArray[activeQuery].settings;
     const convertedQuery = Query2BackendQuery(ss.id, visualQuery, queryBuilderSettings, []);
     const query = query2Cypher(convertedQuery);
     if (query == null) return;
diff --git a/src/readers/queryService.ts b/src/readers/queryService.ts
index 9da7bad..daf852c 100644
--- a/src/readers/queryService.ts
+++ b/src/readers/queryService.ts
@@ -104,8 +104,16 @@ export const queryServiceReader = async (frontendPublisher: RabbitMqBroker, mlPu
       publisher.publishErrorToFrontend('Invalid SaveState');
       return;
     }
+    log.info('queries :', ss);
 
-    const visualQuery = ss.queries[0].graph;
+    const activeQuery = ss.queries.activeQueryId;
+    if (activeQuery == null || activeQuery == -1) {
+      log.error('No active query found in SaveState:', ss);
+      publisher.publishErrorToFrontend('No active query found');
+      return;
+    }
+
+    const visualQuery = ss.queries.openQueryArray[activeQuery].graph; //ss.queries[0].graph;
     log.debug('Received query request:', message, headers, visualQuery);
     if (visualQuery.nodes.length === 0) {
       log.info('Empty query received');
@@ -121,7 +129,7 @@ export const queryServiceReader = async (frontendPublisher: RabbitMqBroker, mlPu
       return;
     }
 
-    const queryBuilderSettings = ss.queries[0].settings;
+    const queryBuilderSettings = ss.queries.openQueryArray[activeQuery].settings; //ss.queries[0].settings;
     const ml = message.ml;
     const convertedQuery = Query2BackendQuery(ss.id, visualQuery, queryBuilderSettings, ml);
 
-- 
GitLab


From 8dc624bc19702c9c5f35c44a33397de45a8d2808 Mon Sep 17 00:00:00 2001
From: Dennis Collaris <d.collaris@me.com>
Date: Mon, 3 Feb 2025 16:59:48 +0100
Subject: [PATCH 2/5] style: remove debugging line

---
 src/readers/queryService.ts | 1 -
 1 file changed, 1 deletion(-)

diff --git a/src/readers/queryService.ts b/src/readers/queryService.ts
index daf852c..cf913ac 100644
--- a/src/readers/queryService.ts
+++ b/src/readers/queryService.ts
@@ -104,7 +104,6 @@ export const queryServiceReader = async (frontendPublisher: RabbitMqBroker, mlPu
       publisher.publishErrorToFrontend('Invalid SaveState');
       return;
     }
-    log.info('queries :', ss);
 
     const activeQuery = ss.queries.activeQueryId;
     if (activeQuery == null || activeQuery == -1) {
-- 
GitLab


From 4c8b1c675f72592ad5ad24b857f148d1188345ad Mon Sep 17 00:00:00 2001
From: Dennis Collaris <d.collaris@me.com>
Date: Mon, 3 Feb 2025 17:02:39 +0100
Subject: [PATCH 3/5] fix: run all save state queries in insight processor, not
 only the active one

---
 src/readers/insightProcessor.ts | 119 ++++++++++++++++----------------
 1 file changed, 59 insertions(+), 60 deletions(-)

diff --git a/src/readers/insightProcessor.ts b/src/readers/insightProcessor.ts
index 9b7e25f..c891cd1 100644
--- a/src/readers/insightProcessor.ts
+++ b/src/readers/insightProcessor.ts
@@ -84,70 +84,69 @@ export const insightProcessor = async () => {
     if (insight.userId == null) return;
     const ss = await ums.getUserSaveState(insight.userId, insight.saveStateId);
 
-    const activeQuery = ss.queries.activeQueryId;
-    if (activeQuery == null || activeQuery == -1) {
-      log.error('No active query found in SaveState:', ss);
-      return;
-    }
+    const queries = ss.queries.openQueryArray;
     const visualizations = ss.visualizations.openVisualizationArray;
-    const visualQuery = ss.queries.openQueryArray[activeQuery].graph;
-    const queryBuilderSettings = ss.queries.openQueryArray[activeQuery].settings;
-    const convertedQuery = Query2BackendQuery(ss.id, visualQuery, queryBuilderSettings, []);
-    const query = query2Cypher(convertedQuery);
-    if (query == null) return;
-    try {
-      const result = await queryService(ss.dbConnections[0], query);
-
-      insight.status = false;
-
-      if (insight.alarmMode === 'always') {
-        insight.status = true;
-      } else if (insight.alarmMode === 'diff') {
-        insight = await diffCheck(insight, ss, result);
-      } else if (insight.alarmMode === 'conditional' && insight.conditionsCheck && insight.conditionsCheck.length > 0) {
-        insight = statCheck(insight, result);
-      }
-
-      if (insight.userId == null) return; // fixes ts but never is the case
-      await ums.updateInsight(insight.userId, insight.id, insight);
-
-      if (insight.status || message.force) {
-        if (insight.status) log.debug('Insight passed the check');
-        if (message.force) log.debug('Forced insight processing');
 
-        editor.read(async () => {
-          const cleanUpDom = setUpDom();
-          let html = $generateHtmlFromNodes(editor);
-          cleanUpDom();
-
-          html = await populateTemplate(html, result, visualizations);
-
-          for (const recipient of insight.recipients) {
-            if (mail == null) {
-              log.warn('Mail is not configured. Insight processor will be disabled');
-              return;
+    for (const queryIndex in queries) {
+      const visualQuery = ss.queries.openQueryArray[queryIndex].graph;
+      const queryBuilderSettings = ss.queries.openQueryArray[queryIndex].settings;
+      const convertedQuery = Query2BackendQuery(ss.id, visualQuery, queryBuilderSettings, []);
+      const query = query2Cypher(convertedQuery);
+      if (query == null) return;
+      try {
+        const result = await queryService(ss.dbConnections[0], query);
+
+        insight.status = false;
+
+        if (insight.alarmMode === 'always') {
+          insight.status = true;
+        } else if (insight.alarmMode === 'diff') {
+          insight = await diffCheck(insight, ss, result);
+        } else if (insight.alarmMode === 'conditional' && insight.conditionsCheck && insight.conditionsCheck.length > 0) {
+          insight = statCheck(insight, result);
+        }
+
+        if (insight.userId == null) return; // fixes ts but never is the case
+        await ums.updateInsight(insight.userId, insight.id, insight);
+
+        if (insight.status || message.force) {
+          if (insight.status) log.debug('Insight passed the check');
+          if (message.force) log.debug('Forced insight processing');
+
+          editor.read(async () => {
+            const cleanUpDom = setUpDom();
+            let html = $generateHtmlFromNodes(editor);
+            cleanUpDom();
+
+            html = await populateTemplate(html, result, visualizations);
+
+            for (const recipient of insight.recipients) {
+              if (mail == null) {
+                log.warn('Mail is not configured. Insight processor will be disabled');
+                return;
+              }
+
+              if (DEBUG_EMAIL) {
+                log.warn('DEBUG: Would have sent mail to', recipient);
+                continue;
+              }
+
+              log.debug('Sending mail to', recipient);
+              await mail.sendMail({
+                to: recipient,
+                from: SMTP_USER,
+                subject: `GraphPolaris report: ${insight.name}`,
+                html: html,
+              });
+              log.info('Mail sent to ', recipient);
             }
-
-            if (DEBUG_EMAIL) {
-              log.warn('DEBUG: Would have sent mail to', recipient);
-              continue;
-            }
-
-            log.debug('Sending mail to', recipient);
-            await mail.sendMail({
-              to: recipient,
-              from: SMTP_USER,
-              subject: `GraphPolaris report: ${insight.name}`,
-              html: html,
-            });
-            log.info('Mail sent to ', recipient);
-          }
-        });
-      } else {
-        log.debug('WARN: Insight did not pass the check');
+          });
+        } else {
+          log.debug('WARN: Insight did not pass the check');
+        }
+      } catch (err) {
+        log.error('Error processing insight', err);
       }
-    } catch (err) {
-      log.error('Error processing insight', err);
     }
   });
 };
-- 
GitLab


From e15aaab1f19bbf9a0e4a845deeb5d7e7a3c674f6 Mon Sep 17 00:00:00 2001
From: Leonardo <leomilho@gmail.com>
Date: Tue, 4 Feb 2025 12:16:57 +0100
Subject: [PATCH 4/5] fix: fixes for multiplequery rebase

---
 src/readers/insightProcessor.ts |  6 +++---
 src/readers/queryService.ts     | 13 ++++++++++---
 2 files changed, 13 insertions(+), 6 deletions(-)

diff --git a/src/readers/insightProcessor.ts b/src/readers/insightProcessor.ts
index c891cd1..ad60515 100644
--- a/src/readers/insightProcessor.ts
+++ b/src/readers/insightProcessor.ts
@@ -84,12 +84,12 @@ export const insightProcessor = async () => {
     if (insight.userId == null) return;
     const ss = await ums.getUserSaveState(insight.userId, insight.saveStateId);
 
-    const queries = ss.queries.openQueryArray;
+    const queries = ss.queryStates.openQueryArray;
     const visualizations = ss.visualizations.openVisualizationArray;
 
     for (const queryIndex in queries) {
-      const visualQuery = ss.queries.openQueryArray[queryIndex].graph;
-      const queryBuilderSettings = ss.queries.openQueryArray[queryIndex].settings;
+      const visualQuery = ss.queryStates.openQueryArray[queryIndex].graph;
+      const queryBuilderSettings = ss.queryStates.openQueryArray[queryIndex].settings;
       const convertedQuery = Query2BackendQuery(ss.id, visualQuery, queryBuilderSettings, []);
       const query = query2Cypher(convertedQuery);
       if (query == null) return;
diff --git a/src/readers/queryService.ts b/src/readers/queryService.ts
index cf913ac..e94fa07 100644
--- a/src/readers/queryService.ts
+++ b/src/readers/queryService.ts
@@ -105,14 +105,21 @@ export const queryServiceReader = async (frontendPublisher: RabbitMqBroker, mlPu
       return;
     }
 
-    const activeQuery = ss.queries.activeQueryId;
+    const activeQuery = ss.queryStates.activeQueryId;
     if (activeQuery == null || activeQuery == -1) {
       log.error('No active query found in SaveState:', ss);
       publisher.publishErrorToFrontend('No active query found');
       return;
     }
 
-    const visualQuery = ss.queries.openQueryArray[activeQuery].graph; //ss.queries[0].graph;
+    const activeQueryInfo = ss.queryStates.openQueryArray.find(q => q.id === activeQuery);
+    if (activeQueryInfo == null) {
+      log.error('Active query not found in SaveState:', ss.queryStates.activeQueryId, ss.queryStates.openQueryArray);
+      publisher.publishErrorToFrontend('Active query not found');
+      return;
+    }
+
+    const visualQuery = activeQueryInfo.graph; //ss.queries[0].graph;
     log.debug('Received query request:', message, headers, visualQuery);
     if (visualQuery.nodes.length === 0) {
       log.info('Empty query received');
@@ -128,7 +135,7 @@ export const queryServiceReader = async (frontendPublisher: RabbitMqBroker, mlPu
       return;
     }
 
-    const queryBuilderSettings = ss.queries.openQueryArray[activeQuery].settings; //ss.queries[0].settings;
+    const queryBuilderSettings = activeQueryInfo.settings; //ss.queries[0].settings;
     const ml = message.ml;
     const convertedQuery = Query2BackendQuery(ss.id, visualQuery, queryBuilderSettings, ml);
 
-- 
GitLab


From b6adb8b5ae4530bf6156ed73f176daa81c15f82b Mon Sep 17 00:00:00 2001
From: Leonardo <leomilho@gmail.com>
Date: Thu, 6 Feb 2025 16:39:47 +0100
Subject: [PATCH 5/5] feat: allow optionally to choose which query ID to use
 for query

---
 src/readers/queryService.ts | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/src/readers/queryService.ts b/src/readers/queryService.ts
index e94fa07..2179987 100644
--- a/src/readers/queryService.ts
+++ b/src/readers/queryService.ts
@@ -105,7 +105,16 @@ export const queryServiceReader = async (frontendPublisher: RabbitMqBroker, mlPu
       return;
     }
 
-    const activeQuery = ss.queryStates.activeQueryId;
+    let activeQuery = ss.queryStates.activeQueryId;
+    if (message.queryID) {
+      if (ss.queryStates.openQueryArray.find(q => q.id === message.queryID) == null) {
+        log.error('Query not found in SaveState:', message.queryID, ss.queryStates.openQueryArray);
+        publisher.publishErrorToFrontend('Query not found');
+        return;
+      }
+      activeQuery = message.queryID;
+    }
+
     if (activeQuery == null || activeQuery == -1) {
       log.error('No active query found in SaveState:', ss);
       publisher.publishErrorToFrontend('No active query found');
-- 
GitLab