rhombic
Version:
SQL parsing, lineage extraction and manipulation
75 lines • 2.58 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.LineageVisitor = void 0;
const QueryStructureVisitor_1 = require("./QueryStructureVisitor");
/**
* Visitor extending #QueryStructureVisitor and implementing #onRelation() and #onColumnReference()
* to build column-based SQL lineage.
*/
class LineageVisitor extends QueryStructureVisitor_1.QueryStructureVisitor {
constructor(getTable, options) {
super(getTable, options);
/** Collected relations (tables). */
this.tables = [];
/** Collected references (edges). */
this.edges = [];
}
//
// Overrides
//
onColumnReference(tableId, columnId) {
this.edges.push({
type: "edge",
edgeType: this.currentRelation.currentClause,
source: {
tableId: tableId,
columnId: columnId
},
target: {
tableId: this.currentRelation.id,
columnId: this.currentRelation.currentColumnId
}
});
}
onRelation(relation, alias) {
let label = alias !== null && alias !== void 0 ? alias : relation.id;
const columns = relation.columns.map(c => {
return {
id: c.id,
label: c.label,
range: c.range,
data: c.data,
isAssumed: c.isAssumed
};
});
let tablePrimary;
if (relation instanceof QueryStructureVisitor_1.TableRelation) {
label =
alias !== undefined && alias != relation.tablePrimary.tableName
? relation.tablePrimary.tableName + " -> " + alias
: relation.tablePrimary.tableName;
tablePrimary = relation.tablePrimary;
}
this.tables.push({
tablePrimary,
table: {
type: "table",
id: relation.id,
label: label,
range: relation.range,
data: relation instanceof QueryStructureVisitor_1.TableRelation ? relation.data : undefined,
isSourceOnly: relation instanceof QueryStructureVisitor_1.TableRelation ? true : undefined,
columns: columns
}
});
}
defaultResult() {
return;
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
aggregateResult(_aggregate, _nextResult) {
return;
}
}
exports.LineageVisitor = LineageVisitor;
//# sourceMappingURL=LineageVisitor.js.map