X-Git-Url: https://git.hcoop.net/hcoop/portal.git/blobdiff_plain/a75ed94bb4d8801149d1eff968bcd1d9163c3971..HEAD:/qos.sml diff --git a/qos.sml b/qos.sml index 4d06332..ccdad10 100644 --- 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