diff --git a/DD.Persistence.Repository.Test/SetpointRepositoryShould.cs b/DD.Persistence.Repository.Test/SetpointRepositoryShould.cs index 44c518a..d9fc3e4 100644 --- a/DD.Persistence.Repository.Test/SetpointRepositoryShould.cs +++ b/DD.Persistence.Repository.Test/SetpointRepositoryShould.cs @@ -24,7 +24,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/TimestampedValuesServiceShould.cs b/DD.Persistence.Test/TimestampedValuesServiceShould.cs index 0acb6de..165d4e0 100644 --- a/DD.Persistence.Test/TimestampedValuesServiceShould.cs +++ b/DD.Persistence.Test/TimestampedValuesServiceShould.cs @@ -3,12 +3,12 @@ using DD.Persistence.Repositories; using DD.Persistence.Services; using NSubstitute; -namespace DD.Persistence.Repository.Test; +namespace DD.Persistence.Test; public class TimestampedValuesServiceShould { private readonly ITimestampedValuesRepository timestampedValuesRepository = Substitute.For(); private readonly IDataSchemeRepository dataSchemeRepository = Substitute.For(); - private TimestampedValuesService timestampedValuesService; + private readonly TimestampedValuesService timestampedValuesService; public TimestampedValuesServiceShould() { @@ -40,7 +40,6 @@ public class TimestampedValuesServiceShould private static IEnumerable Generate(int countToCreate, DateTimeOffset from) { - var result = new List(); for (int i = 0; i < countToCreate; i++) { var values = new Dictionary() 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/Abstractions/ITreeBuilder.cs b/DD.Persistence/Filter/TreeBuilder/Abstractions/ITreeBuilder.cs deleted file mode 100644 index b512a53..0000000 --- a/DD.Persistence/Filter/TreeBuilder/Abstractions/ITreeBuilder.cs +++ /dev/null @@ -1,16 +0,0 @@ -using DD.Persistence.Filter.Models.Abstractions; - -namespace DD.Persistence.Filter.Interpreter.Abstractions; - -/// -/// Интерпретатор для построения дерева -/// -public interface ITreeBuilder -{ - /// - /// Построить дерево - /// - /// Дерево в виде строки - /// Корень дерева в виде вершины - TNode? Build(string treeString); -} \ No newline at end of file diff --git a/DD.Persistence/Filter/TreeBuilder/Expressions/Abstractions/IExpression.cs b/DD.Persistence/Filter/TreeBuilder/Expressions/Abstractions/IExpression.cs index b28bde8..8a5a526 100644 --- a/DD.Persistence/Filter/TreeBuilder/Expressions/Abstractions/IExpression.cs +++ b/DD.Persistence/Filter/TreeBuilder/Expressions/Abstractions/IExpression.cs @@ -1,27 +1,27 @@ using DD.Persistence.Filter.Models.Enumerations; -namespace DD.Persistence.Filter.Interpreter.Expressions.Abstract; +namespace DD.Persistence.Filter.TreeBuilder.Expressions.Abstractions; /// /// Интерфейс для выражений /// -public interface IExpression +interface IExpression { /// /// Получить логическую операцию /// /// - public OperationEnum GetOperation(); + OperationEnum GetOperation(); /// /// Получить логическую операцию в виде строки (для регулярных выражений) /// /// - public string GetOperationString(); + string GetOperationString(); /// /// Реализация правила /// /// - public void Interpret(InterpreterContext context); + void Interpret(InterpreterContext context); } diff --git a/DD.Persistence/Filter/TreeBuilder/Expressions/NonTerminal/Abstractions/NonTerminalExpression.cs b/DD.Persistence/Filter/TreeBuilder/Expressions/NonTerminal/Abstractions/NonTerminalExpression.cs index 137ec4b..5ce524b 100644 --- a/DD.Persistence/Filter/TreeBuilder/Expressions/NonTerminal/Abstractions/NonTerminalExpression.cs +++ b/DD.Persistence/Filter/TreeBuilder/Expressions/NonTerminal/Abstractions/NonTerminalExpression.cs @@ -1,15 +1,15 @@ 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; /// /// Абстрактный класс для нетерминальных выражений /// -public abstract class NonTerminalExpression : IExpression +abstract class NonTerminalExpression : IExpression { /// /// Реализация правила для нетерминальных выражений @@ -20,8 +20,8 @@ public 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 @@ public 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 @@ public 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 4a3d363..9af8dbe 100644 --- a/DD.Persistence/Filter/TreeBuilder/Expressions/NonTerminal/AndExpression.cs +++ b/DD.Persistence/Filter/TreeBuilder/Expressions/NonTerminal/AndExpression.cs @@ -1,12 +1,12 @@ -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; /// /// Выражение для "И" /// -public class AndExpression : NonTerminalExpression +class AndExpression : NonTerminalExpression { private const string AndString = "&&"; diff --git a/DD.Persistence/Filter/TreeBuilder/Expressions/NonTerminal/OrExpression.cs b/DD.Persistence/Filter/TreeBuilder/Expressions/NonTerminal/OrExpression.cs index e47b935..4be21bf 100644 --- a/DD.Persistence/Filter/TreeBuilder/Expressions/NonTerminal/OrExpression.cs +++ b/DD.Persistence/Filter/TreeBuilder/Expressions/NonTerminal/OrExpression.cs @@ -1,12 +1,12 @@ -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; /// /// Выражение для "ИЛИ" /// -public class OrExpression : NonTerminalExpression +class OrExpression : NonTerminalExpression { private const string OrString = @"\|\|"; diff --git a/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/Abstract/TerminalExpression.cs b/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/Abstract/TerminalExpression.cs index ada1f56..1d13d6b 100644 --- a/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/Abstract/TerminalExpression.cs +++ b/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/Abstract/TerminalExpression.cs @@ -1,15 +1,15 @@ 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; /// /// Абстрактный класс для терминальных выражений /// -public abstract class TerminalExpression : IExpression +abstract class TerminalExpression : IExpression { /// /// Реализация правила для терминальных выражений @@ -20,7 +20,7 @@ public 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 @@ public 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 @@ public 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 4c78e36..3c79045 100644 --- a/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/EqualExpression.cs +++ b/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/EqualExpression.cs @@ -1,12 +1,12 @@ -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; /// /// Выражение для "РАВНО" /// -public class EqualExpression : TerminalExpression +class EqualExpression : TerminalExpression { private const string EqualString = "=="; diff --git a/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/LessExpression.cs b/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/LessExpression.cs index a7e6902..dbbdf3c 100644 --- a/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/LessExpression.cs +++ b/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/LessExpression.cs @@ -1,12 +1,12 @@ -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; /// /// Выражение для "МЕНЬШЕ" /// -public class LessExpression : TerminalExpression +class LessExpression : TerminalExpression { private const string EqualString = "<"; diff --git a/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/LessOrEqualExpression.cs b/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/LessOrEqualExpression.cs index 9a5c6be..c9514e5 100644 --- a/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/LessOrEqualExpression.cs +++ b/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/LessOrEqualExpression.cs @@ -1,12 +1,12 @@ -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; /// /// Выражение для "МЕНЬШЕ ЛИБО РАВНО" /// -public class LessOrEqualExpression : TerminalExpression +class LessOrEqualExpression : TerminalExpression { private const string EqualString = "<="; diff --git a/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/MoreExpression.cs b/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/MoreExpression.cs index 0d6c8b0..6cdca36 100644 --- a/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/MoreExpression.cs +++ b/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/MoreExpression.cs @@ -1,12 +1,12 @@ -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; /// /// Выражение для "БОЛЬШЕ" /// -public class MoreExpression : TerminalExpression +class MoreExpression : TerminalExpression { private const string EqualString = ">"; diff --git a/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/MoreOrEqualExpression.cs b/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/MoreOrEqualExpression.cs index 1dd2db4..d0e13e3 100644 --- a/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/MoreOrEqualExpression.cs +++ b/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/MoreOrEqualExpression.cs @@ -1,12 +1,12 @@ -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; /// /// Выражение для "БОЛЬШЕ ЛИБО РАВНО" /// -public class MoreOrEqualExpression : TerminalExpression +class MoreOrEqualExpression : TerminalExpression { private const string EqualString = ">="; diff --git a/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/NotEqualExpression.cs b/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/NotEqualExpression.cs index b51817a..66662c6 100644 --- a/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/NotEqualExpression.cs +++ b/DD.Persistence/Filter/TreeBuilder/Expressions/Terminal/NotEqualExpression.cs @@ -1,12 +1,12 @@ -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; /// /// Выражение для "НЕРАВНО" /// -public class NotEqualExpression : TerminalExpression +class NotEqualExpression : TerminalExpression { private const string NotEqulString = "!="; 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 72e0384..3471f8d 100644 --- a/DD.Persistence/Filter/TreeBuilder/InterpreterContext.cs +++ b/DD.Persistence/Filter/TreeBuilder/InterpreterContext.cs @@ -1,30 +1,30 @@ using DD.Persistence.Filter.Models.Abstractions; -namespace DD.Persistence.Filter.Interpreter; +namespace DD.Persistence.Filter.TreeBuilder; /// /// Контекст интерпретатора /// -public class InterpreterContext +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; } }