Правки по ревью #3

This commit is contained in:
Roman Efremov 2025-02-05 12:10:01 +05:00
parent 560073ed07
commit 63e6816e35
15 changed files with 75 additions and 74 deletions

View File

@ -29,7 +29,6 @@ public class SetpointRepositoryShould : IClassFixture<RepositoryTestFixture>
var value = GetJsonFromObject(22); var value = GetJsonFromObject(22);
await sut.Add(id, value, Guid.NewGuid(), CancellationToken.None); await sut.Add(id, value, Guid.NewGuid(), CancellationToken.None);
var t = fixture.dbContainer.GetConnectionString();
//act //act
var result = await sut.GetCurrent([id], CancellationToken.None); var result = await sut.GetCurrent([id], CancellationToken.None);

View File

@ -1,13 +1,13 @@
using DD.Persistence.Filter.Interpreter; using DD.Persistence.Filter.Models;
using DD.Persistence.Filter.Models;
using DD.Persistence.Filter.Models.Enumerations; using DD.Persistence.Filter.Models.Enumerations;
using DD.Persistence.Filter.TreeBuilder;
using Newtonsoft.Json; using Newtonsoft.Json;
namespace DD.Persistence.Test; namespace DD.Persistence.Test;
public class TreeBuilderShould public class TreeBuilderTest
{ {
[Fact] [Fact]
public void TestTreeBuilding() public void TreeBuildingShouldBuilt()
{ {
//arrange //arrange
var treeString = "(\"A\"==1)||(\"B\"==2)&&(\"C\"==3)||((\"D\"==4)||(\"E\"==5))&&(\"F\"==6)"; var treeString = "(\"A\"==1)||(\"B\"==2)&&(\"C\"==3)||((\"D\"==4)||(\"E\"==5))&&(\"F\"==6)";
@ -44,7 +44,7 @@ public class TreeBuilderShould
} }
[Fact] [Fact]
public void TestTreeOperations() public void TreeOperationsShouldBuilt()
{ {
//arrange //arrange
var treeString = "(\"A\"==1)||(\"B\"!=1)||(\"C\">1)||(\"D\">=1)||(\"E\"<1)||(\"F\"<=1)"; var treeString = "(\"A\"==1)||(\"B\"!=1)||(\"C\">1)||(\"D\">=1)||(\"E\"<1)||(\"F\"<=1)";
@ -81,7 +81,7 @@ public class TreeBuilderShould
} }
[Fact] [Fact]
public void TestLeafValues() public void LeafValuesShouldBuilt()
{ {
//arrange //arrange
var treeString = "(\"A\"==1.2345)||(\"B\"==12345)||(\"C\"==\"12345\")"; var treeString = "(\"A\"==1.2345)||(\"B\"==12345)||(\"C\"==\"12345\")";

View File

@ -1,6 +1,6 @@
using DD.Persistence.Filter.Models.Enumerations; using DD.Persistence.Filter.Models.Enumerations;
namespace DD.Persistence.Filter.Interpreter.Expressions.Abstract; namespace DD.Persistence.Filter.TreeBuilder.Expressions.Abstractions;
/// <summary> /// <summary>
/// Интерфейс для выражений /// Интерфейс для выражений

View File

@ -1,10 +1,10 @@
using DD.Persistence.Extensions; using DD.Persistence.Extensions;
using DD.Persistence.Filter.Interpreter.Expressions.Abstract;
using DD.Persistence.Filter.Models; using DD.Persistence.Filter.Models;
using DD.Persistence.Filter.Models.Enumerations; using DD.Persistence.Filter.Models.Enumerations;
using DD.Persistence.Filter.TreeBuilder.Expressions.Abstractions;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
namespace DD.Persistence.Filter.Interpreter.Expressions.NonTerminal.Base; namespace DD.Persistence.Filter.TreeBuilder.Expressions.NonTerminal.Abstractions;
/// <summary> /// <summary>
/// Абстрактный класс для нетерминальных выражений /// Абстрактный класс для нетерминальных выражений
@ -20,8 +20,8 @@ abstract class NonTerminalExpression : IExpression
var operation = GetOperation(); var operation = GetOperation();
var operationString = GetOperationString(); var operationString = GetOperationString();
var matches = GetMatches(context, operation, operationString); var matches = GetMatches(context, operationString);
while (matches.Any()) while (matches.Length != 0)
{ {
matches.ForEach(m => matches.ForEach(m =>
{ {
@ -33,29 +33,29 @@ abstract class NonTerminalExpression : IExpression
.Split(separator) .Split(separator)
.Select(e => int.Parse(e)); .Select(e => int.Parse(e));
var leftNode = context.treeNodes var leftNode = context.TreeNodes
.FirstOrDefault(e => e.Key == pair.First()) .FirstOrDefault(e => e.Key == pair.First())
.Value; .Value;
var rigthNode = context.treeNodes var rigthNode = context.TreeNodes
.FirstOrDefault(e => e.Key == pair.Last()) .FirstOrDefault(e => e.Key == pair.Last())
.Value; .Value;
var node = new TVertex(operation, leftNode, rigthNode); var node = new TVertex(operation, leftNode, rigthNode);
var key = context.treeNodes.Count(); var key = context.TreeNodes.Count;
context.treeNodes.Add(key, node); context.TreeNodes.Add(key, node);
var keyString = key.ToString(); var keyString = key.ToString();
context.treeString = context.treeString.Replace(matchString, keyString); context.TreeString = context.TreeString.Replace(matchString, keyString);
}); });
matches = GetMatches(context, operation, operationString); matches = GetMatches(context, operationString);
} }
var isRoot = int.TryParse(context.treeString, out _); var isRoot = int.TryParse(context.TreeString, out _);
if (isRoot) if (isRoot)
{ {
context.treeString = string.Empty; context.TreeString = string.Empty;
context.root = context.treeNodes.Last().Value; context.Root = context.TreeNodes.Last().Value;
} }
} }
@ -69,13 +69,13 @@ abstract class NonTerminalExpression : IExpression
/// <summary> /// <summary>
/// Получить из акткуального состояния строки все совпадения для текущего выражения /// Получить из акткуального состояния строки все совпадения для текущего выражения
/// </summary> /// </summary>
private IEnumerable<Match> GetMatches(InterpreterContext context, OperationEnum operation, string operationString) private static Match[] GetMatches(InterpreterContext context, string operationString)
{ {
string pattern = context.treeString.Contains('(') && context.treeString.Contains(')') string pattern = context.TreeString.Contains('(') && context.TreeString.Contains(')')
? $@"\(\d+{operationString}\d+\)" : $@"\d+{operationString}\d+"; ? $@"\(\d+{operationString}\d+\)" : $@"\d+{operationString}\d+";
Regex regex = new Regex(pattern); Regex regex = new(pattern);
var matches = regex var matches = regex
.Matches(context.treeString) .Matches(context.TreeString)
.ToArray(); .ToArray();
return matches; return matches;

View File

@ -1,7 +1,7 @@
using DD.Persistence.Filter.Interpreter.Expressions.NonTerminal.Base; using DD.Persistence.Filter.Models.Enumerations;
using DD.Persistence.Filter.Models.Enumerations; using DD.Persistence.Filter.TreeBuilder.Expressions.NonTerminal.Abstractions;
namespace DD.Persistence.Filter.Interpreter.Expressions.NonTerminal; namespace DD.Persistence.Filter.TreeBuilder.Expressions.NonTerminal;
/// <summary> /// <summary>
/// Выражение для "И" /// Выражение для "И"

View File

@ -1,7 +1,7 @@
using DD.Persistence.Filter.Interpreter.Expressions.NonTerminal.Base; using DD.Persistence.Filter.Models.Enumerations;
using DD.Persistence.Filter.Models.Enumerations; using DD.Persistence.Filter.TreeBuilder.Expressions.NonTerminal.Abstractions;
namespace DD.Persistence.Filter.Interpreter.Expressions.NonTerminal; namespace DD.Persistence.Filter.TreeBuilder.Expressions.NonTerminal;
/// <summary> /// <summary>
/// Выражение для "ИЛИ" /// Выражение для "ИЛИ"

View File

@ -1,10 +1,10 @@
using DD.Persistence.Extensions; using DD.Persistence.Extensions;
using DD.Persistence.Filter.Interpreter.Expressions.Abstract;
using DD.Persistence.Filter.Models; using DD.Persistence.Filter.Models;
using DD.Persistence.Filter.Models.Enumerations; using DD.Persistence.Filter.Models.Enumerations;
using DD.Persistence.Filter.TreeBuilder.Expressions.Abstractions;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
namespace DD.Persistence.Filter.Interpreter.Expressions.Terminal.Base; namespace DD.Persistence.Filter.TreeBuilder.Expressions.Terminal.Abstract;
/// <summary> /// <summary>
/// Абстрактный класс для терминальных выражений /// Абстрактный класс для терминальных выражений
@ -20,7 +20,7 @@ abstract class TerminalExpression : IExpression
var operation = GetOperation(); var operation = GetOperation();
var operationString = GetOperationString(); var operationString = GetOperationString();
var matches = GetMatches(context, operation, operationString); var matches = GetMatches(context, operationString);
matches.ForEach(m => matches.ForEach(m =>
{ {
var matchString = m.ToString(); var matchString = m.ToString();
@ -34,11 +34,11 @@ abstract class TerminalExpression : IExpression
var value = ParseValue(pair.Last()); var value = ParseValue(pair.Last());
var node = new TLeaf(operation, fieldName, value); var node = new TLeaf(operation, fieldName, value);
var key = context.treeNodes.Count(); var key = context.TreeNodes.Count;
context.treeNodes.Add(key, node); context.TreeNodes.Add(key, node);
var keyString = key.ToString(); var keyString = key.ToString();
context.treeString = context.treeString.Replace(matchString, keyString); context.TreeString = context.TreeString.Replace(matchString, keyString);
}); });
} }
@ -51,16 +51,16 @@ abstract class TerminalExpression : IExpression
/// <summary> /// <summary>
/// Получить из акткуального состояния строки все совпадения для текущего выражения /// Получить из акткуального состояния строки все совпадения для текущего выражения
/// </summary> /// </summary>
private IEnumerable<Match> GetMatches(InterpreterContext context, OperationEnum operation, string operationString) private static Match[] GetMatches(InterpreterContext context, string operationString)
{ {
string pattern = $@"\([^()]*{operationString}.*?\)"; string pattern = $@"\([^()]*{operationString}.*?\)";
Regex regex = new Regex(pattern); Regex regex = new(pattern);
var matches = regex.Matches(context.treeString); var matches = regex.Matches(context.TreeString).ToArray();
return matches; return matches;
} }
private object? ParseValue(string value) private static object? ParseValue(string value)
{ {
value = value.Replace('.', ','); value = value.Replace('.', ',');
if (value.Contains(',') && double.TryParse(value, out _)) if (value.Contains(',') && double.TryParse(value, out _))

View File

@ -1,5 +1,5 @@
using DD.Persistence.Filter.Interpreter.Expressions.Terminal.Base; using DD.Persistence.Filter.Models.Enumerations;
using DD.Persistence.Filter.Models.Enumerations; using DD.Persistence.Filter.TreeBuilder.Expressions.Terminal.Abstract;
namespace DD.Persistence.Filter.TreeBuilder.Expressions.Terminal; namespace DD.Persistence.Filter.TreeBuilder.Expressions.Terminal;

View File

@ -1,5 +1,5 @@
using DD.Persistence.Filter.Interpreter.Expressions.Terminal.Base; using DD.Persistence.Filter.Models.Enumerations;
using DD.Persistence.Filter.Models.Enumerations; using DD.Persistence.Filter.TreeBuilder.Expressions.Terminal.Abstract;
namespace DD.Persistence.Filter.TreeBuilder.Expressions.Terminal; namespace DD.Persistence.Filter.TreeBuilder.Expressions.Terminal;

View File

@ -1,5 +1,5 @@
using DD.Persistence.Filter.Interpreter.Expressions.Terminal.Base; using DD.Persistence.Filter.Models.Enumerations;
using DD.Persistence.Filter.Models.Enumerations; using DD.Persistence.Filter.TreeBuilder.Expressions.Terminal.Abstract;
namespace DD.Persistence.Filter.TreeBuilder.Expressions.Terminal; namespace DD.Persistence.Filter.TreeBuilder.Expressions.Terminal;

View File

@ -1,5 +1,5 @@
using DD.Persistence.Filter.Interpreter.Expressions.Terminal.Base; using DD.Persistence.Filter.Models.Enumerations;
using DD.Persistence.Filter.Models.Enumerations; using DD.Persistence.Filter.TreeBuilder.Expressions.Terminal.Abstract;
namespace DD.Persistence.Filter.TreeBuilder.Expressions.Terminal; namespace DD.Persistence.Filter.TreeBuilder.Expressions.Terminal;

View File

@ -1,5 +1,5 @@
using DD.Persistence.Filter.Interpreter.Expressions.Terminal.Base; using DD.Persistence.Filter.Models.Enumerations;
using DD.Persistence.Filter.Models.Enumerations; using DD.Persistence.Filter.TreeBuilder.Expressions.Terminal.Abstract;
namespace DD.Persistence.Filter.TreeBuilder.Expressions.Terminal; namespace DD.Persistence.Filter.TreeBuilder.Expressions.Terminal;

View File

@ -1,5 +1,5 @@
using DD.Persistence.Filter.Interpreter.Expressions.Terminal.Base; using DD.Persistence.Filter.Models.Enumerations;
using DD.Persistence.Filter.Models.Enumerations; using DD.Persistence.Filter.TreeBuilder.Expressions.Terminal.Abstract;
namespace DD.Persistence.Filter.TreeBuilder.Expressions.Terminal; namespace DD.Persistence.Filter.TreeBuilder.Expressions.Terminal;

View File

@ -1,14 +1,14 @@
using DD.Persistence.Filter.Interpreter.Expressions.Abstract; using DD.Persistence.Filter.Models.Abstractions;
using DD.Persistence.Filter.Interpreter.Expressions.NonTerminal; using DD.Persistence.Filter.TreeBuilder.Expressions.Abstractions;
using DD.Persistence.Filter.Models.Abstractions; using DD.Persistence.Filter.TreeBuilder.Expressions.NonTerminal;
using DD.Persistence.Filter.TreeBuilder.Expressions.Terminal; using DD.Persistence.Filter.TreeBuilder.Expressions.Terminal;
namespace DD.Persistence.Filter.Interpreter; namespace DD.Persistence.Filter.TreeBuilder;
/// <summary> /// <summary>
/// Строитель бинарных деревьев /// Строитель бинарных деревьев
/// </summary> /// </summary>
public static class TreeBuilder public static class FilterTreeBuilder
{ {
/// <summary> /// <summary>
@ -18,35 +18,37 @@ public static class TreeBuilder
/// <returns></returns> /// <returns></returns>
public static TNode? BuildTree(this string treeString) public static TNode? BuildTree(this string treeString)
{ {
InterpreterContext context = new InterpreterContext(treeString); InterpreterContext context = new(treeString);
// Порядок важен // Порядок важен
List<IExpression> terminalExpressions = new List<IExpression> List<IExpression> terminalExpressions =
{ [
new EqualExpression(), new EqualExpression(),
new NotEqualExpression(), new NotEqualExpression(),
new MoreOrEqualExpression(), new MoreOrEqualExpression(),
new LessOrEqualExpression(), new LessOrEqualExpression(),
new MoreExpression(), new MoreExpression(),
new LessExpression() new LessExpression()
}; ];
terminalExpressions.ForEach(e => { terminalExpressions.ForEach(e =>
{
e.Interpret(context); e.Interpret(context);
}); });
// Порядок важен // Порядок важен
List<IExpression> nonTerminalExpressions = new List<IExpression> List<IExpression> nonTerminalExpressions =
{ [
new OrExpression(), new OrExpression(),
new AndExpression() new AndExpression()
}; ];
while (!string.IsNullOrEmpty(context.treeString)) while (!string.IsNullOrEmpty(context.TreeString))
{ {
nonTerminalExpressions.ForEach(e => { nonTerminalExpressions.ForEach(e =>
{
e.Interpret(context); e.Interpret(context);
}); });
} }
return context.root; return context.Root;
} }
} }

View File

@ -1,6 +1,6 @@
using DD.Persistence.Filter.Models.Abstractions; using DD.Persistence.Filter.Models.Abstractions;
namespace DD.Persistence.Filter.Interpreter; namespace DD.Persistence.Filter.TreeBuilder;
/// <summary> /// <summary>
/// Контекст интерпретатора /// Контекст интерпретатора
@ -10,21 +10,21 @@ class InterpreterContext
/// <summary> /// <summary>
/// Корень дерева (результат интерпретации) /// Корень дерева (результат интерпретации)
/// </summary> /// </summary>
public TNode? root { get; set; } public TNode? Root { get; set; }
/// <summary> /// <summary>
/// Дерево в виде строки (входной параметр) /// Дерево в виде строки (входной параметр)
/// </summary> /// </summary>
public string treeString { get; set; } public string TreeString { get; set; }
/// <summary> /// <summary>
/// Проиндексированные вершины дерева /// Проиндексированные вершины дерева
/// </summary> /// </summary>
public Dictionary<int, TNode> treeNodes { get; set; } = []; public Dictionary<int, TNode> TreeNodes { get; set; } = [];
/// <inheritdoc/> /// <inheritdoc/>
public InterpreterContext(string theeString) public InterpreterContext(string theeString)
{ {
this.treeString = theeString; TreeString = theeString;
} }
} }