Filters Queries

Last updated: June 13th, 2020

Filters Queries

Syntax

Filtering by single field:

id(gt:1)

Filtering by multiple operators:

id(gt:1,lt:10)

Filtering by multiple Filters:

id(gt:1,lt:10),status(in:"1,2,3")

Usage

Using these interfaces in example:
public interface IdFilters
{
    int Lt { get; }
    int Gt { get; }
}
public interface StatusFilters
{
    string In { get; }
}

public interface OrderFilters
{
    IdFilters Id { get; }
    StatusFilters Status { get; }
}
Use a parser with interpreter to start going:
// Parsing
var parser = new FiltersQueryParser();
IEnumerable<FilterToken> result = parser.Parse("id(gt:1,lt:10),status(in:\"1,2,3\")");

// Or building tokens manually with strong type
var builder = new FiltersQueryBuilder<OrderFilters>();
List<FilterToken> builderResult = builder
    .Filter(x => x.Id, x => x
        .Operator(o => o.Gt, "1")
        .Operator(o => o.Lt, "10"))
    .Filter(x => x.Status, x => x
        .Operator(o => o.In, "\"1,2,3\""))
    .Build();

// Interpreting
var interpreter = new FiltersQueryInterpreter<OrderFilters>(result);
if(interpreter.FiltersBy(x => x.Id, out var idOperators)) {
    if(idOperators.HasOperator(x => x.Gt, out var gtValue)) {
        Console.WriteLine("Id should be after: {0}", gtValue.Value);
    }

    if (idOperators.HasOperator(x => x.Lt, out var ltValue))
    {
        Console.WriteLine("Id should be before: {0}", ltValue.Value);
    }
}

if (interpreter.FiltersBy(x => x.Status, out var statusOperators))
{
    if (statusOperators.HasOperator(x => x.In, out var inValue))
    {
        Console.WriteLine("Status should in: {0}", inValue.Value);
    }
}

// Serialize back into string query
var serializer = new FiltersQuerySerializer();
string query = serializer.Serialize(result); // id(gt:1,lt:10),status(in:1,2,3)