protected virtual GeckoLineChart BuildLinechartData(LineChartArgs args, IEnumerable <LineChartData> sourceData, List <DateTime> xAxis, GeckoValues yAxis) { var data = new GeckoLineChart(); for (var i = 0; i < sourceData.Count(); i++) { if (i != 0 && (i % args.Sample != 0)) { continue; } // start at the newest and work backwards var j = sourceData.Count() - i - 1; var lci = sourceData.ElementAt(j); xAxis.Add(lci.When); yAxis.Add(lci.Value); data.Item.Add(Scale(lci.Value, args.ScaleUp, args.ScaleDown, args.DecimalPlaces).ToString()); } // finally reverse the data order oldest->newest data.Item.Reverse(); return(data); }
public void LinechartMinuteCheckRateNoData() { var args = new LineChartArgs { MaxItems = 60, Limit = 60, Check = "Test", Unit = "minute", DataOperation = DataOperationType.Count, Outcome = OutcomeType.Any, DecimalPlaces = 0, EndDate = new DateTime(2011, 04, 11, 12, 0, 0) }; using (var domain = new GeckoboardDataServiceLinechartDomain(args)) { Feature.WithScenario("There is no minute monitorwang data for the args specified") .Given(domain.ThereIsNoData) .When(domain.TheLinechartCheckRateMethodIsInvoked) .Then(domain.TheResultIsNotNull) .And(domain.TheResultSettingsIsNotNull) .And(domain.TheResultContains_Items, Math.Min(args.Limit, args.MaxItems)) .And(domain.AllTheResultsAreZero) .And(domain.TheSettingsXAxisHasThreeValues) .And(domain.TheSettingsXAxisHas_AsTheMinValue, "11:01") .And(domain.TheSettingsXAxisHas_AsTheMaxValue, "12:00") .ExecuteWithReport(); } }
public void LinechartDayCheckRateNoData() { var args = new LineChartArgs { MaxItems = 20, Limit = 10, Check = "Test", Unit = "day", DataOperation = DataOperationType.Count, Outcome = OutcomeType.Any, DecimalPlaces = 0, EndDate = new DateTime(2011, 04, 11, 12, 0, 0) }; using (var domain = new GeckoboardDataServiceLinechartDomain(args)) { var xMin = args.EndDate.Subtract(TimeSpan.FromDays(args.Limit - 1)); xMin = new DateTime(xMin.Year, xMin.Month, xMin.Day, 0, 0, 0); var xMax = new DateTime(args.EndDate.Year, args.EndDate.Month, args.EndDate.Day, 0, 0, 0); Feature.WithScenario("There is no daily monitorwang data for the args specified") .Given(domain.ThereIsNoData) .When(domain.TheLinechartCheckRateMethodIsInvoked) .Then(domain.TheResultIsNotNull) .And(domain.TheResultSettingsIsNotNull) .And(domain.TheResultContains_Items, Math.Min(args.Limit, args.MaxItems)) .And(domain.AllTheResultsAreZero) .And(domain.TheSettingsXAxisHasThreeValues) .And(domain.TheSettingsXAxisHas_AsTheMinValue, xMin.ToString(GeckoboardDataServiceImpl.Linechart.X_Axis_DateFormat)) .And(domain.TheSettingsXAxisHas_AsTheMaxValue, xMax.ToString(GeckoboardDataServiceImpl.Linechart.X_Axis_DateFormat)) .ExecuteWithReport(); } }
public void LinechartDayLimitGreaterThanMaxItem() { var args = new LineChartArgs { MaxItems = 10, Limit = 20, Check = "Test", Unit = "day", DataOperation = DataOperationType.Count, Outcome = OutcomeType.Any, DecimalPlaces = 0, EndDate = new DateTime(2011, 04, 11, 12, 0, 0) }; using (var domain = new GeckoboardDataServiceLinechartDomain(args)) { var xMin = new DateTime(2011, 03, 24, 0, 0, 0); var xMax = new DateTime(args.EndDate.Year, args.EndDate.Month, args.EndDate.Day, 0, 0, 0); Feature.WithScenario("There are more items requested than the max allowed") .Given(domain.ThereIsNoData) .When(domain.TheLinechartCheckRateMethodIsInvoked) .Then(domain.TheResultIsNotNull) .And(domain.TheResultSettingsIsNotNull) .And(domain.TheResultContains_Items, Math.Min(args.Limit, args.MaxItems)) .And(domain.AllTheResultsAreZero) .And(domain.TheSampleIsEvery_Items, 2) .And(domain.TheSettingsXAxisHasThreeValues) .And(domain.TheSettingsXAxisHas_AsTheMinValue, xMin.ToString(GeckoboardDataServiceImpl.Linechart.X_Axis_DateFormat)) .And(domain.TheSettingsXAxisHas_AsTheMaxValue, xMax.ToString(GeckoboardDataServiceImpl.Linechart.X_Axis_DateFormat)) .ExecuteWithReport(); } }
public GeckoLineChart GetGeckoboardLineChartForCheckRate(LineChartArgs args) { GeckoLineChart data = null; try { var yAxis = new GeckoValues(); var xAxis = new List <DateTime>(); CalculateLinechartSample(args); DateTime oldestDate; DateTime newestDate; CalculateLinechartDateRange(args, out oldestDate, out newestDate); // get the actual data from the provider and a "zero set" - a set // of zero values for the entire date range var dbData = myDataProvider.GetLineChartDataForCheckRate(args); var zeroData = GenerateLinechartZeroSet(args, oldestDate, newestDate); // merge the two data sets, using the actual data value where // available, otherwise use a zero value var mergedData = MergeLinechartData(dbData, zeroData); data = BuildLinechartData(args, mergedData, xAxis, yAxis); CalculateLinechartSettings(args, data, yAxis, xAxis); } catch (Exception ex) { Logger.Error(Logger.Event.During("GetGeckoboardLineChartForCheckRate") .Encountered(ex)); throw; } return(data); }
public void LinechartMinuteDataCorrectDecimalPlaces() { var args = new LineChartArgs { MaxItems = 10, Limit = 10, Check = "Test", Unit = "minute", DataOperation = DataOperationType.Count, Outcome = OutcomeType.Any, DecimalPlaces = 2, EndDate = new DateTime(2011, 04, 11, 12, 0, 0) }; using (var domain = new GeckoboardDataServiceLinechartDomain(args)) { var data = new List <LineChartData> { new LineChartData { Value = 100.123, When = args.EndDate.Subtract(TimeSpan.FromMinutes(2)) }, new LineChartData { Value = 200.123, When = args.EndDate.Subtract(TimeSpan.FromMinutes(3)) }, new LineChartData { Value = 1000.123, When = args.EndDate.Subtract(TimeSpan.FromMinutes(5)) }, }; Feature.WithScenario("Data values have the correct number of decimal places") .Given(domain.ThisDataIsAvailable, data) .When(domain.TheLinechartCheckRateMethodIsInvoked) .Then(domain.TheResultIsNotNull) .And(domain.TheResultSettingsIsNotNull) .And(domain.TheResultContains_Items, Math.Min(args.Limit, args.MaxItems)) .And(domain.TheSampleIsEvery_Items, 1) .And(domain.TheSettingsXAxisHasThreeValues) .And(domain.TheSettingsYAxisHasThreeValues) .And(domain.TheSettingsYAxisHas_AsTheMinValue, "0") .And(domain.TheSettingsYAxisHas_AsTheMaxValue, "1000") .And(domain.TheItemAtIndex_Has_Value, 4, "1000.12") .And(domain.TheItemAtIndex_Has_Value, 6, "200.12") .And(domain.TheItemAtIndex_Has_Value, 7, "100.12") .ExecuteWithReport(); } }
public void LinechartMinuteDataOutsideLimitRange() { var args = new LineChartArgs { MaxItems = 10, Limit = 10, Check = "Test", Unit = "minute", DataOperation = DataOperationType.Count, Outcome = OutcomeType.Any, DecimalPlaces = 2, EndDate = new DateTime(2011, 04, 11, 12, 0, 0) }; using (var domain = new GeckoboardDataServiceLinechartDomain(args)) { var data = new List <LineChartData> { new LineChartData { Value = 100.123, When = args.EndDate.Subtract(TimeSpan.FromMinutes(2000)) }, new LineChartData { Value = 200.123, When = args.EndDate.Subtract(TimeSpan.FromMinutes(3000)) }, new LineChartData { Value = 1000.123, When = args.EndDate.Subtract(TimeSpan.FromMinutes(5000)) }, }; Feature.WithScenario("Minute data is available but outside the requested range") .Given(domain.ThisDataIsAvailable, data) .When(domain.TheLinechartCheckRateMethodIsInvoked) .Then(domain.TheResultIsNotNull) .And(domain.TheResultSettingsIsNotNull) .And(domain.TheResultContains_Items, Math.Min(args.Limit, args.MaxItems)) .And(domain.TheSampleIsEvery_Items, 1) .And(domain.TheSettingsXAxisHasThreeValues) .And(domain.TheSettingsYAxisHasThreeValues) .And(domain.TheSettingsYAxisHas_AsTheMinValue, "0") .And(domain.TheSettingsYAxisHas_AsTheMaxValue, "0") .And(domain.AllTheResultsAreZero) .ExecuteWithReport(); } }
protected virtual IEnumerable <LineChartData> GenerateLinechartZeroSet(LineChartArgs args, DateTime oldestDate, DateTime newestDate) { const double value = 0; var data = new List <LineChartData>(); switch (args.Unit.ToLowerInvariant()) { case "day": for (var i = args.Limit - 1; i >= 0; i--) { var baseDate = newestDate.Subtract(TimeSpan.FromDays(i)); data.Add(new LineChartData { Value = value, When = new DateTime(baseDate.Year, baseDate.Month, baseDate.Day) }); } break; case "hour": for (var i = args.Limit - 1; i >= 0; i--) { var baseDate = newestDate.Subtract(TimeSpan.FromHours(i)); data.Add(new LineChartData { Value = value, When = new DateTime(baseDate.Year, baseDate.Month, baseDate.Day, baseDate.Hour, 0, 0) }); } break; default: for (var i = args.Limit - 1; i >= 0; i--) { var baseDate = newestDate.Subtract(TimeSpan.FromMinutes(i)); data.Add(new LineChartData { Value = value, When = new DateTime(baseDate.Year, baseDate.Month, baseDate.Day, baseDate.Hour, baseDate.Minute, 0) }); } break; } return(data); }
protected void CalculateLinechartSample(LineChartArgs args) { if ((args.Limit / args.Sample) <= args.MaxItems) { return; } var s = (Convert.ToDouble(args.Limit) / Convert.ToDouble(args.MaxItems)); var newSample = Math.Ceiling(s); args.Sample = Convert.ToInt32(newSample); Logger.Debug("Calculated sample freq. based on {0} limit: sample every {1} items", args.Limit, args.Sample); }
protected void CalculateLinechartSettings(LineChartArgs args, GeckoLineChart data, GeckoValues yAxis, List <DateTime> xAxis) { var minY = args.ScaleY ? Scale(yAxis.Min(), args.ScaleUp, args.ScaleDown, args.ScaleYDecimalPlaces) : Scale(yAxis.Min(), 1, 1, args.ScaleYDecimalPlaces); var midY = args.ScaleY ? Scale(yAxis.Mid(), args.ScaleUp, args.ScaleDown, args.ScaleYDecimalPlaces) : Scale(yAxis.Mid(), 1, 1, args.ScaleYDecimalPlaces); var maxY = args.ScaleY ? Scale(yAxis.Max(), args.ScaleUp, args.ScaleDown, args.ScaleYDecimalPlaces) : Scale(yAxis.Max(), 1, 1, args.ScaleYDecimalPlaces); var colourKey = string.Format("linechart.{0}.{1}", args.Site, args.Check); data.Settings.Colour = myColourPicker.Next(colourKey).ToString(); data.Settings.Y.Add(minY.ToString()); data.Settings.Y.Add(midY.ToString()); data.Settings.Y.Add(maxY.ToString()); var minDate = xAxis.Min(); var maxDate = xAxis.Max(); if (maxDate.Subtract(minDate).TotalDays < 1) { data.Settings.X.Add(minDate.ToShortTimeString()); data.Settings.X.Add(minDate.AddMinutes( maxDate.Subtract(minDate).TotalMinutes / 2).ToShortTimeString()); data.Settings.X.Add(maxDate.ToShortTimeString()); } else { var midMins = maxDate.Subtract(minDate).TotalMinutes / 2; var midDate = maxDate.Subtract(TimeSpan.FromMinutes(midMins)); data.Settings.X.Add(minDate.ToString(Linechart.X_Axis_DateFormat)); data.Settings.X.Add(midDate.ToString(Linechart.X_Axis_DateFormat)); data.Settings.X.Add(maxDate.ToString(Linechart.X_Axis_DateFormat)); } }
/// <summary> /// This will calculate the date range we are generating the linechart for /// </summary> /// <param name="args"></param> /// <param name="oldestDate"></param> /// <param name="newestDate"></param> /// <returns></returns> protected void CalculateLinechartDateRange(LineChartArgs args, out DateTime oldestDate, out DateTime newestDate) { newestDate = args.EndDate; // work out the range switch (args.Unit.ToLowerInvariant()) { case "day": oldestDate = newestDate.Subtract(TimeSpan.FromDays(args.Limit)); break; case "hour": oldestDate = newestDate.Subtract(TimeSpan.FromHours(args.Limit)); break; default: oldestDate = newestDate.Subtract(TimeSpan.FromMinutes(args.Limit)); break; } }
public GeckoboardDataServiceLinechartDomain(LineChartArgs args) : this() { myArgs = args; }