< Summary

Information
Class: Services.ProducerAliases.ProducerBrandAliasMap
Assembly: Services
File(s): /home/runner/work/Studio2Prod/Studio2Prod/AppRepository/ProducerAliases/ProducerBrandAliasMap.cs
Line coverage
100%
Covered lines: 19
Uncovered lines: 0
Coverable lines: 19
Total lines: 55
Line coverage: 100%
Branch coverage
100%
Covered branches: 10
Total branches: 10
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.cctor()100%11100%
.ctor(...)100%11100%
Canonicalize(...)100%22100%
AreSame(...)100%44100%
GetVariants(...)100%44100%
Normalize(...)100%11100%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/AppRepository/ProducerAliases/ProducerBrandAliasMap.cs

#LineLine coverage
 1using Services.ApiServices._1CApi.OData;
 2
 3namespace Services.ProducerAliases;
 4
 5/// <summary>
 6/// Словарь алиасов производителей, приведённый к нормализованному виду: «KAYABA» → «KYB».
 7/// Позволяет сравнивать бренд запроса и бренд ответа API, не завися от написания.
 8/// </summary>
 9public sealed class ProducerBrandAliasMap
 10{
 11    /// <summary>Пустая карта — поведение как до появления алиасов (сравнение по нормализации).</summary>
 112    public static readonly ProducerBrandAliasMap Empty = new(new Dictionary<string, string>());
 13
 14    private readonly IReadOnlyDictionary<string, string> _aliasToCanonical;
 15    private readonly IReadOnlyDictionary<string, IReadOnlyList<string>> _canonicalToVariants;
 16
 1617    public ProducerBrandAliasMap(IReadOnlyDictionary<string, string> aliasToCanonical)
 18    {
 1619        _aliasToCanonical = aliasToCanonical;
 1620        _canonicalToVariants = aliasToCanonical
 1921            .GroupBy(pair => pair.Value, StringComparer.Ordinal)
 1622            .ToDictionary(
 1723                group => group.Key,
 3624                group => (IReadOnlyList<string>)group.Select(pair => pair.Key).Append(group.Key)
 1725                    .Distinct(StringComparer.Ordinal).ToArray(),
 1626                StringComparer.Ordinal);
 1627    }
 28
 29    /// <summary>Нормализованное каноническое написание бренда. Незнакомый бренд остаётся собой.</summary>
 30    public string Canonicalize(string? brand)
 31    {
 11432        var normalized = Normalize(brand);
 11433        return _aliasToCanonical.TryGetValue(normalized, out var canonical) ? canonical : normalized;
 34    }
 35
 36    /// <summary>Один и тот же бренд с точностью до написания и алиаса.</summary>
 37    public bool AreSame(string? left, string? right) =>
 3238        Canonicalize(left) is { Length: > 0 } canonical && canonical == Canonicalize(right);
 39
 40    /// <summary>
 41    /// Все известные написания бренда в нормализованном виде: «Kayaba» → [«KAYABA», «KYB»].
 42    /// Нужно там, где бренд ищется вхождением в чужой текст и точное сравнение невозможно.
 43    /// </summary>
 44    public IReadOnlyList<string> GetVariants(string? brand)
 45    {
 1846        var canonical = Canonicalize(brand);
 1847        if (canonical.Length == 0)
 1048            return Array.Empty<string>();
 49
 850        return _canonicalToVariants.TryGetValue(canonical, out var variants) ? variants : new[] { canonical };
 51    }
 52
 53    /// <summary>Нормализация повторяет ту, которой заполнялась таблица алиасов.</summary>
 21054    public static string Normalize(string? value) => OneCNomenclatureService.NormalizeProducerName(value);
 55}