< Summary

Information
Class: Fluorite.Strainer.Services.Filtering.Steps.ApplyConsantClosureToFilterValueStep
Assembly: Fluorite.Strainer
File(s): /builds/fluorite/strainer/src/Strainer/Services/Filtering/Steps/ApplyConsantClosureToFilterValueStep.cs
Line coverage
100%
Covered lines: 19
Uncovered lines: 0
Coverable lines: 19
Total lines: 41
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
Execute(...)100%44100%
GetClosureOverConstant(...)100%11100%

File(s)

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

#LineLine coverage
 1using System.Linq.Expressions;
 2
 3namespace Fluorite.Strainer.Services.Filtering.Steps;
 4
 5public class ApplyConsantClosureToFilterValueStep : IApplyConsantClosureToFilterValueStep
 6{
 7    public void Execute(FilterExpressionWorkflowContext context)
 8    {
 49        Guard.Against.Null(context);
 410        Guard.Against.Null(context.Term);
 411        Guard.Against.Null(context.Term.Operator);
 412        Guard.Against.Null(context.PropertyMetadata);
 413        Guard.Against.Null(context.PropertyMetadata.PropertyInfo);
 414        Guard.Against.Null(context.FilterTermConstant);
 15
 416        var constantClosureType = context.Term.Operator.IsStringBased
 417            ? typeof(string)
 418            : context.PropertyMetadata.PropertyInfo.PropertyType;
 19
 420        if (context.FilterTermConstant.GetType() != constantClosureType)
 21        {
 222            throw new InvalidOperationException(
 223                "Cannot get a closure over constant using wrong type. " +
 224                $"Give value is of {context.FilterTermConstant.GetType().Name} type while expected target type " +
 225                $"is of {constantClosureType.Name} type.");
 26        }
 27
 228        context.FinalExpression = GetClosureOverConstant(
 229            context.FilterTermConstant,
 230            constantClosureType);
 231    }
 32
 33    // Workaround to ensure that the filter value gets passed as a parameter in generated SQL from EF Core
 34    // See https://github.com/aspnet/EntityFrameworkCore/issues/3361
 35    // Expression.Constant passed the target type to allow Nullable comparison
 36    // See http://bradwilson.typepad.com/blog/2008/07/creating-nullab.html
 37    private Expression GetClosureOverConstant<T>(T constant, Type targetType)
 38    {
 239        return Expression.Constant(constant, targetType);
 40    }
 41}