cvsimport
[hcoop/zz_old/portal.git] / qos.sml
diff --git a/qos.sml b/qos.sml
index 4d06332..ccdad10 100644 (file)
--- a/qos.sml
+++ b/qos.sml
@@ -42,4 +42,45 @@ fun recent days =
                               ORDER BY stamp DESC`)
     end
 
+type grade = { count : int, minutes : int }
+type grades = { pending : grade, closed : grade }
+type reportCard = { misc : grades,
+                   apt : grade,
+                   domain : grade,
+                   mailingList : grade,
+                   sec : grade }
+
+fun mkGradeRow [count, minutes] =
+    {count = C.intFromSql count,
+     minutes = if C.isNull minutes then 0 else C.intFromSql minutes}
+  | mkGradeRow row = rowError ("grade", row)
+
+fun reportCard days =
+    let
+       val db = getDb ()
+
+       fun gradeRow s = mkGradeRow (C.oneRow db s)
+
+       fun default tab =
+           gradeRow ($`SELECT COUNT(*), EXTRACT(MINUTE FROM AVG(cstamp - stamp))
+                         FROM ^tab
+                         WHERE stamp >= CURRENT_TIMESTAMP - interval '^(C.intToSql days) DAYS'
+                            AND cstamp IS NOT NULL`)
+    in
+       {misc = {pending = gradeRow
+                ($`SELECT COUNT(*), EXTRACT(MINUTE FROM AVG(COALESCE(pstamp, cstamp) - stamp))
+                     FROM SupIssue
+                      WHERE stamp >= CURRENT_TIMESTAMP - interval '^(C.intToSql days) DAYS'
+                        AND COALESCE(pstamp, cstamp) IS NOT NULL`),
+                closed = gradeRow
+                ($`SELECT COUNT(*), EXTRACT(MINUTE FROM AVG(cstamp - stamp))
+                     FROM SupIssue
+                     WHERE stamp >= CURRENT_TIMESTAMP - interval '^(C.intToSql days) DAYS'
+                        AND cstamp IS NOT NULL`)},
+        apt = default "Apt",
+        domain = default "Domain",
+        mailingList = default "MailingList",
+        sec = default "Sec"}
+    end
+
 end