enisn/AutoFilterer

View on GitHub
src/AutoFilterer/Types/StringFilter.cs

Summary

Maintainability
A
2 hrs
Test Coverage
#if LEGACY_NAMESPACE
using AutoFilterer.Enums;
#endif
using AutoFilterer.Abstractions;
using AutoFilterer.Attributes;
using AutoFilterer.Extensions;
using System;
using System.Linq.Expressions;
using System.Reflection;

namespace AutoFilterer.Types;

public class StringFilter : IFilterableType
{
    /// <summary>
    /// Provides parameter for equal operator '==' in query.
    /// </summary>
    public virtual string Eq { get; set; }

    /// <summary>
    /// Provides parameter to not equal operator '!=' in query.
    /// </summary>
    public virtual string Not { get; set; }

    /// <summary>
    /// Provides parameter to String.Equals method query.
    /// </summary>
    public virtual new string Equals { get; set; }

    /// <summary>
    /// Provides parameter to String.Conains method query.
    /// </summary>
    public virtual string Contains { get; set; }

    /// <summary>
    /// Provides parameter to String.StartsWith method query.
    /// </summary>
    public virtual string StartsWith { get; set; }

    /// <summary>
    /// Provides parameter to String.EndsWith method query.
    /// </summary>
    public virtual string EndsWith { get; set; }

    /// <summary>
    /// <inheritdoc />
    /// </summary>
    public virtual CombineType CombineWith { get; set; }

    /// <summary>
    /// Gets or sets comparison type of strings. Default is InvariantCultureIgnoreCase.
    /// </summary>
    public virtual StringComparison? Compare { get; set; }

    public virtual Expression BuildExpression(Expression expressionBody, PropertyInfo targetProperty, PropertyInfo filterProperty, object value)
    {
        Expression expression = null;

        if (Eq != null)
            expression = expression.Combine(OperatorComparisonAttribute.Equal.BuildExpression(expressionBody, targetProperty, filterProperty, Eq), CombineWith);

        if (Not != null)
            expression = expression.Combine(OperatorComparisonAttribute.NotEqual.BuildExpression(expressionBody, targetProperty, filterProperty, Not), CombineWith);

        if (Equals != null)
            expression = expression.Combine(new StringFilterOptionsAttribute(StringFilterOption.Equals) { Comparison = Compare }.BuildExpression(expressionBody, targetProperty, filterProperty, Equals), CombineWith);

        if (Contains != null)
            expression = expression.Combine(new StringFilterOptionsAttribute(StringFilterOption.Contains) { Comparison = Compare }.BuildExpression(expressionBody, targetProperty, filterProperty, Contains), CombineWith);

        if (StartsWith != null)
            expression = expression.Combine(new StringFilterOptionsAttribute(StringFilterOption.StartsWith) { Comparison = Compare }.BuildExpression(expressionBody, targetProperty, filterProperty, StartsWith), CombineWith);

        if (EndsWith != null)
            expression = expression.Combine(new StringFilterOptionsAttribute(StringFilterOption.EndsWith) { Comparison = Compare }.BuildExpression(expressionBody, targetProperty, filterProperty, EndsWith), CombineWith);

        return expression;
    }
}