瀏覽代碼

Server: Reduced data entries sent out by endpoint GET /services/{:serverId}/{:serviceId}/data

Christian Kahlau 3 年之前
父節點
當前提交
7525db1800
共有 1 個文件被更改,包括 49 次插入9 次删除
  1. 49 9
      server/src/ctrl/database.class.ts

+ 49 - 9
server/src/ctrl/database.class.ts

@@ -418,16 +418,56 @@ export class Database extends SQLiteController {
   async queryServiceCheckData(serverID: number, confID: number, from: Date, to: Date) {
     const result = await this.stmt(
       `
-      SELECT 
-        HealthCheckDataEntry.*
-      FROM HealthCheckDataEntry
-      JOIN HealthCheckConfig ON HealthCheckConfig.ID = HealthCheckDataEntry.ConfigID
+      SELECT DataEntryChanges.*
+      FROM HealthCheckConfig
+      JOIN (
+        SELECT * FROM (
+          SELECT 
+            *
+          FROM HealthCheckDataEntry
+          WHERE ConfigID = ?
+          AND Timestamp BETWEEN ? AND ?
+          ORDER BY ID
+          LIMIT 0, 1
+        ) AS FIRST_STATE
+
+        UNION --+--+--
+
+        SELECT 
+          ID,
+          ConfigID,
+          Timestamp,
+          Status,
+          Message
+        FROM
+        (
+          SELECT 
+            HealthCheckDataEntry.*, 
+            LAG(Status) OVER (ORDER BY ConfigID, Timestamp) AS previous_state, 
+            LAG(Message) OVER (ORDER BY ConfigID, Timestamp) AS previous_msg
+          FROM HealthCheckDataEntry
+          WHERE ConfigID = ?
+        )
+        WHERE Status <> previous_state
+        AND Message <> previous_msg
+        
+        UNION --+--+--
+        
+        SELECT * FROM (
+          SELECT 
+            *
+          FROM HealthCheckDataEntry
+          WHERE ConfigID = ?
+          AND Timestamp BETWEEN ? AND ?
+          ORDER BY ID DESC
+          LIMIT 0, 1
+        ) AS LAST_STATE
+        ORDER BY ConfigID, Timestamp
+      ) AS DataEntryChanges ON DataEntryChanges.ConfigID = HealthCheckConfig.ID
       WHERE HealthCheckConfig.ServerID = ?
-        AND HealthCheckDataEntry.ConfigID = ?
-        AND HealthCheckDataEntry.Timestamp BETWEEN ? AND ?
-      ORDER BY Timestamp, ID;
-    `,
-      [serverID, confID, from.getTime(), to.getTime()]
+        AND DataEntryChanges.Timestamp BETWEEN ? AND ?
+      ORDER BY Timestamp, ID;`,
+      [confID, from.getTime(), to.getTime(), confID, confID, from.getTime(), to.getTime(), serverID, from.getTime(), to.getTime()]
     );
 
     const mapByTimestamp = result.rows.reduce((res: Map<number, ServiceCheckDataEntry[]>, row) => {