< Summary

Information
Class: Fluorite.Strainer.Services.Filtering.Steps.ApplyFilterOperatorStep
Assembly: Fluorite.Strainer
File(s): /builds/fluorite/strainer/src/Strainer/Services/Filtering/Steps/ApplyFilterOperatorStep.cs
Line coverage
100%
Covered lines: 35
Uncovered lines: 0
Coverable lines: 35
Total lines: 56
Line coverage: 100%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

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

File(s)

/builds/fluorite/strainer/src/Strainer/Services/Filtering/Steps/ApplyFilterOperatorStep.cs

#LineLine coverage
 1using Fluorite.Strainer.Exceptions;
 2using Fluorite.Strainer.Models.Filtering.Operators;
 3
 4namespace Fluorite.Strainer.Services.Filtering.Steps;
 5
 6public class ApplyFilterOperatorStep : IApplyFilterOperatorStep
 7{
 8    private readonly IStrainerOptionsProvider _strainerOptionsProvider;
 9
 310    public ApplyFilterOperatorStep(IStrainerOptionsProvider strainerOptionsProvider)
 11    {
 312        _strainerOptionsProvider = Guard.Against.Null(strainerOptionsProvider);
 313    }
 14
 15    public void Execute(FilterExpressionWorkflowContext context)
 16    {
 217        Guard.Against.Null(context);
 218        Guard.Against.Null(context.FinalExpression);
 219        Guard.Against.Null(context.PropertyValue);
 220        Guard.Against.Null(context.Term);
 221        Guard.Against.Null(context.Term.Operator);
 222        Guard.Against.Null(context.PropertyMetadata);
 223        Guard.Against.Null(context.PropertyMetadata.PropertyInfo);
 224        Guard.Against.Null(context.FilterTermValue);
 25
 226        var strainerOptions = _strainerOptionsProvider.GetStrainerOptions();
 227        var isStringBasedProperty = context.PropertyMetadata.PropertyInfo.PropertyType == typeof(string);
 228        var filterOperatorContext = new FilterExpressionContext(
 229            context.FinalExpression,
 230            context.PropertyValue,
 231            strainerOptions.IsCaseInsensitiveForValues,
 232            context.IsMaterializedQueryable,
 233            isStringBasedProperty);
 34
 35        try
 36        {
 237            context.FinalExpression = context.Term.Operator.ExpressionProvider(filterOperatorContext);
 138        }
 139        catch (Exception ex)
 40        {
 141            var metadata = context.PropertyMetadata;
 42
 143            throw new StrainerOperatorException(
 144                $"Failed to use operator '{context.Term.Operator}' " +
 145                $"for filter value '{context.FilterTermValue}' on property " +
 146                $"'{metadata.PropertyInfo.DeclaringType.FullName}.{metadata.PropertyInfo.Name}' " +
 147                $"of type '{metadata.PropertyInfo.PropertyType.FullName}'\n." +
 148                "Please ensure that this operator is supported by type " +
 149                $"'{metadata.PropertyInfo.PropertyType.FullName}'.",
 150                ex,
 151                context.Term.Operator,
 152                metadata.PropertyInfo,
 153                context.FilterTermValue);
 54        }
 155    }
 56}