Skip to content

Commit 8834056

Browse files
committed
добавил правила в кастомные
1 parent b0524bf commit 8834056

File tree

13 files changed

+138
-9
lines changed

13 files changed

+138
-9
lines changed

vtb.backend/SqlAnalyzer.Api/Controllers/Algorithm/SqlAnalyzeRuleController.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,27 +17,39 @@ public SqlAnalyzeRuleController(ISqlAnalyzeRuleService service)
1717
_service = service;
1818
}
1919

20+
/// <summary>
21+
/// Ищет все кастомные правила для аналища SQL
22+
/// </summary>
2023
[HttpGet("find")]
2124
public async Task<IReadOnlyCollection<SqlAnalyzeRuleDto>> Find([FromQuery] int? skip, [FromQuery] int? take, [FromQuery] IReadOnlyCollection<Guid>? ids)
2225
{
2326
var result = await _service.Find(ids, skip, take);
2427
return result;
2528
}
2629

30+
/// <summary>
31+
/// Создает новое кастомное правило для анализа SQL
32+
/// </summary>
2733
[HttpPost]
2834
public async Task<IActionResult> Create([FromBody] [Required] SqlAnalyzeRuleCreateDto dto)
2935
{
3036
var id = await _service.Create(dto);
3137
return Ok(new SimpleDto<Guid>(id));
3238
}
3339

40+
/// <summary>
41+
/// Обновляет кастомное правило
42+
/// </summary>
3443
[HttpPatch]
3544
public async Task<ActionResult> Update([FromBody] [Required] SqlAnalyzeRuleUpdateDto dto)
3645
{
3746
await _service.Update(dto);
3847
return NoContent();
3948
}
4049

50+
/// <summary>
51+
/// Удаляет кастомное правило
52+
/// </summary>
4153
[HttpDelete("{id:guid}")]
4254
public async Task<ActionResult> Delete([FromRoute] Guid id)
4355
{

vtb.backend/SqlAnalyzer.Api/Controllers/QueryAnalysis/QueryAnalysisController.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,10 @@ public async Task<ActionResult<QueryDto>> Get([FromRoute] Guid queryId)
6969
}
7070

7171
/// <summary>
72-
/// Анализирует запрос алгоритмически + по флагу useLlm может выдать рекомендации от LLM и оптимизированный запрос
72+
/// Анализирует запрос
73+
/// 1 - системными правилами для sql и explain
74+
/// 2 - по флагу useLlm может выдать проблемы и рекомендации от LLM а также сравнение двух запросов
75+
/// 3 - по ruleIds может проверять запрос по кастомным правилам, если ruleIds не передали, будет проверять по всем правилам
7376
/// </summary>
7477
[HttpPost("{queryId:guid}/analyze")]
7578
public async Task<ActionResult<QueryAnalysisResultDto>> Analyze(

vtb.backend/SqlAnalyzer.Api/Program.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
using SqlAnalyzer.Api.Services.LlmClient.Interfaces;
1414
using SqlAnalyzer.Api.Services.QueryAnalysis;
1515
using SqlAnalyzer.Api.Services.QueryAnalysis.Interfaces;
16+
using SqlAnalyzer.Api.Services.RuleSeeder;
1617
using SqlAnalyzer.Api.Services.SubstituteValuesToSql.Interfaces;
1718
using SqlAnalyzerLib.LibExtensions;
1819

@@ -102,6 +103,7 @@
102103

103104
db.Database.SetCommandTimeout(TimeSpan.FromMinutes(5));
104105
await db.Database.MigrateAsync();
106+
await CustomRuleSeeder.AddCustomRules(db);
105107
}
106108

107109
app.UseCors(x => x
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
using System.Text.Json;
2+
using Microsoft.EntityFrameworkCore;
3+
using SqlAnalyzer.Api.Dal;
4+
using SqlAnalyzer.Api.Dal.Entities.Algorithm;
5+
6+
namespace SqlAnalyzer.Api.Services.RuleSeeder;
7+
8+
public static class CustomRuleSeeder
9+
{
10+
private const string Path = "baseSqlRules.json";
11+
12+
public static async Task AddCustomRules(DataContext db)
13+
{
14+
if (await db.SqlAnalyzeRules.CountAsync() > 0)
15+
{
16+
return;
17+
}
18+
19+
var rules = JsonSerializer.Deserialize<IReadOnlyCollection<SqlAnalyzeRule>>(
20+
await File.ReadAllTextAsync(Path),
21+
new JsonSerializerOptions {PropertyNameCaseInsensitive = true}
22+
23+
);
24+
if (rules is not null && rules.Count > 0)
25+
{
26+
db.SqlAnalyzeRules.AddRange(rules);
27+
await db.SaveChangesAsync();
28+
}
29+
}
30+
}

vtb.backend/SqlAnalyzer.Api/SqlAnalyzerLib/SqlStaticAnalysis/Constants/StaticRuleProblemsDescriptions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ public static class StaticRuleProblemsDescriptions
99

1010
public const string TypeMismatchUuidComparisonProblemDescription = "Найдено сравнение с UUID-форматной строкой без явного ::uuid.";
1111
public const string TypeMismatchDateComparisonProblemDescription = "Найдено сравнение с датой/временем в виде строки без явного типа.";
12-
public const string TypeMismatchNumericComparisonProblemDescription = "Найдено сравнение колонки с численной строкой (например, col = '123').";
12+
public const string TypeMismatchNumericComparisonProblemDescription = "Найдено сравнение колонки с численной строкой.";
1313

1414
public const string LeadingWildcardLikeProblemDescription = "LIKE/ILIKE начинается с '%', обычный btree-индекс не поможет.";
1515
public const string SelectStarProblemDescription = "Использование SELECT * приводит к передаче лишних данных и неопределённости.";

vtb.backend/SqlAnalyzer.Api/SqlAnalyzerLib/SqlStaticAnalysis/Rules/FunctionOnColumnRule.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ namespace SqlAnalyzerLib.SqlStaticAnalysis.Rules;
1010
/// Проверка наличия функций на индексируемых колонках (например, LOWER(col)).
1111
/// Ищет частые функции, которые делают выражение не sargable.
1212
/// </summary>
13-
public sealed class FunctionOnColumnRule : IStaticRule
13+
public sealed class FunctionOnColumnRule // : IStaticRule
1414
{
1515
/// <inheritdoc />
1616
public StaticRules Code => StaticRules.FunctionOnColumn;

vtb.backend/SqlAnalyzer.Api/SqlAnalyzerLib/SqlStaticAnalysis/Rules/LeadingWildcardLikeRule.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ namespace SqlAnalyzerLib.SqlStaticAnalysis.Rules;
1010
/// Проверка LIKE/ILIKE с ведущим подстановочным знаком.
1111
/// Предлагает trigram/Gin индекс для подстрочных поисков.
1212
/// </summary>
13-
public sealed class LeadingWildcardLikeRule : IStaticRule
13+
public sealed class LeadingWildcardLikeRule // : IStaticRule
1414
{
1515
/// <inheritdoc />
1616
public StaticRules Code => StaticRules.LeadingWildcardLike;

vtb.backend/SqlAnalyzer.Api/SqlAnalyzerLib/SqlStaticAnalysis/Rules/NotInNullsRule.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ namespace SqlAnalyzerLib.SqlStaticAnalysis.Rules;
99
/// <summary>
1010
/// Проверка NOT IN — рекомендует NOT EXISTS для корректной работы с NULL и предотвращения неожиданных результатов.
1111
/// </summary>
12-
public sealed class NotInNullsRule : IStaticRule
12+
public sealed class NotInNullsRule //: IStaticRule
1313
{
1414
/// <inheritdoc />
1515
public StaticRules Code => StaticRules.NotInNulls;

vtb.backend/SqlAnalyzer.Api/SqlAnalyzerLib/SqlStaticAnalysis/Rules/OffsetPaginationRule.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ namespace SqlAnalyzerLib.SqlStaticAnalysis.Rules;
99
/// <summary>
1010
/// Проверка OFFSET (пагинация). Предупреждает об эффективности при больших смещениях.
1111
/// </summary>
12-
public sealed class OffsetPaginationRule : IStaticRule
12+
public sealed class OffsetPaginationRule //: IStaticRule
1313
{
1414
/// <inheritdoc />
1515
public StaticRules Code => StaticRules.OffsetPagination;

vtb.backend/SqlAnalyzer.Api/SqlAnalyzerLib/SqlStaticAnalysis/Rules/SelectStarRule.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ namespace SqlAnalyzerLib.SqlStaticAnalysis.Rules;
99
/// <summary>
1010
/// Проверка использования SELECT * — рекомендует выбирать явные колонки.
1111
/// </summary>
12-
public sealed class SelectStarRule : IStaticRule
12+
public sealed class SelectStarRule //: IStaticRule
1313
{
1414
/// <inheritdoc />
1515
public StaticRules Code => StaticRules.SelectStar;

0 commit comments

Comments
 (0)