Exemple #1
0
        /// <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);
        }
Exemple #2
0
        /// <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);
        }