rawsql-ts 0.11.7-beta → 0.11.8-beta
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 +82 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index.min.js +23 -15
- package/dist/esm/index.min.js.map +4 -4
- package/dist/esm/src/index.d.ts +1 -0
- package/dist/esm/src/index.js +1 -0
- package/dist/esm/src/index.js.map +1 -1
- package/dist/esm/src/models/BinarySelectQuery.d.ts +2 -2
- package/dist/esm/src/models/BinarySelectQuery.js.map +1 -1
- package/dist/esm/src/models/SelectQuery.d.ts +2 -1
- package/dist/esm/src/models/SelectQuery.js.map +1 -1
- package/dist/esm/src/models/SimpleSelectQuery.d.ts +2 -2
- package/dist/esm/src/models/SimpleSelectQuery.js.map +1 -1
- package/dist/esm/src/models/ValueComponent.d.ts +19 -4
- package/dist/esm/src/models/ValueComponent.js +19 -1
- package/dist/esm/src/models/ValueComponent.js.map +1 -1
- package/dist/esm/src/models/ValuesQuery.d.ts +2 -1
- package/dist/esm/src/models/ValuesQuery.js.map +1 -1
- package/dist/esm/src/parsers/CommonTableParser.js +16 -0
- package/dist/esm/src/parsers/CommonTableParser.js.map +1 -1
- package/dist/esm/src/parsers/LiteralParser.js +15 -5
- package/dist/esm/src/parsers/LiteralParser.js.map +1 -1
- package/dist/esm/src/parsers/SqlPrintTokenParser.d.ts +2 -0
- package/dist/esm/src/parsers/SqlPrintTokenParser.js +42 -2
- package/dist/esm/src/parsers/SqlPrintTokenParser.js.map +1 -1
- package/dist/esm/src/parsers/ValueParser.d.ts +13 -0
- package/dist/esm/src/parsers/ValueParser.js +134 -1
- package/dist/esm/src/parsers/ValueParser.js.map +1 -1
- package/dist/esm/src/parsers/WithClauseParser.js +8 -2
- package/dist/esm/src/parsers/WithClauseParser.js.map +1 -1
- package/dist/esm/src/reporting/models/DataFlowEdge.d.ts +33 -0
- package/dist/esm/src/reporting/models/DataFlowEdge.js +53 -0
- package/dist/esm/src/reporting/models/DataFlowEdge.js.map +1 -0
- package/dist/esm/src/reporting/models/DataFlowGraph.d.ts +49 -0
- package/dist/esm/src/reporting/models/DataFlowGraph.js +156 -0
- package/dist/esm/src/reporting/models/DataFlowGraph.js.map +1 -0
- package/dist/esm/src/reporting/models/DataFlowNode.d.ts +64 -0
- package/dist/esm/src/reporting/models/DataFlowNode.js +109 -0
- package/dist/esm/src/reporting/models/DataFlowNode.js.map +1 -0
- package/dist/esm/src/reporting/services/CTEHandler.d.ts +13 -0
- package/dist/esm/src/reporting/services/CTEHandler.js +27 -0
- package/dist/esm/src/reporting/services/CTEHandler.js.map +1 -0
- package/dist/esm/src/reporting/services/DataSourceHandler.d.ts +25 -0
- package/dist/esm/src/reporting/services/DataSourceHandler.js +91 -0
- package/dist/esm/src/reporting/services/DataSourceHandler.js.map +1 -0
- package/dist/esm/src/reporting/services/JoinHandler.d.ts +32 -0
- package/dist/esm/src/reporting/services/JoinHandler.js +80 -0
- package/dist/esm/src/reporting/services/JoinHandler.js.map +1 -0
- package/dist/esm/src/reporting/services/ProcessHandler.d.ts +55 -0
- package/dist/esm/src/reporting/services/ProcessHandler.js +177 -0
- package/dist/esm/src/reporting/services/ProcessHandler.js.map +1 -0
- package/dist/esm/src/tokenReaders/EscapedIdentifierTokenReader.d.ts +5 -0
- package/dist/esm/src/tokenReaders/EscapedIdentifierTokenReader.js +37 -1
- package/dist/esm/src/tokenReaders/EscapedIdentifierTokenReader.js.map +1 -1
- package/dist/esm/src/tokenReaders/LiteralTokenReader.d.ts +16 -0
- package/dist/esm/src/tokenReaders/LiteralTokenReader.js +119 -0
- package/dist/esm/src/tokenReaders/LiteralTokenReader.js.map +1 -1
- package/dist/esm/src/tokenReaders/OperatorTokenReader.js +4 -0
- package/dist/esm/src/tokenReaders/OperatorTokenReader.js.map +1 -1
- package/dist/esm/src/tokenReaders/ParameterTokenReader.d.ts +14 -0
- package/dist/esm/src/tokenReaders/ParameterTokenReader.js +126 -0
- package/dist/esm/src/tokenReaders/ParameterTokenReader.js.map +1 -1
- package/dist/esm/src/transformers/DynamicQueryBuilder.d.ts +28 -2
- package/dist/esm/src/transformers/DynamicQueryBuilder.js.map +1 -1
- package/dist/esm/src/transformers/QueryFlowDiagramGenerator.d.ts +37 -0
- package/dist/esm/src/transformers/QueryFlowDiagramGenerator.js +140 -0
- package/dist/esm/src/transformers/QueryFlowDiagramGenerator.js.map +1 -0
- package/dist/esm/src/transformers/SqlParamInjector.d.ts +11 -0
- package/dist/esm/src/transformers/SqlParamInjector.js.map +1 -1
- package/dist/esm/src/transformers/TypeTransformationPostProcessor.d.ts +5 -5
- package/dist/esm/src/transformers/TypeTransformationPostProcessor.js +20 -8
- package/dist/esm/src/transformers/TypeTransformationPostProcessor.js.map +1 -1
- package/dist/esm/src/utils/OperatorPrecedence.js +23 -1
- package/dist/esm/src/utils/OperatorPrecedence.js.map +1 -1
- package/dist/esm/src/utils/charLookupTable.js +4 -4
- package/dist/esm/src/utils/charLookupTable.js.map +1 -1
- package/dist/esm/src/utils/stringUtils.js +17 -1
- package/dist/esm/src/utils/stringUtils.js.map +1 -1
- package/dist/esm/tsconfig.browser.tsbuildinfo +1 -1
- package/dist/index.min.js +23 -15
- package/dist/index.min.js.map +4 -4
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/models/BinarySelectQuery.d.ts +2 -2
- package/dist/src/models/BinarySelectQuery.js.map +1 -1
- package/dist/src/models/SelectQuery.d.ts +2 -1
- package/dist/src/models/SelectQuery.js.map +1 -1
- package/dist/src/models/SimpleSelectQuery.d.ts +2 -2
- package/dist/src/models/SimpleSelectQuery.js.map +1 -1
- package/dist/src/models/ValueComponent.d.ts +19 -4
- package/dist/src/models/ValueComponent.js +22 -2
- package/dist/src/models/ValueComponent.js.map +1 -1
- package/dist/src/models/ValuesQuery.d.ts +2 -1
- package/dist/src/models/ValuesQuery.js.map +1 -1
- package/dist/src/parsers/CommonTableParser.js +16 -0
- package/dist/src/parsers/CommonTableParser.js.map +1 -1
- package/dist/src/parsers/LiteralParser.js +15 -5
- package/dist/src/parsers/LiteralParser.js.map +1 -1
- package/dist/src/parsers/SqlPrintTokenParser.d.ts +2 -0
- package/dist/src/parsers/SqlPrintTokenParser.js +41 -1
- package/dist/src/parsers/SqlPrintTokenParser.js.map +1 -1
- package/dist/src/parsers/ValueParser.d.ts +13 -0
- package/dist/src/parsers/ValueParser.js +133 -0
- package/dist/src/parsers/ValueParser.js.map +1 -1
- package/dist/src/parsers/WithClauseParser.js +8 -2
- package/dist/src/parsers/WithClauseParser.js.map +1 -1
- package/dist/src/reporting/models/DataFlowEdge.d.ts +33 -0
- package/dist/src/reporting/models/DataFlowEdge.js +58 -0
- package/dist/src/reporting/models/DataFlowEdge.js.map +1 -0
- package/dist/src/reporting/models/DataFlowGraph.d.ts +49 -0
- package/dist/src/reporting/models/DataFlowGraph.js +160 -0
- package/dist/src/reporting/models/DataFlowGraph.js.map +1 -0
- package/dist/src/reporting/models/DataFlowNode.d.ts +64 -0
- package/dist/src/reporting/models/DataFlowNode.js +117 -0
- package/dist/src/reporting/models/DataFlowNode.js.map +1 -0
- package/dist/src/reporting/services/CTEHandler.d.ts +13 -0
- package/dist/src/reporting/services/CTEHandler.js +31 -0
- package/dist/src/reporting/services/CTEHandler.js.map +1 -0
- package/dist/src/reporting/services/DataSourceHandler.d.ts +25 -0
- package/dist/src/reporting/services/DataSourceHandler.js +95 -0
- package/dist/src/reporting/services/DataSourceHandler.js.map +1 -0
- package/dist/src/reporting/services/JoinHandler.d.ts +32 -0
- package/dist/src/reporting/services/JoinHandler.js +84 -0
- package/dist/src/reporting/services/JoinHandler.js.map +1 -0
- package/dist/src/reporting/services/ProcessHandler.d.ts +55 -0
- package/dist/src/reporting/services/ProcessHandler.js +181 -0
- package/dist/src/reporting/services/ProcessHandler.js.map +1 -0
- package/dist/src/tokenReaders/EscapedIdentifierTokenReader.d.ts +5 -0
- package/dist/src/tokenReaders/EscapedIdentifierTokenReader.js +37 -1
- package/dist/src/tokenReaders/EscapedIdentifierTokenReader.js.map +1 -1
- package/dist/src/tokenReaders/LiteralTokenReader.d.ts +16 -0
- package/dist/src/tokenReaders/LiteralTokenReader.js +119 -0
- package/dist/src/tokenReaders/LiteralTokenReader.js.map +1 -1
- package/dist/src/tokenReaders/OperatorTokenReader.js +4 -0
- package/dist/src/tokenReaders/OperatorTokenReader.js.map +1 -1
- package/dist/src/tokenReaders/ParameterTokenReader.d.ts +14 -0
- package/dist/src/tokenReaders/ParameterTokenReader.js +126 -0
- package/dist/src/tokenReaders/ParameterTokenReader.js.map +1 -1
- package/dist/src/transformers/DynamicQueryBuilder.d.ts +28 -2
- package/dist/src/transformers/DynamicQueryBuilder.js.map +1 -1
- package/dist/src/transformers/QueryFlowDiagramGenerator.d.ts +37 -0
- package/dist/src/transformers/QueryFlowDiagramGenerator.js +144 -0
- package/dist/src/transformers/QueryFlowDiagramGenerator.js.map +1 -0
- package/dist/src/transformers/SqlParamInjector.d.ts +11 -0
- package/dist/src/transformers/SqlParamInjector.js.map +1 -1
- package/dist/src/transformers/TypeTransformationPostProcessor.d.ts +5 -5
- package/dist/src/transformers/TypeTransformationPostProcessor.js +20 -8
- package/dist/src/transformers/TypeTransformationPostProcessor.js.map +1 -1
- package/dist/src/utils/OperatorPrecedence.js +23 -1
- package/dist/src/utils/OperatorPrecedence.js.map +1 -1
- package/dist/src/utils/charLookupTable.js +4 -4
- package/dist/src/utils/charLookupTable.js.map +1 -1
- package/dist/src/utils/stringUtils.js +17 -1
- package/dist/src/utils/stringUtils.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Represents a connection between nodes in the data flow
|
|
3
|
+
*/
|
|
4
|
+
export class DataFlowConnection {
|
|
5
|
+
constructor(from, to, label) {
|
|
6
|
+
this.from = from;
|
|
7
|
+
this.to = to;
|
|
8
|
+
this.label = label;
|
|
9
|
+
}
|
|
10
|
+
getMermaidRepresentation() {
|
|
11
|
+
const arrow = this.label ? ` -->|${this.label}| ` : ' --> ';
|
|
12
|
+
return `${this.from}${arrow}${this.to}`;
|
|
13
|
+
}
|
|
14
|
+
static create(from, to, label) {
|
|
15
|
+
return new DataFlowConnection(from, to, label);
|
|
16
|
+
}
|
|
17
|
+
static createWithNullability(from, to, isNullable) {
|
|
18
|
+
const label = isNullable ? 'NULLABLE' : 'NOT NULL';
|
|
19
|
+
return new DataFlowConnection(from, to, label);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Collection of edges with utilities for managing connections
|
|
24
|
+
*/
|
|
25
|
+
export class DataFlowEdgeCollection {
|
|
26
|
+
constructor() {
|
|
27
|
+
this.edges = [];
|
|
28
|
+
this.connectionSet = new Set();
|
|
29
|
+
}
|
|
30
|
+
add(edge) {
|
|
31
|
+
const key = `${edge.from}->${edge.to}`;
|
|
32
|
+
if (!this.connectionSet.has(key)) {
|
|
33
|
+
this.edges.push(edge);
|
|
34
|
+
this.connectionSet.add(key);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
addConnection(from, to, label) {
|
|
38
|
+
this.add(DataFlowConnection.create(from, to, label));
|
|
39
|
+
}
|
|
40
|
+
addJoinConnection(from, to, isNullable) {
|
|
41
|
+
this.add(DataFlowConnection.createWithNullability(from, to, isNullable));
|
|
42
|
+
}
|
|
43
|
+
hasConnection(from, to) {
|
|
44
|
+
return this.connectionSet.has(`${from}->${to}`);
|
|
45
|
+
}
|
|
46
|
+
getAll() {
|
|
47
|
+
return [...this.edges];
|
|
48
|
+
}
|
|
49
|
+
getMermaidRepresentation() {
|
|
50
|
+
return this.edges.map(edge => edge.getMermaidRepresentation()).join('\n ');
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=DataFlowEdge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataFlowEdge.js","sourceRoot":"","sources":["../../../../../src/reporting/models/DataFlowEdge.ts"],"names":[],"mappings":"AASA;;GAEG;AACH,MAAM,OAAO,kBAAkB;IAC3B,YACW,IAAY,EACZ,EAAU,EACV,KAAc;QAFd,SAAI,GAAJ,IAAI,CAAQ;QACZ,OAAE,GAAF,EAAE,CAAQ;QACV,UAAK,GAAL,KAAK,CAAS;IACtB,CAAC;IAEJ,wBAAwB;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;QAC5D,OAAO,GAAG,IAAI,CAAC,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;IAC5C,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,IAAY,EAAE,EAAU,EAAE,KAAc;QAClD,OAAO,IAAI,kBAAkB,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,CAAC,qBAAqB,CAAC,IAAY,EAAE,EAAU,EAAE,UAAmB;QACtE,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC;QACnD,OAAO,IAAI,kBAAkB,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;IACnD,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,OAAO,sBAAsB;IAAnC;QACY,UAAK,GAAyB,EAAE,CAAC;QACjC,kBAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IA6B9C,CAAC;IA3BG,GAAG,CAAC,IAAwB;QACxB,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,EAAE,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;IACL,CAAC;IAED,aAAa,CAAC,IAAY,EAAE,EAAU,EAAE,KAAc;QAClD,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;IACzD,CAAC;IAED,iBAAiB,CAAC,IAAY,EAAE,EAAU,EAAE,UAAmB;QAC3D,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,qBAAqB,CAAC,IAAI,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;IAC7E,CAAC;IAED,aAAa,CAAC,IAAY,EAAE,EAAU;QAClC,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,IAAI,KAAK,EAAE,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,MAAM;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED,wBAAwB;QACpB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,wBAAwB,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClF,CAAC;CACJ"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { BaseDataFlowNode, DataSourceNode, ProcessNode, OperationNode, OutputNode } from './DataFlowNode';
|
|
2
|
+
import { DataFlowConnection } from './DataFlowEdge';
|
|
3
|
+
/**
|
|
4
|
+
* Represents the complete data flow graph for a SQL query
|
|
5
|
+
*/
|
|
6
|
+
export declare class DataFlowGraph {
|
|
7
|
+
private nodes;
|
|
8
|
+
private edges;
|
|
9
|
+
addNode(node: BaseDataFlowNode): void;
|
|
10
|
+
addEdge(edge: DataFlowConnection): void;
|
|
11
|
+
addConnection(from: string, to: string, label?: string): void;
|
|
12
|
+
hasNode(nodeId: string): boolean;
|
|
13
|
+
hasConnection(from: string, to: string): boolean;
|
|
14
|
+
getNode(nodeId: string): BaseDataFlowNode | undefined;
|
|
15
|
+
getAllNodes(): BaseDataFlowNode[];
|
|
16
|
+
getAllEdges(): DataFlowConnection[];
|
|
17
|
+
/**
|
|
18
|
+
* Generates the complete Mermaid flowchart syntax
|
|
19
|
+
*/
|
|
20
|
+
generateMermaid(direction?: string, title?: string): string;
|
|
21
|
+
/**
|
|
22
|
+
* Creates or gets a table node
|
|
23
|
+
*/
|
|
24
|
+
getOrCreateTable(tableName: string): DataSourceNode;
|
|
25
|
+
/**
|
|
26
|
+
* Creates or gets a CTE node
|
|
27
|
+
*/
|
|
28
|
+
getOrCreateCTE(cteName: string): DataSourceNode;
|
|
29
|
+
/**
|
|
30
|
+
* Creates or gets a subquery node
|
|
31
|
+
*/
|
|
32
|
+
getOrCreateSubquery(alias: string): DataSourceNode;
|
|
33
|
+
/**
|
|
34
|
+
* Creates a process node
|
|
35
|
+
*/
|
|
36
|
+
createProcessNode(type: string, context: string): ProcessNode;
|
|
37
|
+
/**
|
|
38
|
+
* Creates a JOIN operation node
|
|
39
|
+
*/
|
|
40
|
+
createJoinNode(joinId: string, joinType: string): OperationNode;
|
|
41
|
+
/**
|
|
42
|
+
* Creates a set operation node (UNION, EXCEPT, etc.)
|
|
43
|
+
*/
|
|
44
|
+
createSetOperationNode(operationId: string, operation: string): OperationNode;
|
|
45
|
+
/**
|
|
46
|
+
* Creates an output node
|
|
47
|
+
*/
|
|
48
|
+
createOutputNode(context?: string): OutputNode;
|
|
49
|
+
}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { DataSourceNode, ProcessNode, OperationNode, OutputNode } from './DataFlowNode';
|
|
2
|
+
import { DataFlowEdgeCollection } from './DataFlowEdge';
|
|
3
|
+
/**
|
|
4
|
+
* Represents the complete data flow graph for a SQL query
|
|
5
|
+
*/
|
|
6
|
+
export class DataFlowGraph {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.nodes = new Map();
|
|
9
|
+
this.edges = new DataFlowEdgeCollection();
|
|
10
|
+
}
|
|
11
|
+
addNode(node) {
|
|
12
|
+
this.nodes.set(node.id, node);
|
|
13
|
+
}
|
|
14
|
+
addEdge(edge) {
|
|
15
|
+
this.edges.add(edge);
|
|
16
|
+
}
|
|
17
|
+
addConnection(from, to, label) {
|
|
18
|
+
this.edges.addConnection(from, to, label);
|
|
19
|
+
}
|
|
20
|
+
hasNode(nodeId) {
|
|
21
|
+
return this.nodes.has(nodeId);
|
|
22
|
+
}
|
|
23
|
+
hasConnection(from, to) {
|
|
24
|
+
return this.edges.hasConnection(from, to);
|
|
25
|
+
}
|
|
26
|
+
getNode(nodeId) {
|
|
27
|
+
return this.nodes.get(nodeId);
|
|
28
|
+
}
|
|
29
|
+
getAllNodes() {
|
|
30
|
+
return Array.from(this.nodes.values());
|
|
31
|
+
}
|
|
32
|
+
getAllEdges() {
|
|
33
|
+
return this.edges.getAll();
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Generates the complete Mermaid flowchart syntax
|
|
37
|
+
*/
|
|
38
|
+
generateMermaid(direction = 'TD', title) {
|
|
39
|
+
let mermaid = `flowchart ${direction}\n`;
|
|
40
|
+
// Add title if provided
|
|
41
|
+
if (title) {
|
|
42
|
+
mermaid += ` %% ${title}\n`;
|
|
43
|
+
}
|
|
44
|
+
// Add nodes
|
|
45
|
+
const nodeLines = Array.from(this.nodes.values())
|
|
46
|
+
.map(node => ` ${node.getMermaidRepresentation()}`)
|
|
47
|
+
.join('\n');
|
|
48
|
+
if (nodeLines) {
|
|
49
|
+
mermaid += nodeLines + '\n';
|
|
50
|
+
}
|
|
51
|
+
// Add blank line between nodes and edges if both exist
|
|
52
|
+
if (this.nodes.size > 0 && this.edges.getAll().length > 0) {
|
|
53
|
+
mermaid += '\n';
|
|
54
|
+
}
|
|
55
|
+
// Add edges
|
|
56
|
+
const edgeRepresentation = this.edges.getMermaidRepresentation();
|
|
57
|
+
if (edgeRepresentation) {
|
|
58
|
+
mermaid += ` ${edgeRepresentation}\n`;
|
|
59
|
+
}
|
|
60
|
+
return mermaid;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Creates or gets a table node
|
|
64
|
+
*/
|
|
65
|
+
getOrCreateTable(tableName) {
|
|
66
|
+
const nodeId = `table_${tableName}`;
|
|
67
|
+
let node = this.nodes.get(nodeId);
|
|
68
|
+
if (!node) {
|
|
69
|
+
node = DataSourceNode.createTable(tableName);
|
|
70
|
+
this.addNode(node);
|
|
71
|
+
}
|
|
72
|
+
return node;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Creates or gets a CTE node
|
|
76
|
+
*/
|
|
77
|
+
getOrCreateCTE(cteName) {
|
|
78
|
+
const nodeId = `cte_${cteName}`;
|
|
79
|
+
let node = this.nodes.get(nodeId);
|
|
80
|
+
if (!node) {
|
|
81
|
+
node = DataSourceNode.createCTE(cteName);
|
|
82
|
+
this.addNode(node);
|
|
83
|
+
}
|
|
84
|
+
return node;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Creates or gets a subquery node
|
|
88
|
+
*/
|
|
89
|
+
getOrCreateSubquery(alias) {
|
|
90
|
+
const nodeId = `subquery_${alias}`;
|
|
91
|
+
let node = this.nodes.get(nodeId);
|
|
92
|
+
if (!node) {
|
|
93
|
+
node = DataSourceNode.createSubquery(alias);
|
|
94
|
+
this.addNode(node);
|
|
95
|
+
}
|
|
96
|
+
return node;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Creates a process node
|
|
100
|
+
*/
|
|
101
|
+
createProcessNode(type, context) {
|
|
102
|
+
let node;
|
|
103
|
+
switch (type.toLowerCase()) {
|
|
104
|
+
case 'where':
|
|
105
|
+
node = ProcessNode.createWhere(context);
|
|
106
|
+
break;
|
|
107
|
+
case 'group by':
|
|
108
|
+
node = ProcessNode.createGroupBy(context);
|
|
109
|
+
break;
|
|
110
|
+
case 'having':
|
|
111
|
+
node = ProcessNode.createHaving(context);
|
|
112
|
+
break;
|
|
113
|
+
case 'select':
|
|
114
|
+
node = ProcessNode.createSelect(context);
|
|
115
|
+
break;
|
|
116
|
+
case 'order by':
|
|
117
|
+
node = ProcessNode.createOrderBy(context);
|
|
118
|
+
break;
|
|
119
|
+
case 'limit':
|
|
120
|
+
node = ProcessNode.createLimit(context, false);
|
|
121
|
+
break;
|
|
122
|
+
case 'limit/offset':
|
|
123
|
+
node = ProcessNode.createLimit(context, true);
|
|
124
|
+
break;
|
|
125
|
+
default:
|
|
126
|
+
node = new ProcessNode(context, type);
|
|
127
|
+
}
|
|
128
|
+
this.addNode(node);
|
|
129
|
+
return node;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Creates a JOIN operation node
|
|
133
|
+
*/
|
|
134
|
+
createJoinNode(joinId, joinType) {
|
|
135
|
+
const node = OperationNode.createJoin(joinId, joinType);
|
|
136
|
+
this.addNode(node);
|
|
137
|
+
return node;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Creates a set operation node (UNION, EXCEPT, etc.)
|
|
141
|
+
*/
|
|
142
|
+
createSetOperationNode(operationId, operation) {
|
|
143
|
+
const node = OperationNode.createSetOperation(operationId, operation);
|
|
144
|
+
this.addNode(node);
|
|
145
|
+
return node;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Creates an output node
|
|
149
|
+
*/
|
|
150
|
+
createOutputNode(context = 'main') {
|
|
151
|
+
const node = new OutputNode(context);
|
|
152
|
+
this.addNode(node);
|
|
153
|
+
return node;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=DataFlowGraph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataFlowGraph.js","sourceRoot":"","sources":["../../../../../src/reporting/models/DataFlowGraph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Represents a node in the SQL data flow diagram
|
|
3
|
+
*/
|
|
4
|
+
export interface DataFlowNode {
|
|
5
|
+
id: string;
|
|
6
|
+
label: string;
|
|
7
|
+
type: NodeType;
|
|
8
|
+
shape: NodeShape;
|
|
9
|
+
details?: string[];
|
|
10
|
+
}
|
|
11
|
+
export type NodeType = 'table' | 'cte' | 'subquery' | 'process' | 'operation' | 'output';
|
|
12
|
+
export type NodeShape = 'cylinder' | 'hexagon' | 'diamond' | 'rounded' | 'rectangle' | 'circle';
|
|
13
|
+
/**
|
|
14
|
+
* Base class for all data flow nodes
|
|
15
|
+
*/
|
|
16
|
+
export declare abstract class BaseDataFlowNode implements DataFlowNode {
|
|
17
|
+
id: string;
|
|
18
|
+
label: string;
|
|
19
|
+
type: NodeType;
|
|
20
|
+
shape: NodeShape;
|
|
21
|
+
details?: string[] | undefined;
|
|
22
|
+
constructor(id: string, label: string, type: NodeType, shape: NodeShape, details?: string[] | undefined);
|
|
23
|
+
abstract getMermaidRepresentation(): string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Represents a data source (table, CTE, subquery)
|
|
27
|
+
*/
|
|
28
|
+
export declare class DataSourceNode extends BaseDataFlowNode {
|
|
29
|
+
constructor(id: string, label: string, type: 'table' | 'cte' | 'subquery');
|
|
30
|
+
getMermaidRepresentation(): string;
|
|
31
|
+
static createTable(tableName: string): DataSourceNode;
|
|
32
|
+
static createCTE(cteName: string): DataSourceNode;
|
|
33
|
+
static createSubquery(alias: string): DataSourceNode;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Represents a processing operation (WHERE, GROUP BY, SELECT, etc.)
|
|
37
|
+
*/
|
|
38
|
+
export declare class ProcessNode extends BaseDataFlowNode {
|
|
39
|
+
constructor(id: string, operation: string, context?: string);
|
|
40
|
+
getMermaidRepresentation(): string;
|
|
41
|
+
static createWhere(context: string): ProcessNode;
|
|
42
|
+
static createGroupBy(context: string): ProcessNode;
|
|
43
|
+
static createHaving(context: string): ProcessNode;
|
|
44
|
+
static createSelect(context: string): ProcessNode;
|
|
45
|
+
static createOrderBy(context: string): ProcessNode;
|
|
46
|
+
static createLimit(context: string, hasOffset?: boolean): ProcessNode;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Represents an operation (JOIN, UNION, etc.)
|
|
50
|
+
*/
|
|
51
|
+
export declare class OperationNode extends BaseDataFlowNode {
|
|
52
|
+
constructor(id: string, operation: string);
|
|
53
|
+
getMermaidRepresentation(): string;
|
|
54
|
+
static createJoin(joinId: string, joinType: string): OperationNode;
|
|
55
|
+
static createUnion(unionId: string, unionType?: string): OperationNode;
|
|
56
|
+
static createSetOperation(operationId: string, operation: string): OperationNode;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Represents the final output
|
|
60
|
+
*/
|
|
61
|
+
export declare class OutputNode extends BaseDataFlowNode {
|
|
62
|
+
constructor(context?: string);
|
|
63
|
+
getMermaidRepresentation(): string;
|
|
64
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base class for all data flow nodes
|
|
3
|
+
*/
|
|
4
|
+
export class BaseDataFlowNode {
|
|
5
|
+
constructor(id, label, type, shape, details) {
|
|
6
|
+
this.id = id;
|
|
7
|
+
this.label = label;
|
|
8
|
+
this.type = type;
|
|
9
|
+
this.shape = shape;
|
|
10
|
+
this.details = details;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Represents a data source (table, CTE, subquery)
|
|
15
|
+
*/
|
|
16
|
+
export class DataSourceNode extends BaseDataFlowNode {
|
|
17
|
+
constructor(id, label, type) {
|
|
18
|
+
super(id, label, type, 'cylinder');
|
|
19
|
+
}
|
|
20
|
+
getMermaidRepresentation() {
|
|
21
|
+
return `${this.id}[(${this.label})]`;
|
|
22
|
+
}
|
|
23
|
+
static createTable(tableName) {
|
|
24
|
+
return new DataSourceNode(`table_${tableName}`, tableName, 'table');
|
|
25
|
+
}
|
|
26
|
+
static createCTE(cteName) {
|
|
27
|
+
return new DataSourceNode(`cte_${cteName}`, `CTE:${cteName}`, 'cte');
|
|
28
|
+
}
|
|
29
|
+
static createSubquery(alias) {
|
|
30
|
+
return new DataSourceNode(`subquery_${alias}`, `QUERY:${alias}`, 'subquery');
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Represents a processing operation (WHERE, GROUP BY, SELECT, etc.)
|
|
35
|
+
*/
|
|
36
|
+
export class ProcessNode extends BaseDataFlowNode {
|
|
37
|
+
constructor(id, operation, context = '') {
|
|
38
|
+
const nodeId = context ? `${context}_${operation.toLowerCase().replace(/\s+/g, '_')}` : operation.toLowerCase().replace(/\s+/g, '_');
|
|
39
|
+
super(nodeId, operation, 'process', 'hexagon');
|
|
40
|
+
}
|
|
41
|
+
getMermaidRepresentation() {
|
|
42
|
+
return `${this.id}{{${this.label}}}`;
|
|
43
|
+
}
|
|
44
|
+
static createWhere(context) {
|
|
45
|
+
return new ProcessNode(`${context}_where`, 'WHERE', context);
|
|
46
|
+
}
|
|
47
|
+
static createGroupBy(context) {
|
|
48
|
+
return new ProcessNode(`${context}_group_by`, 'GROUP BY', context);
|
|
49
|
+
}
|
|
50
|
+
static createHaving(context) {
|
|
51
|
+
return new ProcessNode(`${context}_having`, 'HAVING', context);
|
|
52
|
+
}
|
|
53
|
+
static createSelect(context) {
|
|
54
|
+
return new ProcessNode(`${context}_select`, 'SELECT', context);
|
|
55
|
+
}
|
|
56
|
+
static createOrderBy(context) {
|
|
57
|
+
return new ProcessNode(`${context}_order_by`, 'ORDER BY', context);
|
|
58
|
+
}
|
|
59
|
+
static createLimit(context, hasOffset = false) {
|
|
60
|
+
const label = hasOffset ? 'LIMIT/OFFSET' : 'LIMIT';
|
|
61
|
+
return new ProcessNode(`${context}_limit`, label, context);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Represents an operation (JOIN, UNION, etc.)
|
|
66
|
+
*/
|
|
67
|
+
export class OperationNode extends BaseDataFlowNode {
|
|
68
|
+
constructor(id, operation) {
|
|
69
|
+
super(id, operation, 'operation', 'diamond');
|
|
70
|
+
}
|
|
71
|
+
getMermaidRepresentation() {
|
|
72
|
+
return `${this.id}{${this.label}}`;
|
|
73
|
+
}
|
|
74
|
+
static createJoin(joinId, joinType) {
|
|
75
|
+
let label;
|
|
76
|
+
const normalizedType = joinType.trim().toLowerCase();
|
|
77
|
+
if (normalizedType === 'join') {
|
|
78
|
+
label = 'INNER JOIN';
|
|
79
|
+
}
|
|
80
|
+
else if (normalizedType.endsWith(' join')) {
|
|
81
|
+
label = normalizedType.toUpperCase();
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
label = normalizedType.toUpperCase() + ' JOIN';
|
|
85
|
+
}
|
|
86
|
+
return new OperationNode(`join_${joinId}`, label);
|
|
87
|
+
}
|
|
88
|
+
static createUnion(unionId, unionType = 'UNION ALL') {
|
|
89
|
+
return new OperationNode(`${unionType.toLowerCase().replace(/\s+/g, '_')}_${unionId}`, unionType.toUpperCase());
|
|
90
|
+
}
|
|
91
|
+
static createSetOperation(operationId, operation) {
|
|
92
|
+
const normalizedOp = operation.toUpperCase();
|
|
93
|
+
const id = `${normalizedOp.toLowerCase().replace(/\s+/g, '_')}_${operationId}`;
|
|
94
|
+
return new OperationNode(id, normalizedOp);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Represents the final output
|
|
99
|
+
*/
|
|
100
|
+
export class OutputNode extends BaseDataFlowNode {
|
|
101
|
+
constructor(context = 'main') {
|
|
102
|
+
const label = context === 'main' ? 'Final Result' : `${context} Result`;
|
|
103
|
+
super(`${context}_output`, label, 'output', 'rounded');
|
|
104
|
+
}
|
|
105
|
+
getMermaidRepresentation() {
|
|
106
|
+
return `${this.id}(${this.label})`;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=DataFlowNode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataFlowNode.js","sourceRoot":"","sources":["../../../../../src/reporting/models/DataFlowNode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { WithClause } from '../../models/Clause';
|
|
2
|
+
import { DataFlowGraph } from '../models/DataFlowGraph';
|
|
3
|
+
/**
|
|
4
|
+
* Handles the processing of Common Table Expressions (CTEs)
|
|
5
|
+
*/
|
|
6
|
+
export declare class CTEHandler {
|
|
7
|
+
private graph;
|
|
8
|
+
constructor(graph: DataFlowGraph);
|
|
9
|
+
/**
|
|
10
|
+
* Processes all CTEs in a WITH clause
|
|
11
|
+
*/
|
|
12
|
+
processCTEs(withClause: WithClause, cteNames: Set<string>, queryProcessor: (query: any, context: string, cteNames: Set<string>) => string): void;
|
|
13
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handles the processing of Common Table Expressions (CTEs)
|
|
3
|
+
*/
|
|
4
|
+
export class CTEHandler {
|
|
5
|
+
constructor(graph) {
|
|
6
|
+
this.graph = graph;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Processes all CTEs in a WITH clause
|
|
10
|
+
*/
|
|
11
|
+
processCTEs(withClause, cteNames, queryProcessor) {
|
|
12
|
+
for (const cte of withClause.tables) {
|
|
13
|
+
const cteName = cte.getSourceAliasName();
|
|
14
|
+
// Create virtual data source node for CTE
|
|
15
|
+
const cteNode = this.graph.getOrCreateCTE(cteName);
|
|
16
|
+
// Track CTE name
|
|
17
|
+
cteNames.add(cteName);
|
|
18
|
+
// Process CTE query and connect its result to the CTE virtual data source
|
|
19
|
+
const cteResultId = queryProcessor(cte.query, `cte_${cteName}`, cteNames);
|
|
20
|
+
// Connect CTE query result to CTE virtual data source
|
|
21
|
+
if (cteResultId && !this.graph.hasConnection(cteResultId, cteNode.id)) {
|
|
22
|
+
this.graph.addConnection(cteResultId, cteNode.id);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=CTEHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CTEHandler.js","sourceRoot":"","sources":["../../../../../src/reporting/services/CTEHandler.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,OAAO,UAAU;IACnB,YAAoB,KAAoB;QAApB,UAAK,GAAL,KAAK,CAAe;IAAG,CAAC;IAE5C;;OAEG;IACH,WAAW,CACP,UAAsB,EACtB,QAAqB,EACrB,cAA8E;QAE9E,KAAK,MAAM,GAAG,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;YAClC,MAAM,OAAO,GAAG,GAAG,CAAC,kBAAkB,EAAE,CAAC;YAEzC,0CAA0C;YAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YAEnD,iBAAiB;YACjB,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAEtB,0EAA0E;YAC1E,MAAM,WAAW,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;YAE1E,sDAAsD;YACtD,IAAI,WAAW,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,WAAW,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;gBACpE,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,WAAW,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;YACtD,CAAC;QACL,CAAC;IACL,CAAC;CACJ"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { SourceExpression } from '../../models/Clause';
|
|
2
|
+
import { DataFlowGraph } from '../models/DataFlowGraph';
|
|
3
|
+
/**
|
|
4
|
+
* Handles the processing of data sources (tables, CTEs, subqueries)
|
|
5
|
+
*/
|
|
6
|
+
export declare class DataSourceHandler {
|
|
7
|
+
private graph;
|
|
8
|
+
constructor(graph: DataFlowGraph);
|
|
9
|
+
/**
|
|
10
|
+
* Processes a source expression and returns the node ID
|
|
11
|
+
*/
|
|
12
|
+
processSource(sourceExpr: SourceExpression, cteNames: Set<string>, queryProcessor: (query: any, context: string, cteNames: Set<string>) => string): string;
|
|
13
|
+
/**
|
|
14
|
+
* Processes a table source (including CTE references)
|
|
15
|
+
*/
|
|
16
|
+
private processTableSource;
|
|
17
|
+
/**
|
|
18
|
+
* Processes a subquery source
|
|
19
|
+
*/
|
|
20
|
+
private processSubquerySource;
|
|
21
|
+
/**
|
|
22
|
+
* Extracts table node IDs from a FROM clause for WHERE subqueries
|
|
23
|
+
*/
|
|
24
|
+
extractTableNodeIds(fromClause: any, cteNames: Set<string>): string[];
|
|
25
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { TableSource, SubQuerySource } from '../../models/Clause';
|
|
2
|
+
/**
|
|
3
|
+
* Handles the processing of data sources (tables, CTEs, subqueries)
|
|
4
|
+
*/
|
|
5
|
+
export class DataSourceHandler {
|
|
6
|
+
constructor(graph) {
|
|
7
|
+
this.graph = graph;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Processes a source expression and returns the node ID
|
|
11
|
+
*/
|
|
12
|
+
processSource(sourceExpr, cteNames, queryProcessor) {
|
|
13
|
+
if (sourceExpr.datasource instanceof TableSource) {
|
|
14
|
+
return this.processTableSource(sourceExpr.datasource, cteNames);
|
|
15
|
+
}
|
|
16
|
+
else if (sourceExpr.datasource instanceof SubQuerySource) {
|
|
17
|
+
return this.processSubquerySource(sourceExpr, cteNames, queryProcessor);
|
|
18
|
+
}
|
|
19
|
+
throw new Error('Unsupported source type');
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Processes a table source (including CTE references)
|
|
23
|
+
*/
|
|
24
|
+
processTableSource(tableSource, cteNames) {
|
|
25
|
+
const tableName = tableSource.getSourceName();
|
|
26
|
+
if (cteNames.has(tableName)) {
|
|
27
|
+
// Reference to existing CTE
|
|
28
|
+
const cteNode = this.graph.getOrCreateCTE(tableName);
|
|
29
|
+
return cteNode.id;
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
// Regular table
|
|
33
|
+
const tableNode = this.graph.getOrCreateTable(tableName);
|
|
34
|
+
return tableNode.id;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Processes a subquery source
|
|
39
|
+
*/
|
|
40
|
+
processSubquerySource(sourceExpr, cteNames, queryProcessor) {
|
|
41
|
+
var _a;
|
|
42
|
+
const alias = ((_a = sourceExpr.aliasExpression) === null || _a === void 0 ? void 0 : _a.table.name) || 'subquery';
|
|
43
|
+
// Create virtual data source node for named subquery
|
|
44
|
+
const subqueryNode = this.graph.getOrCreateSubquery(alias);
|
|
45
|
+
// Process subquery content and connect its result to the subquery virtual data source
|
|
46
|
+
const subqueryResultId = queryProcessor(sourceExpr.datasource.query, `subquery_${alias}_internal`, cteNames);
|
|
47
|
+
// Connect subquery result to subquery virtual data source
|
|
48
|
+
if (subqueryResultId && !this.graph.hasConnection(subqueryResultId, subqueryNode.id)) {
|
|
49
|
+
this.graph.addConnection(subqueryResultId, subqueryNode.id);
|
|
50
|
+
}
|
|
51
|
+
return subqueryNode.id;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Extracts table node IDs from a FROM clause for WHERE subqueries
|
|
55
|
+
*/
|
|
56
|
+
extractTableNodeIds(fromClause, cteNames) {
|
|
57
|
+
const tableNodeIds = [];
|
|
58
|
+
const sourceExpr = fromClause.source;
|
|
59
|
+
// Process main source
|
|
60
|
+
if (sourceExpr.datasource instanceof TableSource) {
|
|
61
|
+
const tableName = sourceExpr.datasource.getSourceName();
|
|
62
|
+
if (cteNames.has(tableName)) {
|
|
63
|
+
const cteNode = this.graph.getOrCreateCTE(tableName);
|
|
64
|
+
tableNodeIds.push(cteNode.id);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
const tableNode = this.graph.getOrCreateTable(tableName);
|
|
68
|
+
tableNodeIds.push(tableNode.id);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// Process JOINs
|
|
72
|
+
if (fromClause.joins && fromClause.joins.length > 0) {
|
|
73
|
+
for (const join of fromClause.joins) {
|
|
74
|
+
const joinSourceExpr = join.source;
|
|
75
|
+
if (joinSourceExpr.datasource instanceof TableSource) {
|
|
76
|
+
const tableName = joinSourceExpr.datasource.getSourceName();
|
|
77
|
+
if (cteNames.has(tableName)) {
|
|
78
|
+
const cteNode = this.graph.getOrCreateCTE(tableName);
|
|
79
|
+
tableNodeIds.push(cteNode.id);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
const tableNode = this.graph.getOrCreateTable(tableName);
|
|
83
|
+
tableNodeIds.push(tableNode.id);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return tableNodeIds;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=DataSourceHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataSourceHandler.js","sourceRoot":"","sources":["../../../../../src/reporting/services/DataSourceHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { FromClause } from '../../models/Clause';
|
|
2
|
+
import { DataFlowGraph } from '../models/DataFlowGraph';
|
|
3
|
+
import { DataSourceHandler } from './DataSourceHandler';
|
|
4
|
+
/**
|
|
5
|
+
* Handles the processing of JOIN operations
|
|
6
|
+
*/
|
|
7
|
+
export declare class JoinHandler {
|
|
8
|
+
private graph;
|
|
9
|
+
private dataSourceHandler;
|
|
10
|
+
private joinIdCounter;
|
|
11
|
+
constructor(graph: DataFlowGraph, dataSourceHandler: DataSourceHandler);
|
|
12
|
+
/**
|
|
13
|
+
* Resets the join ID counter for deterministic IDs
|
|
14
|
+
*/
|
|
15
|
+
resetJoinCounter(): void;
|
|
16
|
+
/**
|
|
17
|
+
* Gets the next join ID
|
|
18
|
+
*/
|
|
19
|
+
private getNextJoinId;
|
|
20
|
+
/**
|
|
21
|
+
* Processes a FROM clause with JOINs and returns the final node ID
|
|
22
|
+
*/
|
|
23
|
+
processFromClause(fromClause: FromClause, cteNames: Set<string>, queryProcessor: (query: any, context: string, cteNames: Set<string>) => string): string;
|
|
24
|
+
/**
|
|
25
|
+
* Processes a series of JOINs sequentially
|
|
26
|
+
*/
|
|
27
|
+
private processJoins;
|
|
28
|
+
/**
|
|
29
|
+
* Gets nullability labels for JOIN edges based on JOIN type
|
|
30
|
+
*/
|
|
31
|
+
private getJoinNullabilityLabels;
|
|
32
|
+
}
|