-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSQLAliasGenerator.pas
More file actions
106 lines (86 loc) · 2.81 KB
/
Copy pathSQLAliasGenerator.pas
File metadata and controls
106 lines (86 loc) · 2.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
unit SQLAliasGenerator;
interface
uses
System.SysUtils, System.Classes, Vcl.StdCtrls, System.RegularExpressions,
System.Generics.Collections, cxTextEdit, cxMemo, cxRichEdit;
type
TSQLAliasProcessor = class
private
function ExtractTableAliases(const SQLText : string) : TDictionary<string, string>;
function ProcessSQLWithAliases(const SQLText : string; TableAliases : TDictionary<string, string>) : string;
public
procedure ApplySQLAliases(RichEdit : TcxRichEdit);
end;
implementation
{ Extrae los alias de las tablas de la consulta SQL }
function TSQLAliasProcessor.ExtractTableAliases(const SQLText : string) : TDictionary<string, string>;
var
TableAliases : TDictionary<string, string>;
Lines : TArray<string>;
Line : string;
Match : TMatch;
Regex : TRegEx;
begin
TableAliases := TDictionary<string, string>.Create;
// Patrones para encontrar alias de tablas en diferentes contextos
Regex := TRegEx.Create(
'(FROM|INNER JOIN|LEFT JOIN|RIGHT JOIN)\s+(\w+)\s+(\w+)',
[roIgnoreCase]
);
// Dividir el texto en líneas y eliminar saltos de línea extra
Lines := TRegEx.Split(SQLText, '\r?\n');
for Line in Lines do
begin
Match := Regex.Match(Line);
if Match.Success then
begin
// La tabla original es el segundo grupo, el alias es el tercero
TableAliases.AddOrSetValue(Match.Groups[2].Value, Match.Groups[3].Value);
end;
end;
Result := TableAliases;
end;
{ Procesa el SQL reemplazando nombres de tablas con sus alias }
function TSQLAliasProcessor.ProcessSQLWithAliases(const SQLText : string;
TableAliases : TDictionary<string, string>) : string;
var
ResultText : string;
TableName, Alias : string;
begin
ResultText := SQLText;
// Reemplazar nombres de tablas en la cláusula SELECT
for TableName in TableAliases.Keys do
begin
Alias := TableAliases[TableName];
// Reemplazar en SELECT
ResultText := TRegEx.Replace(
ResultText, '\b' + TableName + '\.([\w_]+)\b',
Alias + '.$1', [roIgnoreCase] );
// Reemplazar en JOIN y condiciones
ResultText := TRegEx.Replace(
ResultText, '\b' + TableName + '\.([\w_]+)\b',
Alias + '.$1', [roIgnoreCase] );
end;
Result := ResultText;
end;
{ Aplica los alias al Memo }
procedure TSQLAliasProcessor.ApplySQLAliases(RichEdit : TcxRichEdit);
var
TableAliases : TDictionary<string, string>;
ProcessedSQL : string;
begin
// Verificar que el RichEdit no sea nil
if RichEdit = nil then
Exit;
// Extraer aliases de tablas
TableAliases := ExtractTableAliases(RichEdit.Lines.Text);
try
// Procesar SQL con los aliases
ProcessedSQL := ProcessSQLWithAliases(RichEdit.Lines.Text, TableAliases);
// Actualizar el contenido del RichEdit
RichEdit.Lines.Text := ProcessedSQL;
finally
TableAliases.Free;
end;
end;
end.