rawsql-ts
Version:
[beta]High-performance SQL parser and AST analyzer written in TypeScript. Provides fast parsing and advanced transformation capabilities.
91 lines • 3.73 kB
JavaScript
import { TableSource, SubQuerySource } from '../../models/Clause';
/**
* Handles the processing of data sources (tables, CTEs, subqueries)
*/
export class DataSourceHandler {
constructor(graph) {
this.graph = graph;
}
/**
* Processes a source expression and returns the node ID
*/
processSource(sourceExpr, cteNames, queryProcessor) {
if (sourceExpr.datasource instanceof TableSource) {
return this.processTableSource(sourceExpr.datasource, cteNames);
}
else if (sourceExpr.datasource instanceof SubQuerySource) {
return this.processSubquerySource(sourceExpr, cteNames, queryProcessor);
}
throw new Error('Unsupported source type');
}
/**
* Processes a table source (including CTE references)
*/
processTableSource(tableSource, cteNames) {
const tableName = tableSource.getSourceName();
if (cteNames.has(tableName)) {
// Reference to existing CTE
const cteNode = this.graph.getOrCreateCTE(tableName);
return cteNode.id;
}
else {
// Regular table
const tableNode = this.graph.getOrCreateTable(tableName);
return tableNode.id;
}
}
/**
* Processes a subquery source
*/
processSubquerySource(sourceExpr, cteNames, queryProcessor) {
var _a;
const alias = ((_a = sourceExpr.aliasExpression) === null || _a === void 0 ? void 0 : _a.table.name) || 'subquery';
// Create virtual data source node for named subquery
const subqueryNode = this.graph.getOrCreateSubquery(alias);
// Process subquery content and connect its result to the subquery virtual data source
const subqueryResultId = queryProcessor(sourceExpr.datasource.query, `subquery_${alias}_internal`, cteNames);
// Connect subquery result to subquery virtual data source
if (subqueryResultId && !this.graph.hasConnection(subqueryResultId, subqueryNode.id)) {
this.graph.addConnection(subqueryResultId, subqueryNode.id);
}
return subqueryNode.id;
}
/**
* Extracts table node IDs from a FROM clause for WHERE subqueries
*/
extractTableNodeIds(fromClause, cteNames) {
const tableNodeIds = [];
const sourceExpr = fromClause.source;
// Process main source
if (sourceExpr.datasource instanceof TableSource) {
const tableName = sourceExpr.datasource.getSourceName();
if (cteNames.has(tableName)) {
const cteNode = this.graph.getOrCreateCTE(tableName);
tableNodeIds.push(cteNode.id);
}
else {
const tableNode = this.graph.getOrCreateTable(tableName);
tableNodeIds.push(tableNode.id);
}
}
// Process JOINs
if (fromClause.joins && fromClause.joins.length > 0) {
for (const join of fromClause.joins) {
const joinSourceExpr = join.source;
if (joinSourceExpr.datasource instanceof TableSource) {
const tableName = joinSourceExpr.datasource.getSourceName();
if (cteNames.has(tableName)) {
const cteNode = this.graph.getOrCreateCTE(tableName);
tableNodeIds.push(cteNode.id);
}
else {
const tableNode = this.graph.getOrCreateTable(tableName);
tableNodeIds.push(tableNode.id);
}
}
}
}
return tableNodeIds;
}
}
//# sourceMappingURL=DataSourceHandler.js.map