diff --git a/Elwig/Documents/WineQualityStatistics.cshtml b/Elwig/Documents/WineQualityStatistics.cshtml
index 9ec508d..5cb1fb2 100644
--- a/Elwig/Documents/WineQualityStatistics.cshtml
+++ b/Elwig/Documents/WineQualityStatistics.cshtml
@@ -27,14 +27,16 @@
[°Oe]
+ [#]
[kg]
@foreach (var qualId in qualIds) {
@(Model.QualityLevels.GetValueOrDefault(qualId, qualId))
- @foreach (var (oe, weight) in sec.Data.GetValueOrDefault(qualId, Array.Empty<(int, int)>())) {
+ @foreach (var (oe, num, weight) in sec.Data.GetValueOrDefault(qualId, Array.Empty<(int, int, int)>())) {
@oe
- @($"{weight:N0}")
+ @($"{num:N0}")
+ @($"{weight:N0}")
}
}
@@ -43,13 +45,15 @@
|
@foreach (var qualIds in Model.QualIds) {
- var quals = qualIds.Select(q => sec.Data.GetValueOrDefault(q, Array.Empty<(int, int)>()));
- var weight = quals.Sum(q => q.Sum(kv => kv.Item2));
- var oe = quals.Sum(q => q.Sum(kv => (double)kv.Item1 * kv.Item2)) / weight;
+ var quals = qualIds.Select(q => sec.Data.GetValueOrDefault(q, Array.Empty<(int Oe, int Num, int Weight)>()));
+ var weight = quals.Sum(q => q.Sum(kv => kv.Weight));
+ var num = quals.Sum(q => q.Sum(kv => kv.Num));
+ var oe = quals.Sum(q => q.Sum(kv => (double)kv.Oe * kv.Weight)) / weight;
- @(weight == 0 ? "" : $"{oe:N0}")
- @($"{weight:N0}")
+ @(weight == 0 ? "-" : $"{oe:N0}")
+ @($"{num:N0}")
+ @($"{weight:N0}")
|
}
@@ -59,12 +63,14 @@
@{
var totalWeight = sec.Data.Values.Sum(q => q.Sum(kv => kv.Weight));
+ var totalNum = sec.Data.Values.Sum(q => q.Sum(kv => kv.Num));
var totalOe = sec.Data.Values.Sum(q => q.Sum(kv => (double)kv.Oe * kv.Weight)) / totalWeight;
}
diff --git a/Elwig/Documents/WineQualityStatistics.css b/Elwig/Documents/WineQualityStatistics.css
index 1fe5451..972691f 100644
--- a/Elwig/Documents/WineQualityStatistics.css
+++ b/Elwig/Documents/WineQualityStatistics.css
@@ -88,6 +88,9 @@ table .footer.green {
text-align: center;
}
-.weight {
+.number {
text-align: right;
}
+
+.row span:first-child { flex-basis: 7.5mm; }
+.row span:last-child { flex-basis: 15mm; }
diff --git a/Elwig/Models/Dtos/WineQualityStatisticsData.cs b/Elwig/Models/Dtos/WineQualityStatisticsData.cs
index b76b19b..c4a503e 100644
--- a/Elwig/Models/Dtos/WineQualityStatisticsData.cs
+++ b/Elwig/Models/Dtos/WineQualityStatisticsData.cs
@@ -10,8 +10,8 @@ using System.Windows;
namespace Elwig.Models.Dtos {
public class WineQualityStatisticsData {
- public record struct QualityRow(string? Variety, string? Attribute, string? Cultivation, string? Type, string QualId, int Oe, int Weight);
- public record struct QualitySection(string Name, string? Type, Dictionary Data);
+ public record struct QualityRow(string? Variety, string? Attribute, string? Cultivation, string? Type, string QualId, int Oe, int Num, int Weight);
+ public record struct QualitySection(string Name, string? Type, Dictionary Data);
public QualitySection[] Sections;
@@ -21,8 +21,8 @@ namespace Elwig.Models.Dtos {
private static QualitySection[] GetQualitySections(IEnumerable rows) {
var data = new List();
- var currentQual = new Dictionary();
- var current = new Dictionary();
+ var currentQual = new Dictionary();
+ var current = new Dictionary();
string? lastSection = null;
string? lastType = null;
string? lastQual = null;
@@ -31,25 +31,25 @@ namespace Elwig.Models.Dtos {
$"{(row.Attribute != null ? " / " : "")}{row.Attribute}" +
$"{(row.Cultivation != null ? " / " : "")}{row.Cultivation}";
if (lastQual != null && lastQual != row.QualId) {
- current[lastQual] = currentQual.Select(kv => (kv.Key, kv.Value)).ToArray();
+ current[lastQual] = currentQual.Select(kv => (kv.Key, kv.Value.Num, kv.Value.Weight)).ToArray();
currentQual.Clear();
}
if (lastSection != null && lastSection != sec) {
if (!current.ContainsKey(lastQual!)) {
- current[lastQual!] = currentQual.Select(kv => (kv.Key, kv.Value)).ToArray();
+ current[lastQual!] = currentQual.Select(kv => (kv.Key, kv.Value.Num, kv.Value.Weight)).ToArray();
currentQual.Clear();
}
data.Add(new(lastSection, lastType, current));
current = [];
currentQual.Clear();
}
- currentQual[row.Oe] = row.Weight;
+ currentQual[row.Oe] = (row.Num, row.Weight);
lastSection = sec;
lastType = row.Type;
lastQual = row.QualId;
}
if (lastQual != null) {
- current[lastQual] = currentQual.Select(kv => (kv.Key, kv.Value)).ToArray();
+ current[lastQual] = currentQual.Select(kv => (kv.Key, kv.Value.Num, kv.Value.Weight)).ToArray();
currentQual.Clear();
}
if (lastSection != null) {
@@ -69,14 +69,14 @@ namespace Elwig.Models.Dtos {
Cultivation = p.Cultivation!.Name,
p.QualId,
Oe = (int)Math.Round(p.Kmw * (4.54 + 0.022 * p.Kmw), 0),
- }, (k, g) => new { Key = k, Weight = g.Sum(p => p.Weight) })
+ }, (k, g) => new { Key = k, Num = g.Count(), Weight = g.Sum(p => p.Weight) })
.OrderBy(g => g.Key.Variety)
.ThenBy(g => g.Key.Attribute)
.ThenBy(g => g.Key.Cultivation)
.ThenBy(g => g.Key.QualId)
.ThenBy(g => g.Key.Oe)
.ToListAsync())
- .Select(r => new QualityRow(r.Key.Variety, r.Key.Attribute, r.Key.Cultivation, r.Key.Type, r.Key.QualId, r.Key.Oe, r.Weight))
+ .Select(r => new QualityRow(r.Key.Variety, r.Key.Attribute, r.Key.Cultivation, r.Key.Type, r.Key.QualId, r.Key.Oe, r.Num, r.Weight))
.ToList();
var data = GetQualitySections(rows);
@@ -84,7 +84,7 @@ namespace Elwig.Models.Dtos {
return new(data);
var typeRows = rows
- .GroupBy(s => new { s.Type, s.QualId, s.Oe }, (k, g) => new QualityRow(null, null, null, k.Type, k.QualId, k.Oe, g.Sum(p => p.Weight)))
+ .GroupBy(s => new { s.Type, s.QualId, s.Oe }, (k, g) => new QualityRow(null, null, null, k.Type, k.QualId, k.Oe, g.Sum(g => g.Num), g.Sum(p => p.Weight)))
.OrderBy(g => g.Type)
.ThenBy(g => g.QualId)
.ThenBy(g => g.Oe)
@@ -94,7 +94,7 @@ namespace Elwig.Models.Dtos {
return new([.. typeData, .. data]);
var totalRows = rows
- .GroupBy(s => new { s.QualId, s.Oe }, (k, g) => new QualityRow(null, null, null, null, k.QualId, k.Oe, g.Sum(p => p.Weight)))
+ .GroupBy(s => new { s.QualId, s.Oe }, (k, g) => new QualityRow(null, null, null, null, k.QualId, k.Oe, g.Sum(p => p.Num), g.Sum(p => p.Weight)))
.OrderBy(g => g.QualId)
.ThenBy(g => g.Oe)
.ToList();