< Summary

Information
Class: Fluorite.Strainer.Services.Filtering.FilterExpressionProvider
Assembly: Fluorite.Strainer
File(s): /builds/fluorite/strainer/src/Strainer/Services/Filtering/FilterExpressionProvider.cs
Line coverage
100%
Covered lines: 38
Uncovered lines: 0
Coverable lines: 38
Total lines: 90
Line coverage: 100%
Branch coverage
100%
Covered branches: 14
Total branches: 14
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%
GetExpression(...)100%1010100%
CreateInnerExpression(...)100%44100%

File(s)

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

#LineLine coverage
 1using Fluorite.Strainer.Models.Filtering.Terms;
 2using Fluorite.Strainer.Models.Metadata;
 3using System.Linq.Expressions;
 4
 5namespace Fluorite.Strainer.Services.Filtering;
 6
 7public class FilterExpressionProvider : IFilterExpressionProvider
 8{
 9    private readonly IFilterExpressionWorkflowBuilder _filterExpressionWorkflowBuilder;
 10
 811    public FilterExpressionProvider(
 812        IFilterExpressionWorkflowBuilder filterExpressionWorkflowBuilder)
 13    {
 814        _filterExpressionWorkflowBuilder = Guard.Against.Null(filterExpressionWorkflowBuilder);
 815    }
 16
 17    public Expression? GetExpression(
 18        IPropertyMetadata metadata,
 19        IFilterTerm filterTerm,
 20        ParameterExpression parameterExpression,
 21        Expression? innerExpression,
 22        bool isMaterializedQueryable)
 23    {
 724        Guard.Against.Null(metadata);
 725        Guard.Against.Null(filterTerm);
 726        Guard.Against.Null(parameterExpression);
 27
 728        if (filterTerm.Values == null || !filterTerm.Values.Any())
 29        {
 230            return null;
 31        }
 32
 533        var nameParts = metadata.Name.Split(new[] { '.' }, StringSplitOptions.RemoveEmptyEntries);
 534        if (!nameParts.Any())
 35        {
 336            throw new ArgumentException("Metadata name must not be empty.", nameof(metadata));
 37        }
 38
 239        MemberExpression? propertyExpresssion = null;
 40
 841        foreach (var part in nameParts)
 42        {
 243            propertyExpresssion = Expression.PropertyOrField((Expression?)propertyExpresssion ?? parameterExpression, pa
 44        }
 45
 246        return CreateInnerExpression(
 247            metadata,
 248            filterTerm,
 249            innerExpression,
 250            propertyExpresssion,
 251            isMaterializedQueryable);
 52    }
 53
 54    private Expression? CreateInnerExpression(
 55        IPropertyMetadata metadata,
 56        IFilterTerm filterTerm,
 57        Expression? innerExpression,
 58        MemberExpression? propertyExpression,
 59        bool isMaterializedQueryable)
 60    {
 261        var workflow = _filterExpressionWorkflowBuilder.BuildDefaultWorkflow();
 62
 863        foreach (var filterTermValue in filterTerm.Values)
 64        {
 265            var context = new FilterExpressionWorkflowContext
 266            {
 267                FilterTermConstant = filterTermValue,
 268                FilterTermValue = filterTermValue,
 269                FinalExpression = null,
 270                IsMaterializedQueryable = isMaterializedQueryable,
 271                PropertyMetadata = metadata,
 272                PropertyValue = propertyExpression,
 273                Term = filterTerm,
 274            };
 75
 276            var expression = workflow.Run(context);
 77
 278            if (innerExpression == null)
 79            {
 180                innerExpression = expression;
 81            }
 82            else
 83            {
 184                innerExpression = Expression.Or(innerExpression, expression);
 85            }
 86        }
 87
 288        return innerExpression;
 89    }
 90}