@uwdata/mosaic-sql
Version:
SQL query construction and analysis.
38 lines (36 loc) • 1.24 kB
text/typescript
import { type ExprNode, isNode } from '../ast/node.js';
import { recurse } from './recurse.js';
/**
* Rewrite a SQL expression, based on a map of nodes to replace.
* This method copies nodes as needed; it does not modify the input node.
* @param node The root AST node of the expression.
* @param map The rewrite map. When encountered, key nodes are replaced by value nodes.
*/
export function rewrite(node: ExprNode, map: Map<ExprNode, ExprNode>) {
if (map.has(node)) {
return map.get(node);
} else if (isNode(node)) {
const props = recurse[node.type];
const n = props?.length ?? 0;
if (n > 0) {
node = node.clone();
for (let i = 0; i < n; ++i) {
const prop = props[i];
// @ts-expect-error lookup valid property
const child = node[prop];
if (Array.isArray(child)) {
// @ts-expect-error rewrite known property
const a = (node[prop] = child.slice());
const m = child.length;
for (let j = 0; j < m; ++j) {
a[j] = rewrite(child[j], map);
}
} else if (child) {
// @ts-expect-error rewrite known property
node[prop] = rewrite(child, map);
}
}
}
}
return node;
}