Skip to content

Commit a85254c

Browse files
CopilotPressacco
andcommitted
Address code review feedback: fix null handling and extract magic numbers
Co-authored-by: Pressacco <5507864+Pressacco@users.noreply.github.com>
1 parent ba6b865 commit a85254c

File tree

2 files changed

+59
-33
lines changed

2 files changed

+59
-33
lines changed

Src/BlueDotBrigade.Weevil.Gui/Analysis/GraphViewModel.cs

Lines changed: 50 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ public class GraphViewModel : INotifyPropertyChanged
3030
private static readonly string FloatFormat = "0.000";
3131
private static readonly int MaxSeriesCount = 4;
3232
private static readonly string DefaultSeries2Suffix = " 2";
33+
private static readonly int MetricsPrecision = 3;
3334

3435
// Y-Axis position options for each series
3536
public static readonly string YAxisLeft = "Left";
@@ -862,35 +863,57 @@ private static ObservableCollection<SeriesMetrics> CalculateSeriesMetrics(
862863

863864
if (points.Any())
864865
{
865-
var values = points.Select(p => p.Value ?? 0.0).ToList();
866+
// Filter out null values to avoid skewing statistics
867+
var values = points
868+
.Where(p => p.Value.HasValue)
869+
.Select(p => p.Value.Value)
870+
.ToList();
866871
var timestamps = points.Select(p => p.DateTime).ToList();
867872

868-
var count = values.Count;
869-
var min = values.Min();
870-
var max = values.Max();
871-
var mean = values.Average();
872-
873-
// Calculate median
874-
var sortedValues = values.OrderBy(v => v).ToList();
875-
var mid = sortedValues.Count / 2;
876-
var median = (sortedValues.Count % 2 == 0)
877-
? (sortedValues[mid - 1] + sortedValues[mid]) / 2.0
878-
: sortedValues[mid];
879-
880-
var rangeStart = timestamps.Min();
881-
var rangeEnd = timestamps.Max();
882-
883-
var metrics = new SeriesMetrics(
884-
lineSeries.Name ?? "Unknown",
885-
count,
886-
min,
887-
max,
888-
Math.Round(mean, 3),
889-
Math.Round(median, 3),
890-
rangeStart,
891-
rangeEnd);
892-
893-
metricsList.Add(metrics);
873+
if (values.Any())
874+
{
875+
var count = values.Count;
876+
var min = values.Min();
877+
var max = values.Max();
878+
var mean = values.Average();
879+
880+
// Calculate median
881+
var sortedValues = values.OrderBy(v => v).ToList();
882+
var mid = sortedValues.Count / 2;
883+
var median = (sortedValues.Count % 2 == 0)
884+
? (sortedValues[mid - 1] + sortedValues[mid]) / 2.0
885+
: sortedValues[mid];
886+
887+
var rangeStart = timestamps.Min();
888+
var rangeEnd = timestamps.Max();
889+
890+
var metrics = new SeriesMetrics(
891+
lineSeries.Name ?? "Unknown",
892+
count,
893+
min,
894+
max,
895+
Math.Round(mean, MetricsPrecision),
896+
Math.Round(median, MetricsPrecision),
897+
rangeStart,
898+
rangeEnd);
899+
900+
metricsList.Add(metrics);
901+
}
902+
else
903+
{
904+
// All values were null
905+
var metrics = new SeriesMetrics(
906+
lineSeries.Name ?? "Unknown",
907+
0,
908+
null,
909+
null,
910+
null,
911+
null,
912+
null,
913+
null);
914+
915+
metricsList.Add(metrics);
916+
}
894917
}
895918
else
896919
{

Src/BlueDotBrigade.Weevil.Gui/Analysis/SeriesMetrics.cs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ namespace BlueDotBrigade.Weevil.Gui.Analysis
77
/// </summary>
88
public class SeriesMetrics
99
{
10+
private const string NumericFormat = "0.000";
11+
private const string DateTimeFormat = "yyyy-MM-dd HH:mm:ss";
12+
1013
public SeriesMetrics(
1114
string seriesName,
1215
int count,
@@ -39,11 +42,11 @@ public SeriesMetrics(
3942
/// <summary>
4043
/// Returns a formatted string representation suitable for display.
4144
/// </summary>
42-
public string MinFormatted => Min.HasValue ? Min.Value.ToString("0.000") : "N/A";
43-
public string MaxFormatted => Max.HasValue ? Max.Value.ToString("0.000") : "N/A";
44-
public string MeanFormatted => Mean.HasValue ? Mean.Value.ToString("0.000") : "N/A";
45-
public string MedianFormatted => Median.HasValue ? Median.Value.ToString("0.000") : "N/A";
46-
public string RangeStartFormatted => RangeStart.HasValue ? RangeStart.Value.ToString("yyyy-MM-dd HH:mm:ss") : "N/A";
47-
public string RangeEndFormatted => RangeEnd.HasValue ? RangeEnd.Value.ToString("yyyy-MM-dd HH:mm:ss") : "N/A";
45+
public string MinFormatted => Min.HasValue ? Min.Value.ToString(NumericFormat) : "N/A";
46+
public string MaxFormatted => Max.HasValue ? Max.Value.ToString(NumericFormat) : "N/A";
47+
public string MeanFormatted => Mean.HasValue ? Mean.Value.ToString(NumericFormat) : "N/A";
48+
public string MedianFormatted => Median.HasValue ? Median.Value.ToString(NumericFormat) : "N/A";
49+
public string RangeStartFormatted => RangeStart.HasValue ? RangeStart.Value.ToString(DateTimeFormat) : "N/A";
50+
public string RangeEndFormatted => RangeEnd.HasValue ? RangeEnd.Value.ToString(DateTimeFormat) : "N/A";
4851
}
4952
}

0 commit comments

Comments
 (0)