rawsql-ts 0.1.0-beta.8 → 0.1.0-beta.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +58 -38
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/models/BinarySelectQuery.js +9 -8
- package/dist/models/BinarySelectQuery.js.map +1 -1
- package/dist/models/SimpleSelectQuery.js +10 -8
- package/dist/models/SimpleSelectQuery.js.map +1 -1
- package/dist/parsers/CommandExpressionParser.d.ts +1 -1
- package/dist/parsers/CommandExpressionParser.js +6 -6
- package/dist/parsers/CommandExpressionParser.js.map +1 -1
- package/dist/parsers/CommonTableParser.d.ts +2 -2
- package/dist/parsers/CommonTableParser.js +7 -5
- package/dist/parsers/CommonTableParser.js.map +1 -1
- package/dist/parsers/ForClauseParser.d.ts +2 -2
- package/dist/parsers/ForClauseParser.js +5 -3
- package/dist/parsers/ForClauseParser.js.map +1 -1
- package/dist/parsers/FromClauseParser.d.ts +2 -2
- package/dist/parsers/FromClauseParser.js +6 -4
- package/dist/parsers/FromClauseParser.js.map +1 -1
- package/dist/parsers/FunctionExpressionParser.d.ts +1 -1
- package/dist/parsers/FunctionExpressionParser.js +8 -8
- package/dist/parsers/FunctionExpressionParser.js.map +1 -1
- package/dist/parsers/GroupByParser.d.ts +2 -2
- package/dist/parsers/GroupByParser.js +6 -4
- package/dist/parsers/GroupByParser.js.map +1 -1
- package/dist/parsers/HavingParser.d.ts +2 -2
- package/dist/parsers/HavingParser.js +6 -4
- package/dist/parsers/HavingParser.js.map +1 -1
- package/dist/parsers/IdentifierParser.d.ts +1 -1
- package/dist/parsers/IdentifierParser.js +1 -1
- package/dist/parsers/IdentifierParser.js.map +1 -1
- package/dist/parsers/JoinClauseParser.js +2 -2
- package/dist/parsers/JoinClauseParser.js.map +1 -1
- package/dist/parsers/LimitClauseParser.d.ts +2 -2
- package/dist/parsers/LimitClauseParser.js +7 -5
- package/dist/parsers/LimitClauseParser.js.map +1 -1
- package/dist/parsers/LiteralParser.d.ts +1 -1
- package/dist/parsers/LiteralParser.js +1 -1
- package/dist/parsers/LiteralParser.js.map +1 -1
- package/dist/parsers/OrderByClauseParser.d.ts +2 -2
- package/dist/parsers/OrderByClauseParser.js +6 -4
- package/dist/parsers/OrderByClauseParser.js.map +1 -1
- package/dist/parsers/OverExpressionParser.d.ts +2 -2
- package/dist/parsers/OverExpressionParser.js +4 -4
- package/dist/parsers/OverExpressionParser.js.map +1 -1
- package/dist/parsers/ParameterExpressionParser.d.ts +1 -1
- package/dist/parsers/ParameterExpressionParser.js +1 -1
- package/dist/parsers/ParameterExpressionParser.js.map +1 -1
- package/dist/parsers/ParenExpressionParser.d.ts +1 -1
- package/dist/parsers/ParenExpressionParser.js +2 -2
- package/dist/parsers/ParenExpressionParser.js.map +1 -1
- package/dist/parsers/PartitionByParser.d.ts +2 -2
- package/dist/parsers/PartitionByParser.js +7 -5
- package/dist/parsers/PartitionByParser.js.map +1 -1
- package/dist/parsers/SelectClauseParser.d.ts +2 -2
- package/dist/parsers/SelectClauseParser.js +6 -4
- package/dist/parsers/SelectClauseParser.js.map +1 -1
- package/dist/parsers/SelectQueryParser.d.ts +2 -2
- package/dist/parsers/SelectQueryParser.js +16 -14
- package/dist/parsers/SelectQueryParser.js.map +1 -1
- package/dist/parsers/SourceAliasExpressionParser.d.ts +1 -1
- package/dist/parsers/SourceAliasExpressionParser.js +2 -1
- package/dist/parsers/SourceAliasExpressionParser.js.map +1 -1
- package/dist/parsers/SourceExpressionParser.d.ts +1 -1
- package/dist/parsers/SourceExpressionParser.js +5 -4
- package/dist/parsers/SourceExpressionParser.js.map +1 -1
- package/dist/parsers/SourceParser.d.ts +2 -2
- package/dist/parsers/SourceParser.js +9 -6
- package/dist/parsers/SourceParser.js.map +1 -1
- package/dist/parsers/StringSpecifierExpressionParser.d.ts +1 -1
- package/dist/parsers/StringSpecifierExpressionParser.js +1 -1
- package/dist/parsers/StringSpecifierExpressionParser.js.map +1 -1
- package/dist/parsers/UnaryExpressionParser.d.ts +1 -1
- package/dist/parsers/UnaryExpressionParser.js +2 -2
- package/dist/parsers/UnaryExpressionParser.js.map +1 -1
- package/dist/parsers/ValueParser.d.ts +2 -2
- package/dist/parsers/ValueParser.js +15 -13
- package/dist/parsers/ValueParser.js.map +1 -1
- package/dist/parsers/ValuesQueryParser.d.ts +2 -2
- package/dist/parsers/ValuesQueryParser.js +5 -5
- package/dist/parsers/ValuesQueryParser.js.map +1 -1
- package/dist/parsers/WhereClauseParser.d.ts +2 -2
- package/dist/parsers/WhereClauseParser.js +6 -4
- package/dist/parsers/WhereClauseParser.js.map +1 -1
- package/dist/parsers/WindowClauseParser.d.ts +2 -2
- package/dist/parsers/WindowClauseParser.js +6 -4
- package/dist/parsers/WindowClauseParser.js.map +1 -1
- package/dist/parsers/WindowExpressionParser.d.ts +2 -2
- package/dist/parsers/WindowExpressionParser.js +29 -17
- package/dist/parsers/WindowExpressionParser.js.map +1 -1
- package/dist/parsers/WithClauseParser.d.ts +2 -2
- package/dist/parsers/WithClauseParser.js +7 -5
- package/dist/parsers/WithClauseParser.js.map +1 -1
- package/dist/transformers/CTEBuilder.js +1 -1
- package/dist/transformers/CTEBuilder.js.map +1 -1
- package/dist/transformers/CTENormalizer.d.ts +5 -5
- package/dist/transformers/CTENormalizer.js +11 -7
- package/dist/transformers/CTENormalizer.js.map +1 -1
- package/dist/transformers/Formatter.d.ts +16 -1
- package/dist/transformers/Formatter.js +16 -1
- package/dist/transformers/Formatter.js.map +1 -1
- package/dist/transformers/QueryConverter.d.ts +41 -0
- package/dist/transformers/{QueryNormalizer.js → QueryConverter.js} +39 -34
- package/dist/transformers/QueryConverter.js.map +1 -0
- package/package.json +1 -1
- package/dist/transformers/QueryNormalizer.d.ts +0 -37
- package/dist/transformers/QueryNormalizer.js.map +0 -1
@@ -1,8 +1,8 @@
|
|
1
1
|
import { Lexeme } from "../models/Lexeme";
|
2
2
|
import { ValuesQuery } from "../models/SelectQuery";
|
3
3
|
export declare class ValuesQueryParser {
|
4
|
-
static
|
5
|
-
static
|
4
|
+
static parse(query: string): ValuesQuery;
|
5
|
+
static parseFromLexeme(lexemes: Lexeme[], index: number): {
|
6
6
|
value: ValuesQuery;
|
7
7
|
newIndex: number;
|
8
8
|
};
|
@@ -7,18 +7,18 @@ const ValueComponent_1 = require("../models/ValueComponent");
|
|
7
7
|
const SqlTokenizer_1 = require("./SqlTokenizer");
|
8
8
|
const ValueParser_1 = require("./ValueParser");
|
9
9
|
class ValuesQueryParser {
|
10
|
-
static
|
10
|
+
static parse(query) {
|
11
11
|
const tokenizer = new SqlTokenizer_1.SqlTokenizer(query); // Initialize tokenizer
|
12
12
|
const lexemes = tokenizer.readLexmes(); // Get tokens
|
13
13
|
// Parse
|
14
|
-
const result = this.
|
14
|
+
const result = this.parseFromLexeme(lexemes, 0);
|
15
15
|
// Error if there are remaining tokens
|
16
16
|
if (result.newIndex < lexemes.length) {
|
17
17
|
throw new Error(`Syntax error: Unexpected token "${lexemes[result.newIndex].value}" at position ${result.newIndex}. The VALUES clause is complete but there are additional tokens.`);
|
18
18
|
}
|
19
19
|
return result.value;
|
20
20
|
}
|
21
|
-
static
|
21
|
+
static parseFromLexeme(lexemes, index) {
|
22
22
|
let idx = index;
|
23
23
|
if (lexemes[idx].value.toLowerCase() !== 'values') {
|
24
24
|
throw new Error(`Syntax error at position ${idx}: Expected 'VALUES' keyword but found "${lexemes[idx].value}". VALUES clauses must start with the VALUES keyword.`);
|
@@ -61,7 +61,7 @@ class ValuesQueryParser {
|
|
61
61
|
return { value: new ValueComponent_1.TupleExpression([]), newIndex: idx };
|
62
62
|
}
|
63
63
|
// Parse the first value
|
64
|
-
const firstValue = ValueParser_1.ValueParser.
|
64
|
+
const firstValue = ValueParser_1.ValueParser.parseFromLexeme(lexemes, idx);
|
65
65
|
values.push(firstValue.value);
|
66
66
|
idx = firstValue.newIndex;
|
67
67
|
// Parse additional values
|
@@ -70,7 +70,7 @@ class ValuesQueryParser {
|
|
70
70
|
if (idx >= lexemes.length) {
|
71
71
|
throw new Error(`Syntax error: Unexpected end of input after comma in tuple expression.`);
|
72
72
|
}
|
73
|
-
const value = ValueParser_1.ValueParser.
|
73
|
+
const value = ValueParser_1.ValueParser.parseFromLexeme(lexemes, idx);
|
74
74
|
values.push(value.value);
|
75
75
|
idx = value.newIndex;
|
76
76
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"ValuesQueryParser.js","sourceRoot":"","sources":["../../src/parsers/ValuesQueryParser.ts"],"names":[],"mappings":";;;AAAA,6CAAqD;AACrD,uDAAoD;AACpD,6DAA2E;AAC3E,iDAA8C;AAC9C,+CAA4C;AAE5C,MAAa,iBAAiB;IACnB,MAAM,CAAC,
|
1
|
+
{"version":3,"file":"ValuesQueryParser.js","sourceRoot":"","sources":["../../src/parsers/ValuesQueryParser.ts"],"names":[],"mappings":";;;AAAA,6CAAqD;AACrD,uDAAoD;AACpD,6DAA2E;AAC3E,iDAA8C;AAC9C,+CAA4C;AAE5C,MAAa,iBAAiB;IACnB,MAAM,CAAC,KAAK,CAAC,KAAa;QAC7B,MAAM,SAAS,GAAG,IAAI,2BAAY,CAAC,KAAK,CAAC,CAAC,CAAC,uBAAuB;QAClE,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,aAAa;QAErD,QAAQ;QACR,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAEhD,sCAAsC;QACtC,IAAI,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,mCAAmC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,iBAAiB,MAAM,CAAC,QAAQ,kEAAkE,CAAC,CAAC;QACzL,CAAC;QAED,OAAO,MAAM,CAAC,KAAK,CAAC;IACxB,CAAC;IAEM,MAAM,CAAC,eAAe,CAAC,OAAiB,EAAE,KAAa;QAC1D,IAAI,GAAG,GAAG,KAAK,CAAC;QAEhB,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,QAAQ,EAAE,CAAC;YAChD,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,0CAA0C,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,uDAAuD,CAAC,CAAC;QACxK,CAAC;QACD,GAAG,EAAE,CAAC;QAEN,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,yHAAyH,CAAC,CAAC;QAC/I,CAAC;QAED,MAAM,MAAM,GAAsB,EAAE,CAAC;QAErC,wBAAwB;QACxB,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACjD,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAC9B,GAAG,GAAG,UAAU,CAAC,QAAQ,CAAC;QAE1B,wCAAwC;QACxC,OAAO,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,kBAAS,CAAC,KAAK,EAAE,CAAC;YACnE,GAAG,EAAE,CAAC,CAAC,aAAa;YACpB,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC5C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACzB,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC;QACzB,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,yBAAW,CAAC,MAAM,CAAC,CAAC;QACtC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;IAC3C,CAAC;IAEO,MAAM,CAAC,UAAU,CAAC,OAAiB,EAAE,KAAa;QACtD,IAAI,GAAG,GAAG,KAAK,CAAC;QAEhB,gCAAgC;QAChC,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,kBAAS,CAAC,SAAS,EAAE,CAAC;YACrE,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,6CAA6C,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,wEAAwE,CAAC,CAAC;QACpO,CAAC;QACD,GAAG,EAAE,CAAC;QAEN,gCAAgC;QAChC,MAAM,MAAM,GAAqB,EAAE,CAAC;QAEpC,oBAAoB;QACpB,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,sFAAsF,CAAC,CAAC;QAC5G,CAAC;QAED,6BAA6B;QAC7B,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,kBAAS,CAAC,UAAU,EAAE,CAAC;YAC7C,GAAG,EAAE,CAAC,CAAC,2BAA2B;YAClC,OAAO,EAAE,KAAK,EAAE,IAAI,gCAAe,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;QAC7D,CAAC;QAED,wBAAwB;QACxB,MAAM,UAAU,GAAG,yBAAW,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC7D,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAC9B,GAAG,GAAG,UAAU,CAAC,QAAQ,CAAC;QAE1B,0BAA0B;QAC1B,OAAO,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,kBAAS,CAAC,KAAK,EAAE,CAAC;YACnE,GAAG,EAAE,CAAC,CAAC,aAAa;YAEpB,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;YAC9F,CAAC;YAED,MAAM,KAAK,GAAG,yBAAW,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACxD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACzB,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC;QACzB,CAAC;QAED,gCAAgC;QAChC,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,kBAAS,CAAC,UAAU,EAAE,CAAC;YACtE,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,6CAA6C,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,wEAAwE,CAAC,CAAC;QACpO,CAAC;QACD,GAAG,EAAE,CAAC,CAAC,2BAA2B;QAElC,OAAO,EAAE,KAAK,EAAE,IAAI,gCAAe,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;IACjE,CAAC;CACJ;AAhGD,8CAgGC"}
|
@@ -1,8 +1,8 @@
|
|
1
1
|
import { WhereClause } from "../models/Clause";
|
2
2
|
import { Lexeme } from "../models/Lexeme";
|
3
3
|
export declare class WhereClauseParser {
|
4
|
-
static
|
5
|
-
static
|
4
|
+
static parse(query: string): WhereClause;
|
5
|
+
static parseFromLexeme(lexemes: Lexeme[], index: number): {
|
6
6
|
value: WhereClause;
|
7
7
|
newIndex: number;
|
8
8
|
};
|
@@ -5,18 +5,20 @@ const Clause_1 = require("../models/Clause");
|
|
5
5
|
const SqlTokenizer_1 = require("./SqlTokenizer");
|
6
6
|
const ValueParser_1 = require("./ValueParser");
|
7
7
|
class WhereClauseParser {
|
8
|
-
|
8
|
+
// Parse SQL string to AST (was: parse)
|
9
|
+
static parse(query) {
|
9
10
|
const tokenizer = new SqlTokenizer_1.SqlTokenizer(query); // Initialize tokenizer
|
10
11
|
const lexemes = tokenizer.readLexmes(); // Get tokens
|
11
12
|
// Parse
|
12
|
-
const result = this.
|
13
|
+
const result = this.parseFromLexeme(lexemes, 0);
|
13
14
|
// Error if there are remaining tokens
|
14
15
|
if (result.newIndex < lexemes.length) {
|
15
16
|
throw new Error(`Syntax error: Unexpected token "${lexemes[result.newIndex].value}" at position ${result.newIndex}. The WHERE clause is complete but there are additional tokens.`);
|
16
17
|
}
|
17
18
|
return result.value;
|
18
19
|
}
|
19
|
-
|
20
|
+
// Parse from lexeme array (was: parse)
|
21
|
+
static parseFromLexeme(lexemes, index) {
|
20
22
|
let idx = index;
|
21
23
|
if (lexemes[idx].value !== 'where') {
|
22
24
|
throw new Error(`Syntax error at position ${idx}: Expected 'WHERE' keyword but found "${lexemes[idx].value}". WHERE clauses must start with the WHERE keyword.`);
|
@@ -25,7 +27,7 @@ class WhereClauseParser {
|
|
25
27
|
if (idx >= lexemes.length) {
|
26
28
|
throw new Error(`Syntax error: Unexpected end of input after 'WHERE' keyword. The WHERE clause requires a condition expression.`);
|
27
29
|
}
|
28
|
-
const item = ValueParser_1.ValueParser.
|
30
|
+
const item = ValueParser_1.ValueParser.parseFromLexeme(lexemes, idx);
|
29
31
|
const clause = new Clause_1.WhereClause(item.value);
|
30
32
|
return { value: clause, newIndex: item.newIndex };
|
31
33
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"WhereClauseParser.js","sourceRoot":"","sources":["../../src/parsers/WhereClauseParser.ts"],"names":[],"mappings":";;;AAAA,6CAA+C;AAE/C,iDAA8C;AAC9C,+CAA4C;AAE5C,MAAa,iBAAiB;
|
1
|
+
{"version":3,"file":"WhereClauseParser.js","sourceRoot":"","sources":["../../src/parsers/WhereClauseParser.ts"],"names":[],"mappings":";;;AAAA,6CAA+C;AAE/C,iDAA8C;AAC9C,+CAA4C;AAE5C,MAAa,iBAAiB;IAC1B,uCAAuC;IAChC,MAAM,CAAC,KAAK,CAAC,KAAa;QAC7B,MAAM,SAAS,GAAG,IAAI,2BAAY,CAAC,KAAK,CAAC,CAAC,CAAC,uBAAuB;QAClE,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,aAAa;QAErD,QAAQ;QACR,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAEhD,sCAAsC;QACtC,IAAI,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,mCAAmC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,iBAAiB,MAAM,CAAC,QAAQ,iEAAiE,CAAC,CAAC;QACxL,CAAC;QAED,OAAO,MAAM,CAAC,KAAK,CAAC;IACxB,CAAC;IAED,uCAAuC;IAChC,MAAM,CAAC,eAAe,CAAC,OAAiB,EAAE,KAAa;QAC1D,IAAI,GAAG,GAAG,KAAK,CAAC;QAEhB,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,yCAAyC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,qDAAqD,CAAC,CAAC;QACrK,CAAC;QACD,GAAG,EAAE,CAAC;QAEN,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,gHAAgH,CAAC,CAAC;QACtI,CAAC;QAED,MAAM,IAAI,GAAG,yBAAW,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,IAAI,oBAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE3C,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;IACtD,CAAC;CACJ;AAnCD,8CAmCC"}
|
@@ -1,8 +1,8 @@
|
|
1
1
|
import { WindowFrameClause } from "../models/Clause";
|
2
2
|
import { Lexeme } from "../models/Lexeme";
|
3
3
|
export declare class WindowClauseParser {
|
4
|
-
static
|
5
|
-
static
|
4
|
+
static parse(query: string): WindowFrameClause;
|
5
|
+
static parseFromLexeme(lexemes: Lexeme[], index: number): {
|
6
6
|
value: WindowFrameClause;
|
7
7
|
newIndex: number;
|
8
8
|
};
|
@@ -6,18 +6,20 @@ const Lexeme_1 = require("../models/Lexeme");
|
|
6
6
|
const SqlTokenizer_1 = require("./SqlTokenizer");
|
7
7
|
const WindowExpressionParser_1 = require("./WindowExpressionParser");
|
8
8
|
class WindowClauseParser {
|
9
|
-
|
9
|
+
// Parse SQL string to AST (was: parse)
|
10
|
+
static parse(query) {
|
10
11
|
const tokenizer = new SqlTokenizer_1.SqlTokenizer(query);
|
11
12
|
const lexemes = tokenizer.readLexmes();
|
12
13
|
// Parse
|
13
|
-
const result = this.
|
14
|
+
const result = this.parseFromLexeme(lexemes, 0);
|
14
15
|
// Error if there are remaining tokens
|
15
16
|
if (result.newIndex < lexemes.length) {
|
16
17
|
throw new Error(`Syntax error: Unexpected token "${lexemes[result.newIndex].value}" at position ${result.newIndex}. The WINDOW clause is complete but there are additional tokens.`);
|
17
18
|
}
|
18
19
|
return result.value;
|
19
20
|
}
|
20
|
-
|
21
|
+
// Parse from lexeme array (was: parse)
|
22
|
+
static parseFromLexeme(lexemes, index) {
|
21
23
|
let idx = index;
|
22
24
|
if (lexemes[idx].value !== 'window') {
|
23
25
|
throw new Error(`Syntax error at position ${idx}: Expected 'WINDOW' keyword but found "${lexemes[idx].value}". WINDOW clauses must start with the WINDOW keyword.`);
|
@@ -33,7 +35,7 @@ class WindowClauseParser {
|
|
33
35
|
throw new Error(`Syntax error at position ${idx}: Expected 'AS' keyword after window name.`);
|
34
36
|
}
|
35
37
|
idx++;
|
36
|
-
const expr = WindowExpressionParser_1.WindowExpressionParser.
|
38
|
+
const expr = WindowExpressionParser_1.WindowExpressionParser.parseFromLexeme(lexemes, idx);
|
37
39
|
idx = expr.newIndex;
|
38
40
|
const windowFrame = new Clause_1.WindowFrameClause(name, expr.value);
|
39
41
|
return { value: windowFrame, newIndex: idx };
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"WindowClauseParser.js","sourceRoot":"","sources":["../../src/parsers/WindowClauseParser.ts"],"names":[],"mappings":";;;AAAA,6CAAqD;AACrD,6CAAqD;AACrD,iDAA8C;AAC9C,qEAAkE;AAElE,MAAa,kBAAkB;
|
1
|
+
{"version":3,"file":"WindowClauseParser.js","sourceRoot":"","sources":["../../src/parsers/WindowClauseParser.ts"],"names":[],"mappings":";;;AAAA,6CAAqD;AACrD,6CAAqD;AACrD,iDAA8C;AAC9C,qEAAkE;AAElE,MAAa,kBAAkB;IAC3B,uCAAuC;IAChC,MAAM,CAAC,KAAK,CAAC,KAAa;QAC7B,MAAM,SAAS,GAAG,IAAI,2BAAY,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,EAAE,CAAC;QAEvC,QAAQ;QACR,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAEhD,sCAAsC;QACtC,IAAI,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,mCAAmC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,iBAAiB,MAAM,CAAC,QAAQ,kEAAkE,CAAC,CAAC;QACzL,CAAC;QAED,OAAO,MAAM,CAAC,KAAK,CAAC;IACxB,CAAC;IAED,uCAAuC;IAChC,MAAM,CAAC,eAAe,CAAC,OAAiB,EAAE,KAAa;QAC1D,IAAI,GAAG,GAAG,KAAK,CAAC;QAEhB,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,0CAA0C,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,uDAAuD,CAAC,CAAC;QACxK,CAAC;QACD,GAAG,EAAE,CAAC;QAEN,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,kBAAS,CAAC,UAAU,EAAE,CAAC;YACtE,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAClF,CAAC;QAED,sBAAsB;QACtB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;QAChC,GAAG,EAAE,CAAC;QAEN,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACvD,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,4CAA4C,CAAC,CAAC;QACjG,CAAC;QACD,GAAG,EAAE,CAAC;QAEN,MAAM,IAAI,GAAG,+CAAsB,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAClE,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;QAEpB,MAAM,WAAW,GAAG,IAAI,0BAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5D,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;IACjD,CAAC;CACJ;AA7CD,gDA6CC"}
|
@@ -1,8 +1,8 @@
|
|
1
1
|
import { Lexeme } from "../models/Lexeme";
|
2
2
|
import { WindowFrameExpression } from "../models/ValueComponent";
|
3
3
|
export declare class WindowExpressionParser {
|
4
|
-
static
|
5
|
-
static
|
4
|
+
static parse(query: string): WindowFrameExpression;
|
5
|
+
static parseFromLexeme(lexemes: Lexeme[], index: number): {
|
6
6
|
value: WindowFrameExpression;
|
7
7
|
newIndex: number;
|
8
8
|
};
|
@@ -8,18 +8,20 @@ const PartitionByParser_1 = require("./PartitionByParser");
|
|
8
8
|
const SqlTokenizer_1 = require("./SqlTokenizer");
|
9
9
|
const ValueParser_1 = require("./ValueParser");
|
10
10
|
class WindowExpressionParser {
|
11
|
-
|
11
|
+
// Parse SQL string to AST (was: parse)
|
12
|
+
static parse(query) {
|
12
13
|
const tokenizer = new SqlTokenizer_1.SqlTokenizer(query); // Initialize tokenizer
|
13
14
|
const lexemes = tokenizer.readLexmes(); // Get tokens
|
14
15
|
// Parse
|
15
|
-
const result = this.
|
16
|
+
const result = this.parseFromLexeme(lexemes, 0);
|
16
17
|
// Error if there are remaining tokens
|
17
18
|
if (result.newIndex < lexemes.length) {
|
18
19
|
throw new Error(`Syntax error: Unexpected token "${lexemes[result.newIndex].value}" at position ${result.newIndex}. The window frame expression is complete but there are additional tokens.`);
|
19
20
|
}
|
20
21
|
return result.value;
|
21
22
|
}
|
22
|
-
|
23
|
+
// Parse from lexeme array (was: parse)
|
24
|
+
static parseFromLexeme(lexemes, index) {
|
23
25
|
let idx = index;
|
24
26
|
if (lexemes[idx].type !== Lexeme_1.TokenType.OpenParen) {
|
25
27
|
throw new Error(`Syntax error at position ${idx}: Expected opening parenthesis '(' but found "${lexemes[idx].value}".`);
|
@@ -29,12 +31,12 @@ class WindowExpressionParser {
|
|
29
31
|
let order = null;
|
30
32
|
let frameSpec = null;
|
31
33
|
if (idx < lexemes.length && lexemes[idx].value === 'partition by') {
|
32
|
-
const partitionResult = PartitionByParser_1.PartitionByParser.
|
34
|
+
const partitionResult = PartitionByParser_1.PartitionByParser.parseFromLexeme(lexemes, idx);
|
33
35
|
partition = partitionResult.value;
|
34
36
|
idx = partitionResult.newIndex;
|
35
37
|
}
|
36
38
|
if (idx < lexemes.length && lexemes[idx].value === 'order by') {
|
37
|
-
const orderResult = OrderByClauseParser_1.OrderByClauseParser.
|
39
|
+
const orderResult = OrderByClauseParser_1.OrderByClauseParser.parseFromLexeme(lexemes, idx);
|
38
40
|
order = orderResult.value;
|
39
41
|
idx = orderResult.newIndex;
|
40
42
|
}
|
@@ -129,22 +131,32 @@ class WindowExpressionParser {
|
|
129
131
|
const bound = new ValueComponent_1.WindowFrameBoundStatic(frameBound);
|
130
132
|
return { value: bound, newIndex: idx + 1 };
|
131
133
|
}
|
132
|
-
else {
|
133
|
-
//
|
134
|
-
const valueResult = ValueParser_1.ValueParser.
|
134
|
+
else if (idx < lexemes.length && lexemes[idx].type === Lexeme_1.TokenType.Literal) {
|
135
|
+
// Parse the numeric/literal value
|
136
|
+
const valueResult = ValueParser_1.ValueParser.parseFromLexeme(lexemes, idx);
|
135
137
|
idx = valueResult.newIndex;
|
136
|
-
|
137
|
-
|
138
|
+
// Next token must be 'preceding' or 'following'
|
139
|
+
if (idx < lexemes.length && lexemes[idx].type === Lexeme_1.TokenType.Command) {
|
140
|
+
const direction = lexemes[idx].value;
|
141
|
+
let isFollowing;
|
142
|
+
if (direction === 'preceding') {
|
143
|
+
isFollowing = false;
|
144
|
+
}
|
145
|
+
else if (direction === 'following') {
|
146
|
+
isFollowing = true;
|
147
|
+
}
|
148
|
+
else {
|
149
|
+
throw new Error(`Syntax error at position ${idx}: Expected 'preceding' or 'following' after numeric value in window frame boundary.`);
|
150
|
+
}
|
151
|
+
idx++;
|
152
|
+
const bound = new ValueComponent_1.WindowFrameBoundaryValue(valueResult.value, isFollowing);
|
153
|
+
return { value: bound, newIndex: idx };
|
138
154
|
}
|
139
|
-
|
140
|
-
|
141
|
-
const isFollowing = direction === 'following' ? true : direction === 'preceding' ? false : undefined;
|
142
|
-
if (isFollowing === undefined) {
|
143
|
-
throw new Error(`Syntax error at position ${idx}: Expected PRECEDING or FOLLOWING after numeric expression in window frame, but found "${lexemes[idx].value}".`);
|
155
|
+
else {
|
156
|
+
throw new Error(`Syntax error at position ${idx}: Expected 'preceding' or 'following' after numeric value in window frame boundary.`);
|
144
157
|
}
|
145
|
-
const bound = new ValueComponent_1.WindowFrameBoundaryValue(valueResult.value, isFollowing);
|
146
|
-
return { value: bound, newIndex: idx };
|
147
158
|
}
|
159
|
+
throw new Error(`Syntax error at position ${idx}: Expected a valid frame boundary component.`);
|
148
160
|
}
|
149
161
|
}
|
150
162
|
exports.WindowExpressionParser = WindowExpressionParser;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"WindowExpressionParser.js","sourceRoot":"","sources":["../../src/parsers/WindowExpressionParser.ts"],"names":[],"mappings":";;;AACA,6CAAqD;AACrD,6DAA+L;AAC/L,+DAA4D;AAC5D,2DAAwD;AACxD,iDAA8C;AAC9C,+CAA4C;AAE5C,MAAa,sBAAsB;
|
1
|
+
{"version":3,"file":"WindowExpressionParser.js","sourceRoot":"","sources":["../../src/parsers/WindowExpressionParser.ts"],"names":[],"mappings":";;;AACA,6CAAqD;AACrD,6DAA+L;AAC/L,+DAA4D;AAC5D,2DAAwD;AACxD,iDAA8C;AAC9C,+CAA4C;AAE5C,MAAa,sBAAsB;IAC/B,uCAAuC;IAChC,MAAM,CAAC,KAAK,CAAC,KAAa;QAC7B,MAAM,SAAS,GAAG,IAAI,2BAAY,CAAC,KAAK,CAAC,CAAC,CAAC,uBAAuB;QAClE,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,aAAa;QAErD,QAAQ;QACR,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAEhD,sCAAsC;QACtC,IAAI,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,mCAAmC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,iBAAiB,MAAM,CAAC,QAAQ,4EAA4E,CAAC,CAAC;QACnM,CAAC;QAED,OAAO,MAAM,CAAC,KAAK,CAAC;IACxB,CAAC;IAED,uCAAuC;IAChC,MAAM,CAAC,eAAe,CAAC,OAAiB,EAAE,KAAa;QAC1D,IAAI,GAAG,GAAG,KAAK,CAAC;QAChB,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,kBAAS,CAAC,SAAS,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,iDAAiD,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QAC5H,CAAC;QACD,GAAG,EAAE,CAAC;QACN,IAAI,SAAS,GAA6B,IAAI,CAAC;QAC/C,IAAI,KAAK,GAAyB,IAAI,CAAC;QACvC,IAAI,SAAS,GAA2B,IAAI,CAAC;QAC7C,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,cAAc,EAAE,CAAC;YAChE,MAAM,eAAe,GAAG,qCAAiB,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACxE,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC;YAClC,GAAG,GAAG,eAAe,CAAC,QAAQ,CAAC;QACnC,CAAC;QACD,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;YAC5D,MAAM,WAAW,GAAG,yCAAmB,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACtE,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC;YAC1B,GAAG,GAAG,WAAW,CAAC,QAAQ,CAAC;QAC/B,CAAC;QACD,yCAAyC;QACzC,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YACtE,MAAM,eAAe,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC1D,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC;YAClC,GAAG,GAAG,eAAe,CAAC,QAAQ,CAAC;QACnC,CAAC;QACD,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,kBAAS,CAAC,UAAU,EAAE,CAAC;YACtE,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,wHAAwH,CAAC,CAAC;QAC7K,CAAC;QACD,mBAAmB;QACnB,GAAG,EAAE,CAAC;QAEN,OAAO,EAAE,KAAK,EAAE,IAAI,sCAAqB,CAAC,SAAS,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;IAC5F,CAAC;IAEO,MAAM,CAAC,kBAAkB,CAAC,KAAa;QAC3C,MAAM,UAAU,GAAG,KAAK,CAAC;QACzB,OAAO,UAAU,KAAK,MAAM,IAAI,UAAU,KAAK,OAAO,IAAI,UAAU,KAAK,QAAQ,CAAC;IACtF,CAAC;IAEO,MAAM,CAAC,cAAc,CAAC,OAAiB,EAAE,KAAa;QAC1D,IAAI,GAAG,GAAG,KAAK,CAAC;QAEhB,2CAA2C;QAC3C,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;QACxC,IAAI,SAA0B,CAAC;QAE/B,QAAQ,YAAY,EAAE,CAAC;YACnB,KAAK,MAAM;gBACP,SAAS,GAAG,gCAAe,CAAC,IAAI,CAAC;gBACjC,MAAM;YACV,KAAK,OAAO;gBACR,SAAS,GAAG,gCAAe,CAAC,KAAK,CAAC;gBAClC,MAAM;YACV,KAAK,QAAQ;gBACT,SAAS,GAAG,gCAAe,CAAC,MAAM,CAAC;gBACnC,MAAM;YACV;gBACI,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,yBAAyB,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,0CAA0C,CAAC,CAAC;QAC9I,CAAC;QACD,GAAG,EAAE,CAAC;QAEN,uCAAuC;QACvC,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC3D,6BAA6B;YAC7B,GAAG,EAAE,CAAC;YAEN,uBAAuB;YACvB,MAAM,gBAAgB,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC/D,MAAM,UAAU,GAAG,gBAAgB,CAAC,KAAK,CAAC;YAC1C,GAAG,GAAG,gBAAgB,CAAC,QAAQ,CAAC;YAEhC,4FAA4F;YAC5F,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,EAAE,CAAC;gBAC1D,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,6CAA6C,CAAC,CAAC;YAClG,CAAC;YACD,GAAG,EAAE,CAAC,CAAC,WAAW;YAElB,qBAAqB;YACrB,MAAM,cAAc,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC7D,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC;YACtC,GAAG,GAAG,cAAc,CAAC,QAAQ,CAAC;YAE9B,OAAO;gBACH,KAAK,EAAE,IAAI,gCAAe,CAAC,SAAS,EAAE,UAAU,EAAE,QAAQ,CAAC;gBAC3D,QAAQ,EAAE,GAAG;aAChB,CAAC;QACN,CAAC;aAAM,CAAC;YACJ,gCAAgC;YAChC,MAAM,cAAc,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC7D,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC;YACxC,GAAG,GAAG,cAAc,CAAC,QAAQ,CAAC;YAE9B,OAAO;gBACH,KAAK,EAAE,IAAI,gCAAe,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC;gBACvD,QAAQ,EAAE,GAAG;aAChB,CAAC;QACN,CAAC;IACL,CAAC;IAEO,MAAM,CAAC,kBAAkB,CAAC,OAAiB,EAAE,KAAa;QAC9D,IAAI,GAAG,GAAG,KAAK,CAAC;QAChB,kCAAkC;QAClC,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,kBAAS,CAAC,OAAO,EAAE,CAAC;YAClE,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;YACxC,IAAI,UAA4B,CAAC;YACjC,QAAQ,YAAY,EAAE,CAAC;gBACnB,KAAK,aAAa;oBACd,UAAU,GAAG,iCAAgB,CAAC,UAAU,CAAC;oBACzC,MAAM;gBACV,KAAK,qBAAqB;oBACtB,UAAU,GAAG,iCAAgB,CAAC,kBAAkB,CAAC;oBACjD,MAAM;gBACV,KAAK,qBAAqB;oBACtB,UAAU,GAAG,iCAAgB,CAAC,kBAAkB,CAAC;oBACjD,MAAM;gBACV;oBACI,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,yBAAyB,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,0CAA0C,CAAC,CAAC;YAC9I,CAAC;YACD,MAAM,KAAK,GAAG,IAAI,uCAAsB,CAAC,UAAU,CAAC,CAAC;YACrD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC;QAC/C,CAAC;aAAM,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,kBAAS,CAAC,OAAO,EAAE,CAAC;YACzE,kCAAkC;YAClC,MAAM,WAAW,GAAG,yBAAW,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC9D,GAAG,GAAG,WAAW,CAAC,QAAQ,CAAC;YAC3B,gDAAgD;YAChD,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,kBAAS,CAAC,OAAO,EAAE,CAAC;gBAClE,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;gBACrC,IAAI,WAAoB,CAAC;gBACzB,IAAI,SAAS,KAAK,WAAW,EAAE,CAAC;oBAC5B,WAAW,GAAG,KAAK,CAAC;gBACxB,CAAC;qBAAM,IAAI,SAAS,KAAK,WAAW,EAAE,CAAC;oBACnC,WAAW,GAAG,IAAI,CAAC;gBACvB,CAAC;qBAAM,CAAC;oBACJ,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,qFAAqF,CAAC,CAAC;gBAC1I,CAAC;gBACD,GAAG,EAAE,CAAC;gBACN,MAAM,KAAK,GAAG,IAAI,yCAAwB,CAAC,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;gBAC3E,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;YAC3C,CAAC;iBAAM,CAAC;gBACJ,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,qFAAqF,CAAC,CAAC;YAC1I,CAAC;QACL,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,8CAA8C,CAAC,CAAC;IACnG,CAAC;CACJ;AAlKD,wDAkKC"}
|
@@ -1,8 +1,8 @@
|
|
1
1
|
import { WithClause } from "../models/Clause";
|
2
2
|
import { Lexeme } from "../models/Lexeme";
|
3
3
|
export declare class WithClauseParser {
|
4
|
-
static
|
5
|
-
static
|
4
|
+
static parse(query: string): WithClause;
|
5
|
+
static parseFromLexeme(lexemes: Lexeme[], index: number): {
|
6
6
|
value: WithClause;
|
7
7
|
newIndex: number;
|
8
8
|
};
|
@@ -6,18 +6,20 @@ const Lexeme_1 = require("../models/Lexeme");
|
|
6
6
|
const SqlTokenizer_1 = require("./SqlTokenizer");
|
7
7
|
const CommonTableParser_1 = require("./CommonTableParser");
|
8
8
|
class WithClauseParser {
|
9
|
-
|
9
|
+
// Parse SQL string to AST (was: parse)
|
10
|
+
static parse(query) {
|
10
11
|
const tokenizer = new SqlTokenizer_1.SqlTokenizer(query); // Initialize tokenizer
|
11
12
|
const lexemes = tokenizer.readLexmes(); // Get tokens
|
12
13
|
// Parse
|
13
|
-
const result = this.
|
14
|
+
const result = this.parseFromLexeme(lexemes, 0);
|
14
15
|
// Error if there are remaining tokens
|
15
16
|
if (result.newIndex < lexemes.length) {
|
16
17
|
throw new Error(`Syntax error: Unexpected token "${lexemes[result.newIndex].value}" at position ${result.newIndex}. The WITH clause is complete but there are additional tokens.`);
|
17
18
|
}
|
18
19
|
return result.value;
|
19
20
|
}
|
20
|
-
|
21
|
+
// Parse from lexeme array (was: parse)
|
22
|
+
static parseFromLexeme(lexemes, index) {
|
21
23
|
let idx = index;
|
22
24
|
// Expect WITH keyword
|
23
25
|
if (idx < lexemes.length && lexemes[idx].value.toLowerCase() === "with") {
|
@@ -34,13 +36,13 @@ class WithClauseParser {
|
|
34
36
|
// Parse CTEs
|
35
37
|
const tables = [];
|
36
38
|
// Parse first CTE (required)
|
37
|
-
const firstCte = CommonTableParser_1.CommonTableParser.
|
39
|
+
const firstCte = CommonTableParser_1.CommonTableParser.parseFromLexeme(lexemes, idx);
|
38
40
|
tables.push(firstCte.value);
|
39
41
|
idx = firstCte.newIndex;
|
40
42
|
// Parse additional CTEs (optional)
|
41
43
|
while (idx < lexemes.length && lexemes[idx].type === Lexeme_1.TokenType.Comma) {
|
42
44
|
idx++; // Skip comma
|
43
|
-
const cteResult = CommonTableParser_1.CommonTableParser.
|
45
|
+
const cteResult = CommonTableParser_1.CommonTableParser.parseFromLexeme(lexemes, idx);
|
44
46
|
tables.push(cteResult.value);
|
45
47
|
idx = cteResult.newIndex;
|
46
48
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"WithClauseParser.js","sourceRoot":"","sources":["../../src/parsers/WithClauseParser.ts"],"names":[],"mappings":";;;AAAA,6CAA2D;AAC3D,6CAAqD;AACrD,iDAA8C;AAC9C,2DAAwD;AAExD,MAAa,gBAAgB;
|
1
|
+
{"version":3,"file":"WithClauseParser.js","sourceRoot":"","sources":["../../src/parsers/WithClauseParser.ts"],"names":[],"mappings":";;;AAAA,6CAA2D;AAC3D,6CAAqD;AACrD,iDAA8C;AAC9C,2DAAwD;AAExD,MAAa,gBAAgB;IACzB,uCAAuC;IAChC,MAAM,CAAC,KAAK,CAAC,KAAa;QAC7B,MAAM,SAAS,GAAG,IAAI,2BAAY,CAAC,KAAK,CAAC,CAAC,CAAC,uBAAuB;QAClE,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,aAAa;QAErD,QAAQ;QACR,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAEhD,sCAAsC;QACtC,IAAI,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,mCAAmC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,iBAAiB,MAAM,CAAC,QAAQ,gEAAgE,CAAC,CAAC;QACvL,CAAC;QAED,OAAO,MAAM,CAAC,KAAK,CAAC;IACxB,CAAC;IAED,uCAAuC;IAChC,MAAM,CAAC,eAAe,CAAC,OAAiB,EAAE,KAAa;QAC1D,IAAI,GAAG,GAAG,KAAK,CAAC;QAEhB,sBAAsB;QACtB,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;YACtE,GAAG,EAAE,CAAC;QACV,CAAC;aAAM,CAAC;YACJ,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,0BAA0B,CAAC,CAAC;QAC/E,CAAC;QAED,8BAA8B;QAC9B,MAAM,SAAS,GAAG,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,WAAW,CAAC;QAC3F,IAAI,SAAS,EAAE,CAAC;YACZ,GAAG,EAAE,CAAC;QACV,CAAC;QAED,aAAa;QACb,MAAM,MAAM,GAAkB,EAAE,CAAC;QAEjC,6BAA6B;QAC7B,MAAM,QAAQ,GAAG,qCAAiB,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACjE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC5B,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAExB,mCAAmC;QACnC,OAAO,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,kBAAS,CAAC,KAAK,EAAE,CAAC;YACnE,GAAG,EAAE,CAAC,CAAC,aAAa;YACpB,MAAM,SAAS,GAAG,qCAAiB,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAClE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC7B,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC;QAC7B,CAAC;QAED,qBAAqB;QACrB,OAAO;YACH,KAAK,EAAE,IAAI,mBAAU,CAAC,SAAS,EAAE,MAAM,CAAC;YACxC,QAAQ,EAAE,GAAG;SAChB,CAAC;IACN,CAAC;CACJ;AAxDD,4CAwDC"}
|
@@ -72,7 +72,7 @@ class CTEBuilder {
|
|
72
72
|
continue;
|
73
73
|
}
|
74
74
|
// For duplicate names, check if definitions are identical
|
75
|
-
const definitions = tables.map(table => this.formatter.
|
75
|
+
const definitions = tables.map(table => this.formatter.format(table.query));
|
76
76
|
const uniqueDefinitions = new Set(definitions);
|
77
77
|
if (uniqueDefinitions.size === 1) {
|
78
78
|
// If all definitions are identical, use only the first one
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"CTEBuilder.js","sourceRoot":"","sources":["../../src/transformers/CTEBuilder.ts"],"names":[],"mappings":";;;AAAA,6CAA2D;AAC3D,iDAA8C;AAC9C,iEAA8D;AAC9D,2CAAwC;AAExC;;;GAGG;AACH,MAAa,UAAU;IAKnB;QACI,IAAI,CAAC,eAAe,GAAG,IAAI,2CAAoB,CAAC,IAAI,CAAC,CAAC;QACtD,IAAI,CAAC,YAAY,GAAG,IAAI,2BAAY,EAAE,CAAC;QACvC,IAAI,CAAC,SAAS,GAAG,IAAI,qBAAS,EAAE,CAAC;IACrC,CAAC;IAED;;;;;;;;;;;;OAYG;IACI,KAAK,CAAC,YAA2B;QACpC,8BAA8B;QAC9B,QAAQ;QACR,kFAAkF;QAClF,mGAAmG;QACnG,kEAAkE;QAClE,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,mBAAU,CACjB,KAAK,EACL,YAAY,CACf,CAAC;QACN,CAAC;QAED,iCAAiC;QACjC,MAAM,cAAc,GAAG,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,CAAC;QAEhE,6DAA6D;QAC7D,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC;QAE5F,kEAAkE;QAClE,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC;QAElG,OAAO,IAAI,mBAAU,CACjB,aAAa,CAAC,IAAI,GAAG,CAAC,EACtB,YAAY,CACf,CAAC;IACN,CAAC;IAED;;;;;;;OAOG;IACK,qBAAqB,CAAC,YAA2B;QACrD,4BAA4B;QAC5B,MAAM,UAAU,GAAG,IAAI,GAAG,EAAyB,CAAC;QACpD,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;YAC/B,MAAM,SAAS,GAAG,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC;YACnD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7B,UAAU,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YAClC,CAAC;YACD,UAAU,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC;QAED,4BAA4B;QAC5B,MAAM,cAAc,GAAkB,EAAE,CAAC;QACzC,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;YAChD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtB,iBAAiB;gBACjB,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/B,SAAS;YACb,CAAC;YAED,0DAA0D;YAC1D,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,
|
1
|
+
{"version":3,"file":"CTEBuilder.js","sourceRoot":"","sources":["../../src/transformers/CTEBuilder.ts"],"names":[],"mappings":";;;AAAA,6CAA2D;AAC3D,iDAA8C;AAC9C,iEAA8D;AAC9D,2CAAwC;AAExC;;;GAGG;AACH,MAAa,UAAU;IAKnB;QACI,IAAI,CAAC,eAAe,GAAG,IAAI,2CAAoB,CAAC,IAAI,CAAC,CAAC;QACtD,IAAI,CAAC,YAAY,GAAG,IAAI,2BAAY,EAAE,CAAC;QACvC,IAAI,CAAC,SAAS,GAAG,IAAI,qBAAS,EAAE,CAAC;IACrC,CAAC;IAED;;;;;;;;;;;;OAYG;IACI,KAAK,CAAC,YAA2B;QACpC,8BAA8B;QAC9B,QAAQ;QACR,kFAAkF;QAClF,mGAAmG;QACnG,kEAAkE;QAClE,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,mBAAU,CACjB,KAAK,EACL,YAAY,CACf,CAAC;QACN,CAAC;QAED,iCAAiC;QACjC,MAAM,cAAc,GAAG,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,CAAC;QAEhE,6DAA6D;QAC7D,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC;QAE5F,kEAAkE;QAClE,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC;QAElG,OAAO,IAAI,mBAAU,CACjB,aAAa,CAAC,IAAI,GAAG,CAAC,EACtB,YAAY,CACf,CAAC;IACN,CAAC;IAED;;;;;;;OAOG;IACK,qBAAqB,CAAC,YAA2B;QACrD,4BAA4B;QAC5B,MAAM,UAAU,GAAG,IAAI,GAAG,EAAyB,CAAC;QACpD,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;YAC/B,MAAM,SAAS,GAAG,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC;YACnD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7B,UAAU,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YAClC,CAAC;YACD,UAAU,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC;QAED,4BAA4B;QAC5B,MAAM,cAAc,GAAkB,EAAE,CAAC;QACzC,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;YAChD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtB,iBAAiB;gBACjB,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/B,SAAS;YACb,CAAC;YAED,0DAA0D;YAC1D,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YAC5E,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;YAE/C,IAAI,iBAAiB,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBAC/B,2DAA2D;gBAC3D,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YACnC,CAAC;iBAAM,CAAC;gBACJ,8BAA8B;gBAC9B,MAAM,IAAI,KAAK,CAAC,gCAAgC,IAAI,sCAAsC,CAAC,CAAC;YAChG,CAAC;QACL,CAAC;QAED,OAAO,cAAc,CAAC;IAC1B,CAAC;IAED;;;;;OAKG;IACK,oBAAoB,CAAC,MAAqB;QAK9C,+CAA+C;QAC/C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAuB,CAAC;QAChD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YACzB,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC1D,CAAC;QAED,4DAA4D;QAC5D,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;QAExC,oEAAoE;QACpE,MAAM,YAAY,GAAG,IAAI,GAAG,EAAuB,CAAC;QACpD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAuB,CAAC;QAEpD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YACzB,MAAM,SAAS,GAAG,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC;YAEnD,6CAA6C;YAC7C,MAAM,gBAAgB,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAEnE,sCAAsC;YACtC,KAAK,MAAM,eAAe,IAAI,gBAAgB,EAAE,CAAC;gBAC7C,IAAI,eAAe,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;oBAC3C,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;oBAC7B,MAAM;gBACV,CAAC;YACL,CAAC;YAED,qBAAqB;YACrB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC/B,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,GAAG,EAAU,CAAC,CAAC;YACnD,CAAC;YAED,0DAA0D;YAC1D,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAE9D,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE,CAAC;gBACzC,MAAM,cAAc,GAAG,aAAa,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC;gBAEhE,uDAAuD;gBACvD,IAAI,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;oBAC/B,YAAY,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;oBAEjD,+BAA+B;oBAC/B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;wBACpC,YAAY,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,GAAG,EAAU,CAAC,CAAC;oBACxD,CAAC;oBACD,YAAY,CAAC,GAAG,CAAC,cAAc,CAAE,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBACrD,CAAC;YACL,CAAC;QACL,CAAC;QAED,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC;IACrD,CAAC;IAED;;;;;;;;;OASG;IACK,gBAAgB,CACpB,MAAqB,EACrB,QAAkC,EAClC,aAA0B,EAC1B,YAAsC;QAEtC,MAAM,eAAe,GAAkB,EAAE,CAAC;QAC1C,MAAM,kBAAkB,GAAkB,EAAE,CAAC;QAC7C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAClC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;QAEnC,4BAA4B;QAC5B,MAAM,KAAK,GAAG,CAAC,SAAiB,EAAE,EAAE;YAChC,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;gBAAE,OAAO;YACnC,IAAI,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CAAC,uCAAuC,SAAS,EAAE,CAAC,CAAC;YACxE,CAAC;YAED,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAExB,0CAA0C;YAC1C,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,GAAG,EAAU,CAAC;YAC9D,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACrB,KAAK,CAAC,GAAG,CAAC,CAAC;YACf,CAAC;YAED,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAEvB,wCAAwC;YACxC,qEAAqE;YACrE,IAAI,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC/B,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC,CAAC;YACnD,CAAC;iBAAM,CAAC;gBACJ,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC,CAAC;YACtD,CAAC;QACL,CAAC,CAAC;QAEF,qBAAqB;QACrB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YACzB,MAAM,SAAS,GAAG,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC;YACnD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC1B,KAAK,CAAC,SAAS,CAAC,CAAC;YACrB,CAAC;QACL,CAAC;QAED,qEAAqE;QACrE,OAAO,CAAC,GAAG,eAAe,EAAE,GAAG,kBAAkB,CAAC,CAAC;IACvD,CAAC;CACJ;AA5ND,gCA4NC"}
|
@@ -10,10 +10,10 @@ import { SelectQuery } from "../models/SelectQuery";
|
|
10
10
|
* 3. CTENameConflictResolver - to resolve name conflicts among CTEs and sort them properly
|
11
11
|
*/
|
12
12
|
export declare class CTENormalizer {
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
constructor();
|
13
|
+
/**
|
14
|
+
* Private constructor to prevent instantiation of this utility class.
|
15
|
+
*/
|
16
|
+
private constructor();
|
17
17
|
/**
|
18
18
|
* Normalizes a SQL query by consolidating all CTEs into a single WITH clause
|
19
19
|
* at the root level of the query.
|
@@ -21,5 +21,5 @@ export declare class CTENormalizer {
|
|
21
21
|
* @param query The query to normalize
|
22
22
|
* @returns A new normalized query with all CTEs at the root level
|
23
23
|
*/
|
24
|
-
normalize(query: SelectQuery): SelectQuery;
|
24
|
+
static normalize(query: SelectQuery): SelectQuery;
|
25
25
|
}
|
@@ -15,10 +15,11 @@ const CTEInjector_1 = require("./CTEInjector");
|
|
15
15
|
* 3. CTENameConflictResolver - to resolve name conflicts among CTEs and sort them properly
|
16
16
|
*/
|
17
17
|
class CTENormalizer {
|
18
|
+
/**
|
19
|
+
* Private constructor to prevent instantiation of this utility class.
|
20
|
+
*/
|
18
21
|
constructor() {
|
19
|
-
|
20
|
-
this.cteDisabler = new CTEDisabler_1.CTEDisabler();
|
21
|
-
this.injector = new CTEInjector_1.CTEInjector();
|
22
|
+
// This class is not meant to be instantiated.
|
22
23
|
}
|
23
24
|
/**
|
24
25
|
* Normalizes a SQL query by consolidating all CTEs into a single WITH clause
|
@@ -27,15 +28,18 @@ class CTENormalizer {
|
|
27
28
|
* @param query The query to normalize
|
28
29
|
* @returns A new normalized query with all CTEs at the root level
|
29
30
|
*/
|
30
|
-
normalize(query) {
|
31
|
+
static normalize(query) {
|
31
32
|
// No need to normalize if the query doesn't have any CTEs
|
32
|
-
const
|
33
|
+
const cteCollector = new CTECollector_1.CTECollector();
|
34
|
+
const allCommonTables = cteCollector.collect(query);
|
33
35
|
if (allCommonTables.length === 0) {
|
34
36
|
return query;
|
35
37
|
}
|
36
38
|
// Remove all WITH clauses from the original query
|
37
|
-
|
38
|
-
|
39
|
+
const cteDisabler = new CTEDisabler_1.CTEDisabler();
|
40
|
+
cteDisabler.execute(query);
|
41
|
+
const injector = new CTEInjector_1.CTEInjector();
|
42
|
+
return injector.inject(query, allCommonTables);
|
39
43
|
}
|
40
44
|
}
|
41
45
|
exports.CTENormalizer = CTENormalizer;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"CTENormalizer.js","sourceRoot":"","sources":["../../src/transformers/CTENormalizer.ts"],"names":[],"mappings":";;;AAEA,iDAA8C;AAE9C,+CAA4C;AAG5C,+CAA4C;AAE5C;;;;;;;;;GASG;AACH,MAAa,aAAa;
|
1
|
+
{"version":3,"file":"CTENormalizer.js","sourceRoot":"","sources":["../../src/transformers/CTENormalizer.ts"],"names":[],"mappings":";;;AAEA,iDAA8C;AAE9C,+CAA4C;AAG5C,+CAA4C;AAE5C;;;;;;;;;GASG;AACH,MAAa,aAAa;IACtB;;OAEG;IACH;QACI,8CAA8C;IAClD,CAAC;IACD;;;;;;OAMG;IACI,MAAM,CAAC,SAAS,CAAC,KAAkB;QACtC,0DAA0D;QAC1D,MAAM,YAAY,GAAG,IAAI,2BAAY,EAAE,CAAC;QACxC,MAAM,eAAe,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAEpD,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,kDAAkD;QAClD,MAAM,WAAW,GAAG,IAAI,yBAAW,EAAE,CAAC;QACtC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAE3B,MAAM,QAAQ,GAAG,IAAI,yBAAW,EAAE,CAAC;QACnC,OAAO,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;IACnD,CAAC;CACJ;AA9BD,sCA8BC"}
|
@@ -10,7 +10,22 @@ export declare class Formatter implements SqlComponentVisitor<string> {
|
|
10
10
|
private handlers;
|
11
11
|
private config;
|
12
12
|
constructor();
|
13
|
-
|
13
|
+
/**
|
14
|
+
* Formats the given SQL AST node into a SQL string.
|
15
|
+
* This is the recommended public API for users.
|
16
|
+
* @param arg The root SQL AST node to format.
|
17
|
+
* @param config (Optional) Formatter configuration.
|
18
|
+
* @returns The formatted SQL string.
|
19
|
+
*/
|
20
|
+
format(arg: SqlComponent, config?: FormatterConfig | null): string;
|
21
|
+
/**
|
22
|
+
* Visitor entry point for SQL AST nodes.
|
23
|
+
* Note: This method is public only for interface compatibility.
|
24
|
+
* Users should call the format() method instead of visit() directly.
|
25
|
+
* (If you call visit() directly, you are basically breaking the abstraction, so don't do it!)
|
26
|
+
* @param arg The SQL AST node to visit.
|
27
|
+
* @returns The formatted SQL string for the node.
|
28
|
+
*/
|
14
29
|
visit(arg: SqlComponent): string;
|
15
30
|
private visitBinarySelectQuery;
|
16
31
|
private visitWindowFrameBoundaryValue;
|
@@ -82,12 +82,27 @@ class Formatter {
|
|
82
82
|
this.handlers.set(SelectQuery_1.SimpleSelectQuery.kind, (expr) => this.visitSelectQuery(expr));
|
83
83
|
this.handlers.set(SelectQuery_1.BinarySelectQuery.kind, (expr) => this.visitBinarySelectQuery(expr));
|
84
84
|
}
|
85
|
-
|
85
|
+
/**
|
86
|
+
* Formats the given SQL AST node into a SQL string.
|
87
|
+
* This is the recommended public API for users.
|
88
|
+
* @param arg The root SQL AST node to format.
|
89
|
+
* @param config (Optional) Formatter configuration.
|
90
|
+
* @returns The formatted SQL string.
|
91
|
+
*/
|
92
|
+
format(arg, config = null) {
|
86
93
|
if (config) {
|
87
94
|
this.config = config;
|
88
95
|
}
|
89
96
|
return this.visit(arg);
|
90
97
|
}
|
98
|
+
/**
|
99
|
+
* Visitor entry point for SQL AST nodes.
|
100
|
+
* Note: This method is public only for interface compatibility.
|
101
|
+
* Users should call the format() method instead of visit() directly.
|
102
|
+
* (If you call visit() directly, you are basically breaking the abstraction, so don't do it!)
|
103
|
+
* @param arg The SQL AST node to visit.
|
104
|
+
* @returns The formatted SQL string for the node.
|
105
|
+
*/
|
91
106
|
visit(arg) {
|
92
107
|
var _a, _b;
|
93
108
|
const handler = this.handlers.get(arg.getKind());
|