< Summary

Information
Class: Fluorite.Strainer.Services.Filtering.FilterTermParser
Assembly: Fluorite.Strainer
File(s): /builds/fluorite/strainer/src/Strainer/Services/Filtering/FilterTermParser.cs
Line coverage
100%
Covered lines: 42
Uncovered lines: 0
Coverable lines: 42
Total lines: 99
Line coverage: 100%
Branch coverage
100%
Covered branches: 12
Total branches: 12
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%
GetParsedTerms(...)100%1010100%
ParseFilterTerm(...)100%22100%
ParseFilterOperatorAndValue(...)100%11100%
ParseSubfilters(...)100%11100%

File(s)

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

#LineLine coverage
 1using Fluorite.Strainer.Models.Filtering.Terms;
 2using System.Text.RegularExpressions;
 3
 4namespace Fluorite.Strainer.Services.Filtering;
 5
 6public class FilterTermParser : IFilterTermParser
 7{
 8    private const string EscapedCommaPattern = @"(?<!($|[^\\])(\\\\)*?\\),";
 9    private const string EscapedPipePattern = @"(?<!($|[^\\])(\\\\)*?\\)\|";
 10
 11    private readonly IFilterOperatorParser _operatorParser;
 12    private readonly IFilterTermNamesParser _namesParser;
 13    private readonly IFilterTermValuesParser _valuesParser;
 14    private readonly IFilterTermSectionsParser _termSectionsParser;
 15
 1516    public FilterTermParser(
 1517        IFilterOperatorParser operatorParser,
 1518        IFilterTermNamesParser namesParser,
 1519        IFilterTermValuesParser valuesParser,
 1520        IFilterTermSectionsParser termSectionsParser)
 21    {
 1522        _operatorParser = Guard.Against.Null(operatorParser);
 1523        _namesParser = Guard.Against.Null(namesParser);
 1524        _valuesParser = Guard.Against.Null(valuesParser);
 1525        _termSectionsParser = Guard.Against.Null(termSectionsParser);
 1526    }
 27
 28    public IList<IFilterTerm> GetParsedTerms(string? input)
 29    {
 1430        if (string.IsNullOrWhiteSpace(input))
 31        {
 332            return new List<IFilterTerm>();
 33        }
 34
 1135        var terms = new List<IFilterTerm>();
 1136        var inputParts = Regex.Split(input, EscapedCommaPattern, RegexOptions.None, TimeSpan.FromMilliseconds(100));
 37
 4838        foreach (var filterPart in inputParts)
 39        {
 1340            if (string.IsNullOrWhiteSpace(filterPart))
 41            {
 42                continue;
 43            }
 44
 1145            string filterTermInput = filterPart;
 46
 1147            if (filterPart.StartsWith("("))
 48            {
 149                var filterOperatorAndValue = ParseFilterOperatorAndValue(filterPart);
 150                var subfilters = ParseSubfilters(filterPart, filterOperatorAndValue);
 151                filterTermInput = subfilters + filterOperatorAndValue;
 52            }
 53
 1154            var filterTerm = ParseFilterTerm(filterTermInput);
 1155            if (filterTerm is null)
 56            {
 57                continue;
 58            }
 59
 960            terms.Add(filterTerm);
 61        }
 62
 1163        return terms;
 64    }
 65
 66    private IFilterTerm? ParseFilterTerm(string input)
 67    {
 1168        var sections = _termSectionsParser.Parse(input);
 1169        var names = _namesParser.Parse(sections.Names);
 70
 1171        if (!names.Any())
 72        {
 273            return null;
 74        }
 75
 976        var values = _valuesParser.Parse(sections.Values);
 977        var operatorParsed = _operatorParser.GetParsedOperator(sections.OperatorSymbol);
 78
 979        return new FilterTerm(input)
 980        {
 981            Names = names,
 982            Operator = operatorParsed,
 983            Values = values,
 984        };
 85    }
 86
 87    private string ParseFilterOperatorAndValue(string filter)
 88    {
 189        return filter.Substring(filter.LastIndexOf(")") + 1);
 90    }
 91
 92    private string ParseSubfilters(string filter, string filterOpAndVal)
 93    {
 194        return filter
 195            .Replace(filterOpAndVal, string.Empty)
 196            .Replace("(", string.Empty)
 197            .Replace(")", string.Empty);
 98    }
 99}