UNPKG

rhombic

Version:

SQL parsing, lineage extraction and manipulation

78 lines 3.74 kB
"use strict"; 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