From 63e6816e350c49b50859e3fed31771c490089f1a Mon Sep 17 00:00:00 2001 From: Roman Efremov Date: Wed, 5 Feb 2025 12:10:01 +0500 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20=D0=BF?= =?UTF-8?q?=D0=BE=20=D1=80=D0=B5=D0=B2=D1=8C=D1=8E=20#3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SetpointRepositoryShould.cs | 1 - ...reeBuilderShould.cs => TreeBuilderTest.cs} | 12 +++---- .../Expressions/Abstractions/IExpression.cs | 2 +- .../Abstractions/NonTerminalExpression.cs | 34 +++++++++---------- .../Expressions/NonTerminal/AndExpression.cs | 6 ++-- .../Expressions/NonTerminal/OrExpression.cs | 6 ++-- .../Terminal/Abstract/TerminalExpression.cs | 20 +++++------ .../Expressions/Terminal/EqualExpression.cs | 4 +-- .../Expressions/Terminal/LessExpression.cs | 4 +-- .../Terminal/LessOrEqualExpression.cs | 4 +-- .../Expressions/Terminal/MoreExpression.cs | 4 +-- .../Terminal/MoreOrEqualExpression.cs | 4 +-- .../Terminal/NotEqualExpression.cs | 4 +-- .../{TreeBuilder.cs => FilterTreeBuilder.cs} | 34 ++++++++++--------- .../Filter/TreeBuilder/InterpreterContext.cs | 10 +++--- 15 files changed, 75 insertions(+), 74 deletions(-) rename DD.Persistence.Test/{TreeBuilderShould.cs => TreeBuilderTest.cs} (93%) rename DD.Persistence/Filter/TreeBuilder/{TreeBuilder.cs => FilterTreeBuilder.cs} (58%) diff --git a/DD.Persistence.Repository.Test/SetpointRepositoryShould.cs b/DD.Persistence.Repository.Test/SetpointRepositoryShould.cs index 6b05ff3..c9f6088 100644 --- a/DD.Persistence.Repository.Test/SetpointRepositoryShould.cs +++ b/DD.Persistence.Repository.Test/SetpointRepositoryShould.cs @@ -29,7 +29,6 @@ public class SetpointRepositoryShould : IClassFixture var value = GetJsonFromObject(22); await sut.Add(id, value, Guid.NewGuid(), CancellationToken.None); - var t = fixture.dbContainer.GetConnectionString(); //act var result = await sut.GetCurrent([id], CancellationToken.None); diff --git a/DD.Persistence.Test/TreeBuilderShould.cs b/DD.Persistence.Test/TreeBuilderTest.cs similarity index 93% rename from DD.Persistence.Test/TreeBuilderShould.cs rename to DD.Persistence.Test/TreeBuilderTest.cs index f96f85b..1259ca7 100644 --- a/DD.Persistence.Test/TreeBuilderShould.cs +++ b/DD.Persistence.Test/TreeBuilderTest.cs @@ -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.TreeBuilder; using Newtonsoft.Json; namespace DD.Persistence.Test; -public class TreeBuilderShould +public class TreeBuilderTest { [Fact] - public void TestTreeBuilding() + public void TreeBuildingShouldBuilt() { //arrange var treeString = "(\"A\"==1)||(\"B\"==2)&&(\"C\"==3)||((\"D\"==4)||(\"E\"==5))&&(\"F\"==6)"; @@ -44,7 +44,7 @@ public class TreeBuilderShould } [Fact] - public void TestTreeOperations() + public void TreeOperationsShouldBuilt() { //arrange var treeString = "(\"A\"==1)||(\"B\"!=1)||(\"C\">1)||(\"D\">=1)||(\"E\"<1)||(\"F\"<=1)"; @@ -81,7 +81,7 @@ public class TreeBuilderShould } [Fact] - public void TestLeafValues() + public void LeafValuesShouldBuilt() { //arrange var treeString = "(\"A\"==1.2345)||(\"B\"==12345)||(\"C\"==\"12345\")"; diff --git a/DD.Persistence/Filter/TreeBuilder/Expressions/Abstractions/IExpression.cs b/DD.Persistence/Filter/TreeBuilder/Expressions/Abstractions/IExpression.cs index c1418bf..8a5a526 100644 --- a/DD.Persistence/Filter/TreeBuilder/Expressions/Abstractions/IExpression.cs +++ b/DD.Persistence/Filter/TreeBuilder/Expressions/Abstractions/IExpression.cs @@ -1,6 +1,6 @@ using DD.Persistence.Filter.Models.Enumerations; -namespace DD.Persistence.Filter.Interpreter.Expressions.Abstract; +namespace DD.Persistence.Filter.TreeBuilder.Expressions.Abstractions; /// /// Интерфейс для выражений diff --git a/DD.Persistence/Filter/TreeBuilder/Expressions/NonTerminal/Abstractions/NonTerminalExpression.cs b/DD.Persistence/Filter/TreeBuilder/Expressions/NonTerminal/Abstractions/NonTerminalExpression.cs index d543b8b..5ce524b 100644 --- a/DD.Persistence/Filter/TreeBuilder/Expressions/NonTerminal/Abstractions/NonTerminalExpression.cs +++ b/DD.Persistence/Filter/TreeBuilder/Expressions/NonTerminal/Abstractions/NonTerminalExpression.cs @@ -1,10 +1,10 @@ using DD.Persistence.Extensions; -using DD.Persistence.Filter.Interpreter.Expressions.Abstract; using DD.Persistence.Filter.Models; using DD.Persistence.Filter.Models.Enumerations; +using DD.Persistence.Filter.TreeBuilder.Expressions.Abstractions; using System.Text.RegularExpressions; -namespace DD.Persistence.Filter.Interpreter.Expressions.NonTerminal.Base; +namespace DD.Persistence.Filter.TreeBuilder.Expressions.NonTerminal.Abstractions; /// /// Абстрактный класс для нетерминальных выражений @@ -20,8 +20,8 @@ abstract class NonTerminalExpression : IExpression var operation = GetOperation(); var operationString = GetOperationString(); - var matches = GetMatches(context, operation, operationString); - while (matches.Any()) + var matches = GetMatches(context, operationString); + while (matches.Length != 0) { matches.ForEach(m => { @@ -33,29 +33,29 @@ abstract class NonTerminalExpression : IExpression .Split(separator) .Select(e => int.Parse(e)); - var leftNode = context.treeNodes + var leftNode = context.TreeNodes .FirstOrDefault(e => e.Key == pair.First()) .Value; - var rigthNode = context.treeNodes + var rigthNode = context.TreeNodes .FirstOrDefault(e => e.Key == pair.Last()) .Value; var node = new TVertex(operation, leftNode, rigthNode); - var key = context.treeNodes.Count(); - context.treeNodes.Add(key, node); + var key = context.TreeNodes.Count; + context.TreeNodes.Add(key, node); 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) { - context.treeString = string.Empty; - context.root = context.treeNodes.Last().Value; + context.TreeString = string.Empty; + context.Root = context.TreeNodes.Last().Value; } } @@ -69,13 +69,13 @@ abstract class NonTerminalExpression : IExpression /// /// Получить из акткуального состояния строки все совпадения для текущего выражения /// - private IEnumerable 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+"; - Regex regex = new Regex(pattern); + Regex regex = new(pattern); var matches = regex - .Matches(context.treeString) + .Matches(context.TreeString) .ToArray(); return matches; diff --git a/DD.Persistence/Filter/TreeBuilder/Expressions/NonTerminal/AndExpression.cs b/DD.Persistence/Filter/TreeBuilder/Expressions/NonTerminal/AndExpression.cs index 599315c..9af8dbe 100644 --- a/DD.Persistence/Filter/TreeBuilder/Expressions/NonTerminal/AndExpression.cs +++ b/DD.Persistence/Filter/TreeBuilder/Expressions/NonTerminal/AndExpression.cs @@ -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; /// /// Выражение для "И" diff --git a/DD.Persistence/Filter/TreeBuilder/Expressions/NonTerminal/OrExpression.cs b/DD.Persistence/Filter/TreeBuilder/Expressions/NonTerminal/OrExpression.cs index 6aa6c69..4be21bf 100644 --- a/DD.Persistence/Filter/TreeBuilder/Expressions/NonTerminal/OrExpression.cs +++ b/DD.Persistence/Filter/TreeBuilder/Expressions/NonTerminal/OrExpression.cs @@ -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; /// /// Выражение для "ИЛИ" diff --git a/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/Abstract/TerminalExpression.cs b/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/Abstract/TerminalExpression.cs index 5d2caed..1d13d6b 100644 --- a/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/Abstract/TerminalExpression.cs +++ b/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/Abstract/TerminalExpression.cs @@ -1,10 +1,10 @@ using DD.Persistence.Extensions; -using DD.Persistence.Filter.Interpreter.Expressions.Abstract; using DD.Persistence.Filter.Models; using DD.Persistence.Filter.Models.Enumerations; +using DD.Persistence.Filter.TreeBuilder.Expressions.Abstractions; using System.Text.RegularExpressions; -namespace DD.Persistence.Filter.Interpreter.Expressions.Terminal.Base; +namespace DD.Persistence.Filter.TreeBuilder.Expressions.Terminal.Abstract; /// /// Абстрактный класс для терминальных выражений @@ -20,7 +20,7 @@ abstract class TerminalExpression : IExpression var operation = GetOperation(); var operationString = GetOperationString(); - var matches = GetMatches(context, operation, operationString); + var matches = GetMatches(context, operationString); matches.ForEach(m => { var matchString = m.ToString(); @@ -34,11 +34,11 @@ abstract class TerminalExpression : IExpression var value = ParseValue(pair.Last()); var node = new TLeaf(operation, fieldName, value); - var key = context.treeNodes.Count(); - context.treeNodes.Add(key, node); + var key = context.TreeNodes.Count; + context.TreeNodes.Add(key, node); 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 /// /// Получить из акткуального состояния строки все совпадения для текущего выражения /// - private IEnumerable GetMatches(InterpreterContext context, OperationEnum operation, string operationString) + private static Match[] GetMatches(InterpreterContext context, string operationString) { string pattern = $@"\([^()]*{operationString}.*?\)"; - Regex regex = new Regex(pattern); - var matches = regex.Matches(context.treeString); + Regex regex = new(pattern); + var matches = regex.Matches(context.TreeString).ToArray(); return matches; } - private object? ParseValue(string value) + private static object? ParseValue(string value) { value = value.Replace('.', ','); if (value.Contains(',') && double.TryParse(value, out _)) diff --git a/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/EqualExpression.cs b/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/EqualExpression.cs index aec5a6b..3c79045 100644 --- a/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/EqualExpression.cs +++ b/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/EqualExpression.cs @@ -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; diff --git a/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/LessExpression.cs b/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/LessExpression.cs index 7382e87..dbbdf3c 100644 --- a/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/LessExpression.cs +++ b/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/LessExpression.cs @@ -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; diff --git a/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/LessOrEqualExpression.cs b/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/LessOrEqualExpression.cs index c706843..c9514e5 100644 --- a/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/LessOrEqualExpression.cs +++ b/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/LessOrEqualExpression.cs @@ -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; diff --git a/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/MoreExpression.cs b/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/MoreExpression.cs index cbc3d82..6cdca36 100644 --- a/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/MoreExpression.cs +++ b/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/MoreExpression.cs @@ -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; diff --git a/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/MoreOrEqualExpression.cs b/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/MoreOrEqualExpression.cs index a6a8345..d0e13e3 100644 --- a/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/MoreOrEqualExpression.cs +++ b/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/MoreOrEqualExpression.cs @@ -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; diff --git a/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/NotEqualExpression.cs b/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/NotEqualExpression.cs index 49031f1..66662c6 100644 --- a/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/NotEqualExpression.cs +++ b/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/NotEqualExpression.cs @@ -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; diff --git a/DD.Persistence/Filter/TreeBuilder/TreeBuilder.cs b/DD.Persistence/Filter/TreeBuilder/FilterTreeBuilder.cs similarity index 58% rename from DD.Persistence/Filter/TreeBuilder/TreeBuilder.cs rename to DD.Persistence/Filter/TreeBuilder/FilterTreeBuilder.cs index 224c74c..4112e21 100644 --- a/DD.Persistence/Filter/TreeBuilder/TreeBuilder.cs +++ b/DD.Persistence/Filter/TreeBuilder/FilterTreeBuilder.cs @@ -1,14 +1,14 @@ -using DD.Persistence.Filter.Interpreter.Expressions.Abstract; -using DD.Persistence.Filter.Interpreter.Expressions.NonTerminal; -using DD.Persistence.Filter.Models.Abstractions; +using DD.Persistence.Filter.Models.Abstractions; +using DD.Persistence.Filter.TreeBuilder.Expressions.Abstractions; +using DD.Persistence.Filter.TreeBuilder.Expressions.NonTerminal; using DD.Persistence.Filter.TreeBuilder.Expressions.Terminal; -namespace DD.Persistence.Filter.Interpreter; +namespace DD.Persistence.Filter.TreeBuilder; /// /// Строитель бинарных деревьев /// -public static class TreeBuilder +public static class FilterTreeBuilder { /// @@ -18,35 +18,37 @@ public static class TreeBuilder /// public static TNode? BuildTree(this string treeString) { - InterpreterContext context = new InterpreterContext(treeString); + InterpreterContext context = new(treeString); // Порядок важен - List terminalExpressions = new List - { + List terminalExpressions = + [ new EqualExpression(), new NotEqualExpression(), new MoreOrEqualExpression(), new LessOrEqualExpression(), new MoreExpression(), new LessExpression() - }; - terminalExpressions.ForEach(e => { + ]; + terminalExpressions.ForEach(e => + { e.Interpret(context); }); // Порядок важен - List nonTerminalExpressions = new List - { + List nonTerminalExpressions = + [ new OrExpression(), new AndExpression() - }; - while (!string.IsNullOrEmpty(context.treeString)) + ]; + while (!string.IsNullOrEmpty(context.TreeString)) { - nonTerminalExpressions.ForEach(e => { + nonTerminalExpressions.ForEach(e => + { e.Interpret(context); }); } - return context.root; + return context.Root; } } diff --git a/DD.Persistence/Filter/TreeBuilder/InterpreterContext.cs b/DD.Persistence/Filter/TreeBuilder/InterpreterContext.cs index 86e0ef8..3471f8d 100644 --- a/DD.Persistence/Filter/TreeBuilder/InterpreterContext.cs +++ b/DD.Persistence/Filter/TreeBuilder/InterpreterContext.cs @@ -1,6 +1,6 @@ using DD.Persistence.Filter.Models.Abstractions; -namespace DD.Persistence.Filter.Interpreter; +namespace DD.Persistence.Filter.TreeBuilder; /// /// Контекст интерпретатора @@ -10,21 +10,21 @@ class InterpreterContext /// /// Корень дерева (результат интерпретации) /// - public TNode? root { get; set; } + public TNode? Root { get; set; } /// /// Дерево в виде строки (входной параметр) /// - public string treeString { get; set; } + public string TreeString { get; set; } /// /// Проиндексированные вершины дерева /// - public Dictionary treeNodes { get; set; } = []; + public Dictionary TreeNodes { get; set; } = []; /// public InterpreterContext(string theeString) { - this.treeString = theeString; + TreeString = theeString; } }