/// <summary> /// Return the datasets with all data points quantized according to the time scale. /// </summary> /// <remarks> /// Quantizing the data points in this way will substantially improve the performance of Chart.js for large data sets. /// </remarks> private List <ChartJsTimeSeriesDataset> GetTimescaleDatasets() { var quantizedDatasets = new List <ChartJsTimeSeriesDataset>(); foreach (var dataset in this.Datasets) { var datapoints = dataset.DataPoints; var datasetQuantized = new ChartJsTimeSeriesDataset(); datasetQuantized.Name = dataset.Name; datasetQuantized.BorderColor = dataset.BorderColor; datasetQuantized.FillColor = dataset.FillColor; if (this.TimeScale == ChartJsTimeSeriesTimeScaleSpecifier.Month) { var quantizedDataPoints = datapoints .GroupBy(x => new { Month = new DateTime(x.DateTime.Year, x.DateTime.Month, 1) }) .Select(x => new ChartJsTimeSeriesDataPoint { DateTime = x.Key.Month, Value = x.Sum(y => y.Value) }) .OrderBy(x => x.DateTime) .ToList(); datasetQuantized.DataPoints = quantizedDataPoints.Cast <IChartJsTimeSeriesDataPoint>().ToList(); } else if (this.TimeScale == ChartJsTimeSeriesTimeScaleSpecifier.Year) { var quantizedDataPoints = datapoints .GroupBy(x => new { Year = new DateTime(x.DateTime.Year, 1, 1) }) .Select(x => new ChartJsTimeSeriesDataPoint { DateTime = x.Key.Year, Value = x.Sum(y => y.Value) }) .OrderBy(x => x.DateTime) .ToList(); datasetQuantized.DataPoints = quantizedDataPoints.Cast <IChartJsTimeSeriesDataPoint>().ToList(); } else { throw new NotImplementedException("Timescale is not implemented"); } quantizedDatasets.Add(datasetQuantized); } return(quantizedDatasets); }
/// <summary> /// Gets a configured factory that creates the data required for the chart. /// </summary> /// <param name="summary">The summary.</param> /// <returns></returns> /// <exception cref="NotImplementedException"></exception> private ChartJsTimeSeriesDataFactory <ChartJsTimeSeriesDataPoint> GetChartJsFactory(List <SummaryInfo> summary, TimePeriod timePeriod) { var dateRange = timePeriod.GetDateRange(); ChartJsTimeSeriesTimeScaleSpecifier chartTimeScale = timePeriod.TimeUnit == TimePeriodUnitSpecifier.Year ? ChartJsTimeSeriesTimeScaleSpecifier.Month : ChartJsTimeSeriesTimeScaleSpecifier.Day; var factory = new ChartJsTimeSeriesDataFactory <ChartJsTimeSeriesDataPoint>(); factory.TimeScale = chartTimeScale; factory.StartDateTime = dateRange.Start; factory.EndDateTime = dateRange.End; factory.ChartStyle = ChartJsTimeSeriesChartStyleSpecifier.Line; factory.ChartColors = new List <string> { "#2ECC71", "#3498DB" }; var viewsSummary = summary.Where(m => m.DatasetName == VIEWS_DATASET_NAME); var completionSummary = summary.Where(m => m.DatasetName == COMPLETIONS_DATASET_NAME); var viewedDataset = new ChartJsTimeSeriesDataset(); viewedDataset.Name = VIEWS_DATASET_NAME; viewedDataset.DataPoints = viewsSummary .Select(m => new ChartJsTimeSeriesDataPoint { DateTime = m.InterationDateTime, Value = m.value }) .Cast <IChartJsTimeSeriesDataPoint>() .ToList(); var completionDataset = new ChartJsTimeSeriesDataset(); completionDataset.Name = COMPLETIONS_DATASET_NAME; completionDataset.DataPoints = completionSummary .Select(m => new ChartJsTimeSeriesDataPoint { DateTime = m.InterationDateTime, Value = m.value }) .Cast <IChartJsTimeSeriesDataPoint>() .ToList(); factory.Datasets.Add(completionDataset); factory.Datasets.Add(viewedDataset); return(factory); }