< Summary

Information
Class: Fluorite.Strainer.Services.Filtering.FilterTermSectionsParser
Assembly: Fluorite.Strainer
File(s): /builds/fluorite/strainer/src/Strainer/Services/Filtering/FilterTermSectionsParser.cs
Line coverage
100%
Covered lines: 29
Uncovered lines: 0
Coverable lines: 29
Total lines: 52
Line coverage: 100%
Branch coverage
100%
Covered branches: 4
Total branches: 4
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
Parse(...)100%44100%

File(s)

/builds/fluorite/strainer/src/Strainer/Services/Filtering/FilterTermSectionsParser.cs

#LineLine coverage
 1using Fluorite.Strainer.Models.Filtering.Terms;
 2using System.Text.RegularExpressions;
 3
 4namespace Fluorite.Strainer.Services.Filtering;
 5
 6public class FilterTermSectionsParser : IFilterTermSectionsParser
 7{
 8    private readonly IConfigurationFilterOperatorsProvider _filterOperatorsConfigurationProvider;
 9
 2210    public FilterTermSectionsParser(
 2211        IConfigurationFilterOperatorsProvider filterOperatorsConfigurationProvider)
 12    {
 2213        _filterOperatorsConfigurationProvider = Guard.Against.Null(filterOperatorsConfigurationProvider);
 2214    }
 15
 16    public FilterTermSections Parse(string input)
 17    {
 1818        Guard.Against.Null(input);
 19
 20        // Order by longest operator to ensure we first try to match the longest ones
 21        // as shorter operators are contained within longer ones and would be matched
 22        // first, but only partially, leaving out the rest of operator.
 1823        var symbols = _filterOperatorsConfigurationProvider
 1824            .GetFilterOperators()
 1825            .Keys
 22626            .OrderByDescending(s => s.Length)
 1827            .ToArray();
 1828        if (!symbols.Any())
 29        {
 130            throw new InvalidOperationException("No filter operators found.");
 31        }
 32
 24333        var splitPattern = string.Join("|", symbols.Select(s => $"({Regex.Escape(s)})"));
 1734        var substrings = Regex.Split(input, splitPattern, RegexOptions.None, TimeSpan.FromMilliseconds(100));
 35
 1736        return substrings.Length switch
 1737        {
 338            <= 2 => new FilterTermSections
 339            {
 340                Names = substrings.FirstOrDefault(),
 341                OperatorSymbol = string.Empty,
 342                Values = string.Empty,
 343            },
 1444            >= 3 => new FilterTermSections
 1445            {
 1446                Names = substrings[0],
 1447                OperatorSymbol = substrings[1],
 1448                Values = substrings[2],
 1449            },
 1750        };
 51    }
 52}