refactor(shortcodes): %СВЯЗЬ% теперь возвращает самое популярное значение вместо первого

This commit is contained in:
Mikhail Kuznetsov
2026-05-26 10:35:11 +10:00
parent f3183e5f68
commit f5e9c036f6

View File

@@ -54,7 +54,6 @@ internal class RelationshipUnitShortcodeHandler : IShortcodeHandler
private async Task<string> GetRelValueAsync(TemplateForShortcode template, string fieldName, string caller, CancellationToken ct) private async Task<string> GetRelValueAsync(TemplateForShortcode template, string fieldName, string caller, CancellationToken ct)
{ {
// Оркестратор гарантирует наличие данных согласно Requirements
if (template.UnitsInTemplate.Count == 0) if (template.UnitsInTemplate.Count == 0)
{ {
logger.LogDebug("[{Caller}] %СВЯЗЬ:{Field}% пропущен: UnitsInTemplate пуст.", caller, fieldName); logger.LogDebug("[{Caller}] %СВЯЗЬ:{Field}% пропущен: UnitsInTemplate пуст.", caller, fieldName);
@@ -63,7 +62,6 @@ internal class RelationshipUnitShortcodeHandler : IShortcodeHandler
var unitIds = template.UnitsInTemplate.Select(u => u.UnitId).Distinct().ToList(); var unitIds = template.UnitsInTemplate.Select(u => u.UnitId).Distinct().ToList();
// Пакетный запрос вместо N+1
var allValues = await unitInValueRepo.Get() var allValues = await unitInValueRepo.Get()
.AsNoTracking() .AsNoTracking()
.Include(uv => uv.Field) .Include(uv => uv.Field)
@@ -75,15 +73,15 @@ internal class RelationshipUnitShortcodeHandler : IShortcodeHandler
.Select(uv => uv.Value!.Value) .Select(uv => uv.Value!.Value)
.ToListAsync(ct); .ToListAsync(ct);
var distinctSorted = allValues.Distinct().OrderBy(v => v, StringComparer.OrdinalIgnoreCase).ToList(); if (allValues.Count == 0) return string.Empty;
if (distinctSorted.Count == 0) return string.Empty;
if (distinctSorted.Count > 1) var mostPopular = allValues
{ .GroupBy(v => v, StringComparer.OrdinalIgnoreCase)
logger.LogWarning("[{Caller}] %СВЯЗЬ:{Field}% нашёл {Count} значений. Используется первое: '{First}'", .Select(g => new { Value = g.Key, Count = g.Count() })
caller, fieldName, distinctSorted.Count, distinctSorted[0]); .OrderByDescending(x => x.Count)
} .ThenBy(x => x.Value, StringComparer.OrdinalIgnoreCase)
.FirstOrDefault();
return distinctSorted[0]!; return mostPopular?.Value ?? string.Empty;
} }
} }