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('\"');