diff --git a/DD.Persistence.API/Controllers/TimestampedValuesController.cs b/DD.Persistence.API/Controllers/TimestampedValuesController.cs
index fe97476..56b0db6 100644
--- a/DD.Persistence.API/Controllers/TimestampedValuesController.cs
+++ b/DD.Persistence.API/Controllers/TimestampedValuesController.cs
@@ -1,4 +1,5 @@
-using DD.Persistence.Models;
+using DD.Persistence.Filter.Models.Abstractions;
+using DD.Persistence.Models;
using DD.Persistence.Models.Common;
using DD.Persistence.Repositories;
using DD.Persistence.Services.Interfaces;
@@ -45,6 +46,7 @@ public class TimestampedValuesController : ControllerBase
///
/// Набор дискриминаторов
/// Фильтр позднее даты
+ /// Кастомный фильтр по набору значений
/// Фильтр свойств набора
///
///
@@ -52,7 +54,12 @@ public class TimestampedValuesController : ControllerBase
[HttpGet]
[ProducesResponseType(typeof(IEnumerable), (int)HttpStatusCode.OK)]
[ProducesResponseType((int)HttpStatusCode.NoContent)]
- public async Task>> Get([FromQuery] IEnumerable discriminatorIds, DateTimeOffset? timestampBegin, [FromQuery] string[]? columnNames, int skip, int take, CancellationToken token)
+ public async Task>> Get([FromQuery] IEnumerable discriminatorIds,
+ DateTimeOffset? timestampBegin,
+ [FromQuery] TNode? filterTree,
+ [FromQuery] string[]? columnNames,
+ int skip, int take,
+ CancellationToken token)
{
var result = await timestampedValuesService.Get(discriminatorIds, timestampBegin, columnNames, skip, take, token);
diff --git a/DD.Persistence.API/DependencyInjection.cs b/DD.Persistence.API/DependencyInjection.cs
index b543841..30d9f89 100644
--- a/DD.Persistence.API/DependencyInjection.cs
+++ b/DD.Persistence.API/DependencyInjection.cs
@@ -1,16 +1,14 @@
-using Mapster;
+using DD.Persistence.Filter.Models.Abstractions;
+using DD.Persistence.Models.Configurations;
+using DD.Persistence.Services;
+using DD.Persistence.Services.Interfaces;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Models;
-using DD.Persistence.Models;
-using DD.Persistence.Models.Configurations;
-using DD.Persistence.Services;
-using DD.Persistence.Services.Interfaces;
using Swashbuckle.AspNetCore.SwaggerGen;
using System.Reflection;
using System.Text.Json.Nodes;
-using DD.Persistence.Database.Entity;
namespace DD.Persistence.API;
@@ -30,6 +28,7 @@ public static class DependencyInjection
new OpenApiSchema {Type = "number", Format = "float" }
]
});
+ c.MapType(() => new OpenApiSchema { Type = "string" });
c.CustomOperationIds(e =>
{
diff --git a/DD.Persistence.Database/Specifications/AndSpecification.cs b/DD.Persistence.Database/Specifications/Operation/AndSpecification.cs
similarity index 90%
rename from DD.Persistence.Database/Specifications/AndSpecification.cs
rename to DD.Persistence.Database/Specifications/Operation/AndSpecification.cs
index 776ce3a..a085183 100644
--- a/DD.Persistence.Database/Specifications/AndSpecification.cs
+++ b/DD.Persistence.Database/Specifications/Operation/AndSpecification.cs
@@ -1,6 +1,6 @@
using Ardalis.Specification;
-namespace DD.Persistence.Database.Specifications;
+namespace DD.Persistence.Database.Specifications.Operation;
public class AndSpecification : Specification
{
public AndSpecification(ISpecification first, ISpecification second)
diff --git a/DD.Persistence.Database/Specifications/OrSpecification.cs b/DD.Persistence.Database/Specifications/Operation/OrSpecification.cs
similarity index 79%
rename from DD.Persistence.Database/Specifications/OrSpecification.cs
rename to DD.Persistence.Database/Specifications/Operation/OrSpecification.cs
index 75e573e..db07f6e 100644
--- a/DD.Persistence.Database/Specifications/OrSpecification.cs
+++ b/DD.Persistence.Database/Specifications/Operation/OrSpecification.cs
@@ -1,13 +1,13 @@
using Ardalis.Specification;
using DD.Persistence.Database.Postgres.Extensions;
-namespace DD.Persistence.Database.Specifications;
+namespace DD.Persistence.Database.Specifications.Operation;
public class OrSpecification : Specification
{
public OrSpecification(ISpecification first, ISpecification second)
{
var orExpression = first.Or(second);
- if (orExpression == null)
+ if (orExpression == null)
return;
Query.Where(orExpression);
diff --git a/DD.Persistence/Filter/Models/Abstractions/TNode.cs b/DD.Persistence/Filter/Models/Abstractions/TNode.cs
index 226a3ef..2046a55 100644
--- a/DD.Persistence/Filter/Models/Abstractions/TNode.cs
+++ b/DD.Persistence/Filter/Models/Abstractions/TNode.cs
@@ -1,11 +1,14 @@
using DD.Persistence.Filter.Models.Enumerations;
+using DD.Persistence.Filter.TreeBuilder;
+using System.Diagnostics.CodeAnalysis;
namespace DD.Persistence.Filter.Models.Abstractions;
///
/// Абстрактная модель вершины
///
-public abstract class TNode
+
+public abstract class TNode : IParsable
{
///
public TNode(OperationEnum operation)
@@ -18,6 +21,30 @@ public abstract class TNode
///
public OperationEnum Operation { get; }
+ ///
+ public static TNode? Parse(string s, IFormatProvider? provider)
+ {
+ var result = s.BuildTree();
+
+ return result;
+ }
+
+ ///
+ public static bool TryParse([NotNullWhen(true)] string? s, IFormatProvider? provider, [MaybeNullWhen(false)] out TNode result)
+ {
+ if (string.IsNullOrEmpty(s))
+ {
+ result = default(TNode);
+ return false;
+ }
+
+ result = s.BuildTree();
+ if (result is null)
+ return false;
+
+ return true;
+ }
+
///
/// Принять посетителя
///
diff --git a/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/Abstract/TerminalExpression.cs b/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/Abstract/TerminalExpression.cs
index 1d13d6b..00ee20f 100644
--- a/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/Abstract/TerminalExpression.cs
+++ b/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/Abstract/TerminalExpression.cs
@@ -62,15 +62,10 @@ abstract class TerminalExpression : IExpression
private static object? ParseValue(string value)
{
- value = value.Replace('.', ',');
- if (value.Contains(',') && double.TryParse(value, out _))
+ var doubleValue= value.Replace('.', ',');
+ if (double.TryParse(doubleValue, out _))
{
- return double.Parse(value);
- }
-
- if (int.TryParse(value, out _))
- {
- return int.Parse(value);
+ return double.Parse(doubleValue);
}
value = value.Trim('\"');