UNPKG

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
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