dotnet-cqrs/Svrnty.CQRS.DynamicQuery/DynamicQueryFilter.cs

87 lines
2.3 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.Json;
using PoweredSoft.DynamicQuery;
using PoweredSoft.DynamicQuery.Core;
namespace Svrnty.CQRS.DynamicQuery;
public class DynamicQueryFilter
{
public List<DynamicQueryFilter> Filters { get; set; }
public bool? And { get; set; }
public string Type { get; set; }
public bool? Not { get; set; }
public string Path { get; set; }
public object Value { get; set; }
public string QueryValue
{
get
{
return null;
}
set
{
Value = value;
}
}
public bool? CaseInsensitive { get; set; }
public IFilter ToFilter()
{
var type = Enum.Parse<FilterType>(Type);
if (type == FilterType.Composite)
{
var compositeFilter = new CompositeFilter
{
And = And,
Type = FilterType.Composite,
Filters = Filters?.Select(t => t.ToFilter())?.ToList() ?? new List<IFilter>()
};
return compositeFilter;
}
object value = Value;
if (Value is JsonElement jsonElement)
{
switch (jsonElement.ValueKind)
{
case JsonValueKind.String:
value = jsonElement.ToString();
break;
case JsonValueKind.Number:
if (jsonElement.ToString().Contains('.'))
value = jsonElement.GetDecimal();
else if (jsonElement.TryGetInt64(out var convertedValue))
value = convertedValue;
break;
case JsonValueKind.True:
value = true;
break;
case JsonValueKind.False:
value = false;
break;
// TODO: Array support
default:
value = null;
break;
}
}
var simpleFilter = new SimpleFilter
{
And = And,
Type = type,
Not = Not,
Path = Path,
Value = value,
CaseInsensitive = CaseInsensitive,
};
return simpleFilter;
}
}