Правки по ревью #3
This commit is contained in:
parent
560073ed07
commit
63e6816e35
@ -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);
|
||||||
|
|
||||||
|
@ -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\")";
|
@ -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>
|
||||||
/// Интерфейс для выражений
|
/// Интерфейс для выражений
|
||||||
|
@ -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;
|
||||||
|
@ -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>
|
||||||
/// Выражение для "И"
|
/// Выражение для "И"
|
||||||
|
@ -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>
|
||||||
/// Выражение для "ИЛИ"
|
/// Выражение для "ИЛИ"
|
||||||
|
@ -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 _))
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user