[#30] WineQualityStatistics: Add number of deliveries
This commit is contained in:
		@@ -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<string, (int Oe, int Weight)[]> 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<string, (int Oe, int Num, int Weight)[]> Data);
 | 
			
		||||
 | 
			
		||||
        public QualitySection[] Sections;
 | 
			
		||||
 | 
			
		||||
@@ -21,8 +21,8 @@ namespace Elwig.Models.Dtos {
 | 
			
		||||
 | 
			
		||||
        private static QualitySection[] GetQualitySections(IEnumerable<QualityRow> rows) {
 | 
			
		||||
            var data = new List<QualitySection>();
 | 
			
		||||
            var currentQual = new Dictionary<int, int>();
 | 
			
		||||
            var current = new Dictionary<string, (int, int)[]>();
 | 
			
		||||
            var currentQual = new Dictionary<int, (int Num, int Weight)>();
 | 
			
		||||
            var current = new Dictionary<string, (int, int, int)[]>();
 | 
			
		||||
            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();
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user