From f4b59b8503a418f8ffd9b1ad602c74911ba30258 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E5=AE=97=E6=B4=8B?= Date: Tue, 13 Jun 2023 16:45:04 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E5=8D=95=E8=A1=A8=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E6=94=AF=E6=8C=81=E6=97=A0=E5=88=AB=E5=90=8D=E6=8F=90?= =?UTF-8?q?=E7=A4=BA=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mayfly_go_web/src/views/ops/db/SqlExec.vue | 101 ++++++++++++--------- 1 file changed, 59 insertions(+), 42 deletions(-) diff --git a/mayfly_go_web/src/views/ops/db/SqlExec.vue b/mayfly_go_web/src/views/ops/db/SqlExec.vue index 690decb3..a5a6fa62 100644 --- a/mayfly_go_web/src/views/ops/db/SqlExec.vue +++ b/mayfly_go_web/src/views/ops/db/SqlExec.vue @@ -440,7 +440,7 @@ const reloadTables = (nodeKey: string) => { const registerSqlCompletionItemProvider = () => { // 参考 https://microsoft.github.io/monaco-editor/playground.html#extending-language-services-completion-provider-example self.completionItemProvider = self.completionItemProvider || monaco.languages.registerCompletionItemProvider('sql', { - triggerCharacters: ['.'], + triggerCharacters: ['.', ' '], provideCompletionItems: async (model: editor.ITextModel, position: Position): Promise => { let word = model.getWordUntilPosition(position); const nowTab = state.tabs.get(state.activeName); @@ -495,6 +495,33 @@ const registerSqlCompletionItemProvider = () => { const dbs = nowTab.params?.dbs?.split(' ') || []; // console.log("光标前文本:=>" + textBeforePointerMulti) // console.log("最后输入的:=>" + lastToken) + + let suggestions: languages.CompletionItem[] = [] + const tables = await dbInst.loadTables(db); + + async function hintTableColumns (tableName, db) { + let dbHits = await dbInst.loadDbHints(db) + let columns = dbHits[tableName] + let suggestions: languages.CompletionItem[] = [] + columns?.forEach((a: string, index: any) => { + // 字段数据格式 字段名 字段注释, 如: create_time [datetime][创建时间] + const nameAndComment = a.split(" ") + const fieldName = nameAndComment[0] + suggestions.push({ + label: { + label: a, + description: 'column' + }, + kind: monaco.languages.CompletionItemKind.Property, + detail: '', // 不显示detail, 否则选中时备注等会被遮挡 + insertText: fieldName + ' ', // create_time + range, + sortText: 100 + index + '' // 使用表字段声明顺序排序,排序需为字符串类型 + }); + }) + return suggestions + } + if (lastToken.indexOf('.') > -1 || secondToken.indexOf('.') > -1) { // 如果是.触发代码提示,则进行【 库.表名联想 】 或 【 表别名.表字段联想 】 let str = lastToken.substring(0, lastToken.lastIndexOf('.')) @@ -503,7 +530,6 @@ const registerSqlCompletionItemProvider = () => { } // 库.表名联想 - if (dbs && dbs.filter((a: any) => a === str)?.length > 0) { let tables = await dbInst.loadTables(str) let suggestions: languages.CompletionItem[] = [] @@ -526,36 +552,43 @@ const registerSqlCompletionItemProvider = () => { // 表别名.表字段联想 let tableInfo = getTableByAlias(sql, db, str) if (tableInfo.tableName) { - let table = tableInfo.tableName + let tableName = tableInfo.tableName let db = tableInfo.dbName; // 取出表名并提示 - let dbHits = await dbInst.loadDbHints(db) - let columns = dbHits[table] - let suggestions: languages.CompletionItem[] = [] - columns?.forEach((a: string, index: any) => { - // 字段数据格式 字段名 字段注释, 如: create_time [datetime][创建时间] - const nameAndComment = a.split(" ") - const fieldName = nameAndComment[0] - suggestions.push({ - label: { - label: a, - description: 'column' - }, - kind: monaco.languages.CompletionItemKind.Property, - detail: '', // 不显示detail, 否则选中时备注等会被遮挡 - insertText: fieldName + ' ', // create_time - range, - sortText: 100 + index + '' // 使用表字段声明顺序排序,排序需为字符串类型 - }); - }) - return { suggestions } + let suggestions = await hintTableColumns(tableName, db); + if(suggestions.length > 0){ + return { suggestions }; + } } return { suggestions: [] } + }else{ + // 如果sql里含有表名,则提示表字段 + let mat = textBeforePointerMulti.match(/from\n*\s+\n*(\w+)\n*\s+\n*/i) + if(mat && mat.length > 1){ + let tableName = mat[1] + // 取出表名并提示 + let suggestions = await hintTableColumns(tableName, db); + if(suggestions.length > 0){ + return { suggestions }; + } + } } - // 库名联想 + // 表名联想 + tables.forEach((tableMeta: any) => { + const {tableName, tableComment} = tableMeta; + suggestions.push({ + label: { + label: tableName + ' - ' + tableComment, + description: 'table' + }, + kind: monaco.languages.CompletionItemKind.File, + detail: tableComment, + insertText: tableName + ' ', + range + }); + }); - let suggestions: languages.CompletionItem[] = [] // mysql关键字 sqlLanguage.keywords.forEach((item: any) => { suggestions.push({ @@ -606,7 +639,7 @@ const registerSqlCompletionItemProvider = () => { }) // 库名提示 - if (dbs) { + if (dbs && dbs.length > 0) { dbs.forEach((a: any) => { suggestions.push({ label: { @@ -620,22 +653,6 @@ const registerSqlCompletionItemProvider = () => { }) } - const tables = await dbInst.loadTables(db); - // 表名联想 - tables.forEach((tableMeta: any) => { - const { tableName, tableComment } = tableMeta - suggestions.push({ - label: { - label: tableName + ' - ' + tableComment, - description: 'table' - }, - kind: monaco.languages.CompletionItemKind.File, - detail: tableComment, - insertText: tableName + ' ', - range - }); - }) - // 默认提示 return { suggestions: suggestions