rawsql-ts
Version:
[beta]High-performance SQL parser and AST analyzer written in TypeScript. Provides fast parsing and advanced transformation capabilities.
58 lines • 2.58 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.CTEHandler = void 0;
/**
* Handles the processing of Common Table Expressions (CTEs)
*/
class CTEHandler {
constructor(graph) {
this.graph = graph;
}
/**
* Processes all CTEs in a WITH clause
*/
processCTEs(withClause, cteNames, queryProcessor) {
// First pass: Create all CTE nodes and add names to tracking set
for (let i = 0; i < withClause.tables.length; i++) {
const cte = withClause.tables[i];
const cteName = cte.getSourceAliasName();
// Create virtual data source node for CTE
const cteNode = this.graph.getOrCreateCTE(cteName);
// Track CTE name (this allows recursive references)
cteNames.add(cteName);
// Check if this is a recursive CTE
// In WITH RECURSIVE, only the first CTE is recursive
const isRecursive = withClause.recursive && i === 0;
if (isRecursive) {
// Add recursive annotation to the CTE node
cteNode.addAnnotation('recursive');
}
}
// Second pass: Process CTE queries now that all names are available
for (let i = 0; i < withClause.tables.length; i++) {
const cte = withClause.tables[i];
const cteName = cte.getSourceAliasName();
const cteNode = this.graph.getOrCreateCTE(cteName);
// Process CTE query and connect its result to the CTE virtual data source
const cteResultId = queryProcessor(cte.query, `cte_${cteName}`, cteNames);
// Connect CTE query result to CTE virtual data source
if (cteResultId && !this.graph.hasConnection(cteResultId, cteNode.id)) {
// Add RECURSIVE label for first CTE in WITH RECURSIVE clause
const isRecursive = withClause.recursive && i === 0;
const label = isRecursive ? 'RECURSIVE' : undefined;
this.graph.addConnection(cteResultId, cteNode.id, label);
}
}
}
/**
* Detects if a query contains recursive references to a CTE
*/
detectRecursiveReference(query, cteName) {
// Simple heuristic: check if the query string contains the CTE name
// In a real implementation, you'd parse the query structure
const queryStr = query.toString().toLowerCase();
return queryStr.includes(cteName.toLowerCase());
}
}
exports.CTEHandler = CTEHandler;
//# sourceMappingURL=CTEHandler.js.map
;