< Summary

Information
Class: Services.ApiServices._1CApi.Nomenclature.NomenclatureIndex
Assembly: Services
File(s): /home/runner/work/Studio2Prod/Studio2Prod/AppRepository/ApiServices/1CApi/Nomenclature/NomenclatureIndex.cs
Line coverage
100%
Covered lines: 31
Uncovered lines: 0
Coverable lines: 31
Total lines: 81
Line coverage: 100%
Branch coverage
95%
Covered branches: 21
Total branches: 22
Branch coverage: 95.4%
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%
get_ProducerUsage()100%11100%
get_Count()100%11100%
Build(...)94.44%1818100%
Find(...)100%44100%
Articles()100%11100%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/AppRepository/ApiServices/1CApi/Nomenclature/NomenclatureIndex.cs

#LineLine coverage
 1using OzonDomains.Nomenclature;
 2
 3namespace Services.ApiServices._1CApi.Nomenclature;
 4
 5/// <summary>Строка карты соответствий (<c>OneCNomenclatureMaps</c>) в том виде, в котором её читает индекс.</summary>
 6public sealed record MapRow(string ArticleNorm, string ProducerNorm, string? ProducerName, Guid RefKey, string? RawArtic
 7
 8/// <param name="Groups">Группы бренда карточки; пусто — у карточки нет производителя или он не известен справочнику.</p
 9public sealed record IndexedCard(
 10    Guid RefKey,
 11    string ArticleKey,
 12    string? ProducerName,
 13    string ProducerNorm,
 14    string? RawArticle,
 15    string Source,
 16    IReadOnlySet<string> Groups)
 17{
 18    public bool HasProducer => ProducerNorm.Length > 0;
 19}
 20
 21/// <summary>
 22/// Снимок карты соответствий в памяти: ключ артикула (<see cref="ArticleKey.Key"/>, с диакритикой и кириллическими
 23/// двойниками) → карточки 1С с группами бренда. Неизменяемый; подмена снимка — в <c>NomenclatureIndexProvider</c>.
 24/// </summary>
 25public sealed class NomenclatureIndex
 26{
 127    public static readonly NomenclatureIndex Empty = new(new Dictionary<string, List<IndexedCard>>(), 0, new Dictionary<
 28
 29    private readonly Dictionary<string, List<IndexedCard>> _byArticle;
 30
 5831    private NomenclatureIndex(Dictionary<string, List<IndexedCard>> byArticle, int count, Dictionary<string, int> usage)
 32    {
 5833        _byArticle = byArticle;
 5834        Count = count;
 5835        ProducerUsage = usage;
 5836    }
 37
 38    /// <summary>Сколько карточек у каждого написания производителя (ключ — <see cref="ArticleKey.Key"/> имени).</summar
 1539    public IReadOnlyDictionary<string, int> ProducerUsage { get; }
 40
 141    public int Count { get; }
 42
 43    public static NomenclatureIndex Build(IEnumerable<MapRow> rows, ProducerDirectory directory)
 44    {
 5745        var byArticle = new Dictionary<string, List<IndexedCard>>(StringComparer.Ordinal);
 5746        var count = 0;
 5747        var usage = new Dictionary<string, int>(StringComparer.Ordinal);
 22248        foreach (var row in rows)
 49        {
 5450            var key = ArticleKey.Key(row.ArticleNorm);
 5451            if (key.Length == 0)
 52                continue;
 53
 5454            var groups = row.ProducerNorm.Length == 0
 5455                ? ProducerResolution.NoGroups
 5456                : directory.GroupsOfName(string.IsNullOrWhiteSpace(row.ProducerName) ? row.ProducerNorm : row.ProducerNa
 5457            if (groups.Count == 0 && row.ProducerNorm.Length > 0)
 758                groups = directory.GroupsOfName(row.ProducerNorm);
 59
 5460            if (!byArticle.TryGetValue(key, out var list))
 4661                byArticle[key] = list = new List<IndexedCard>(1);
 62
 5463            list.Add(new IndexedCard(row.RefKey, key, row.ProducerName, row.ProducerNorm, row.RawArticle, row.Source, gr
 5464            count++;
 65
 5466            var producerKey = ArticleKey.Key(string.IsNullOrWhiteSpace(row.ProducerName) ? row.ProducerNorm : row.Produc
 5467            if (producerKey.Length > 0)
 5168                usage[producerKey] = usage.GetValueOrDefault(producerKey) + 1;
 69        }
 70
 5771        return new NomenclatureIndex(byArticle, count, usage);
 72    }
 73
 74    public IReadOnlyList<IndexedCard> Find(string articleKey)
 8475        => !string.IsNullOrEmpty(articleKey) && _byArticle.TryGetValue(articleKey, out var list)
 8476            ? list
 8477            : [];
 78
 79    /// <summary>Все артикулы индекса с карточками — для отчётов (дубли).</summary>
 180    public IEnumerable<KeyValuePair<string, List<IndexedCard>>> Articles() => _byArticle;
 81}