public async Task <IActionResult> Lifetime(int start, int end, int interval, CancellationToken token) { if (start == 0 || end == 0 || interval == 0) { Response.StatusCode = 400; return(Json(null)); } var scaling = new ChartScaling(start, end, interval); return(Json(await GetData( Mgmtsvc, @"SELECT Name as n, FLOOR(UNIX_TIMESTAMP(EndTime) - UNIX_TIMESTAMP(StartTime)) as d, Count(Id) as c FROM joyoi_mgmtsvc.statemachineinstances WHERE UNIX_TIMESTAMP(StartTime) >= @start AND UNIX_TIMESTAMP(StartTime) <= @end GROUP BY d, n ", scaling, (rows) => { var max_scale = 60; var rows_tuple = rows.Select(d => { Int64 duration = 0; Int64.TryParse(d["d"].ToString(), out duration); return (d["n"].ToString(), duration, Convert.ToDouble(d["c"])); }).ToList();
public async Task <IActionResult> Created(int start, int end, int interval, int timezoneoffset, CancellationToken token) { if (start == 0 || end == 0 || interval == 0) { Response.StatusCode = 400; return(Json(null)); } var scaling = new ChartScaling(start, end, interval); return(Json(await GetData( Mgmtsvc, @"SELECT Name as n, FLOOR(UNIX_TIMESTAMP(StartTime) / @interval) * @interval as t, Count(Id) as c FROM joyoi_mgmtsvc.statemachineinstances WHERE UNIX_TIMESTAMP(StartTime) >= @start AND UNIX_TIMESTAMP(StartTime) <= @end GROUP BY n, t HAVING t >= @start AND t <= @end ORDER BY t DESC", scaling, GroupingLineChartRowFn(scaling, timezoneoffset, "新建的状态机"), token ))); }
public async Task <IActionResult> Chart(int start, int end, int interval, int timezoneoffset, CancellationToken token) { if (start == 0 || end == 0 || interval == 0) { Response.StatusCode = 400; return(Json(null)); } var scaling = new ChartScaling(start, end, interval); return(Json(await GetData( Judge, @"SELECT Result as n, FLOOR(UNIX_TIMESTAMP(Time) / @interval) * @interval as t, Count(Id) as c FROM joyoi_oj.hackstatuses WHERE UNIX_TIMESTAMP(Time) >= @start AND UNIX_TIMESTAMP(Time) <= @end GROUP BY n, t HAVING t >= @start AND t <= @end ORDER BY t DESC", scaling, (rows) => { var chart_data = (GroupingLineChartRowFn(scaling, timezoneoffset, "Hack 结果"))(rows); chart_data.Data.Datasets = chart_data.Data.Datasets.Select(d => { var val = Convert.ToInt32(d.Label); d.Label = ((HackResult)val).ToString(); return d; }) .ToList(); return chart_data; }, token ))); }
public async Task <IActionResult> List(string db, int start, int end, int timezoneoffset, CancellationToken token) { if (start == 0 || end == 0 || db.Equals("")) { Response.StatusCode = 400; return(Json(null)); } var scaling = new ChartScaling(start, end, 1); return(Json(await GetData( db, @"SELECT UserName, ActiveTime FROM aspnetusers WHERE UNIX_TIMESTAMP(ActiveTime) >= @start AND UNIX_TIMESTAMP(ActiveTime) <= @end ORDER BY ActiveTime DESC", scaling, (rows) => rows, token ))); }
protected async Task <Object> GetData( string database, string sql, ChartScaling scale, Func <IEnumerable <IDictionary <string, object> >, Object> proc_rows, CancellationToken token ) { var query_data = new List <Dictionary <string, object> >(); using (var conn = new MySqlConnection(Startup.Config["Datasource"])) { await conn.OpenAsync(token); await conn.ChangeDatabaseAsync(database, token); using (var cmd = new MySqlCommand(sql, conn)) { cmd.Parameters.Add(new MySqlParameter("points", scale.Points)); cmd.Parameters.Add(new MySqlParameter("interval", scale.Interval)); cmd.Parameters.Add(new MySqlParameter("start", scale.Start)); cmd.Parameters.Add(new MySqlParameter("end", scale.End)); using (var dr = await cmd.ExecuteReaderAsync(token)) { while (await dr.ReadAsync(token)) { var row = new Dictionary <string, object>(); for (var i = 0; i < dr.FieldCount; i++) { row.Add(dr.GetName(i), dr.GetValue(i)); } query_data.Add(row); } } } } return(proc_rows(query_data)); }
public async Task <IActionResult> Chart(int start, int end, int interval, int timezoneoffset, CancellationToken token) { if (start == 0 || end == 0 || interval == 0) { Response.StatusCode = 400; return(Json(null)); } var scaling = new ChartScaling(start, end, interval); return(Json(await GetData( Forum, @"SELECT FLOOR(UNIX_TIMESTAMP(CreationTime) / @interval) * @interval as t, Count(Id) as c FROM joyoi_forum.threads GROUP BY t HAVING t >= @start AND t <= @end ORDER BY t DESC LIMIT 0, @points", scaling, this.DefaultLineChartRowFn(scaling, timezoneoffset, "新主题"), token ))); }
public async Task <IActionResult> Size(int start, int end, int interval, CancellationToken token) { if (start == 0 || end == 0 || interval == 0) { Response.StatusCode = 400; return(Json(null)); } var scaling = new ChartScaling(start, end, interval); return(Json(await GetData( Mgmtsvc, @"SELECT FLOOR(OCTET_LENGTH(body) / 1024) * 1024 as s, Count(Id) as c FROM joyoi_mgmtsvc.blobs WHERE UNIX_TIMESTAMP(CreateTime) >= @start AND UNIX_TIMESTAMP(CreateTime) <= @end GROUP BY s", scaling, (rows) => { var tiers = new List <int>() { 1024, 1024 * 1024, 1024 * 1024 * 10 }; var buckets = Enumerable.Repeat((double)0, tiers.Count + 1).ToList(); var rows_tuple = rows.Select(d => (Convert.ToInt64(d["s"]), Convert.ToDouble(d["c"]))); foreach ((Int64, double)t in rows_tuple) { int bucket_idx = 0; foreach (int tier in tiers) { if (t.Item1 < tier) { buckets[bucket_idx] += t.Item1; goto NEXT; } bucket_idx++; } buckets[bucket_idx] += t.Item1; NEXT:; } var labels = tiers.Select(x => x.ToString()).ToList(); labels.Add(">10M"); return new Chart { Title = "二进制数据大小", Type = "bar", Data = new ChartData { Labels = labels, Datasets = new List <ChartDataSet>() { new ChartDataSet { Data = buckets, BackgroundColor = RandomColorHex() } } } }; },
public async Task <IActionResult> Ongoing(int start, int end, int interval, int timezoneoffset, CancellationToken token) { if (start == 0 || end == 0 || interval == 0) { Response.StatusCode = 400; return(Json(null)); } var scaling = new ChartScaling(start, end, interval); return(Json(await GetData( Judge, @"SELECT UNIX_TIMESTAMP(Begin) AS s, UNIX_TIMESTAMP(ADDTIME(Begin, Duration)) AS e FROM joyoi_oj.contests WHERE Begin >= DATE_ADD(FROM_UNIXTIME(@start), interval - 30 day) AND Begin < FROM_UNIXTIME(@end) AND ADDTIME(Begin, Duration) > FROM_UNIXTIME(@start)", scaling, (rows) => { string color = "#008b00"; string title = "正在进行的比赛"; var rows_tuple = rows .Select(d => (Convert.ToInt64(d["s"]), Convert.ToInt64(d["e"]))).ToList(); var labels = FillMissingAndSort(new List <(long, double)>(), scaling).Select(x => x.Item1); var values = labels.Select(l => { var r_start = l; var r_end = l + scaling.Interval; var count = 0; foreach ((long, long)row in rows_tuple) { if (row.Item2 >= r_start && row.Item1 <= r_end) { count++; } } return count; }) .Select(i => (double)i); var datasets = new List <ChartDataSet>() { new ChartDataSet { Label = title, Data = values, Fill = false, BackgroundColor = color, BorderColor = color } }; return new Chart { Title = title, Type = "line", Data = new ChartData { Labels = labels.Select(t => ConvertTime(t, timezoneoffset)).ToList(), Datasets = datasets }, Options = new { Scales = TimeScaleOption() } }; },