rhombic
Version:
SQL parsing, lineage extraction and manipulation
78 lines • 3.74 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.SqlCompletionParseTree = exports.isCompletionOptions = void 0;
const CompletionVisitor_1 = require("./CompletionVisitor");
const SqlLineageParseTree_1 = require("./SqlLineageParseTree");
const isCompletionOptions = (options) => {
return "cursorPosition" in options;
};
exports.isCompletionOptions = isCompletionOptions;
class SqlCompletionParseTree extends SqlLineageParseTree_1.SqlLineageParseTree {
constructor(tree, cursor) {
super(tree, cursor);
}
/**
* This method computes completion suggestions at the cursor position for the parsed query.
*
* @param metadataProvider Metadata lookup functions
* @returns A list of possible completions at the cursor position in the parsed query
*/
getSuggestions(metadataProvider) {
const completionVisitor = new CompletionVisitor_1.CompletionVisitor(this.cursor, args => metadataProvider.getColumns(args));
this.tree.accept(completionVisitor);
const completions = completionVisitor.getSuggestions();
const completionItems = [];
switch (completions.type) {
case "column": {
const columns = completions.columns.map(col => {
return { type: "column", relation: col.relation, value: col.name, desc: col.desc };
});
completionItems.push(...columns);
break;
}
case "relation": {
// always include cte names
const cteCompletions = completions.relations.map(rel => {
return { type: "relation", value: rel };
});
completionItems.push(...cteCompletions);
// fetch tables
const args = completions.incompleteReference && {
catalogOrSchema: completions.incompleteReference.references[0],
schema: completions.incompleteReference.references[1]
};
const tableCompletions = metadataProvider
.getTables(args)
.map(t => {
return { type: "relation", value: t.name, desc: t };
});
completionItems.push(...tableCompletions);
// fetch schemas if only a one-part prefix (or no prefix) was entered
if (completions.incompleteReference === undefined || completions.incompleteReference.references.length == 1) {
const args = completions.incompleteReference && { catalog: completions.incompleteReference.references[0] };
const schemaCompletions = metadataProvider
.getSchemas(args)
.map(s => {
return { type: "schema", value: s };
});
completionItems.push(...schemaCompletions);
}
// fetch catalogs if no prefix was entered
if (completions.incompleteReference === undefined) {
const catalogCompletions = metadataProvider.getCatalogs().map(c => {
return { type: "catalog", value: c };
});
completionItems.push(...catalogCompletions);
}
break;
}
}
const snippets = completions.snippets.map(s => {
return { type: "snippet", label: s.label, template: s.template };
});
completionItems.push(...snippets);
return completionItems;
}
}
exports.SqlCompletionParseTree = SqlCompletionParseTree;
//# sourceMappingURL=SqlCompletionParseTree.js.map