87 lines
2.3 KiB
C#
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;
|
|
}
|
|
}
|