mirror of
				https://gitee.com/dromara/mayfly-go
				synced 2025-11-04 08:20:25 +08:00 
			
		
		
		
	feat:单表查询支持无别名提示字段
This commit is contained in:
		@@ -440,7 +440,7 @@ const reloadTables = (nodeKey: string) => {
 | 
				
			|||||||
const registerSqlCompletionItemProvider = () => {
 | 
					const registerSqlCompletionItemProvider = () => {
 | 
				
			||||||
    // 参考 https://microsoft.github.io/monaco-editor/playground.html#extending-language-services-completion-provider-example
 | 
					    // 参考 https://microsoft.github.io/monaco-editor/playground.html#extending-language-services-completion-provider-example
 | 
				
			||||||
    self.completionItemProvider = self.completionItemProvider || monaco.languages.registerCompletionItemProvider('sql', {
 | 
					    self.completionItemProvider = self.completionItemProvider || monaco.languages.registerCompletionItemProvider('sql', {
 | 
				
			||||||
        triggerCharacters: ['.'],
 | 
					        triggerCharacters: ['.', ' '],
 | 
				
			||||||
        provideCompletionItems: async (model: editor.ITextModel, position: Position): Promise<languages.CompletionList | null | undefined> => {
 | 
					        provideCompletionItems: async (model: editor.ITextModel, position: Position): Promise<languages.CompletionList | null | undefined> => {
 | 
				
			||||||
            let word = model.getWordUntilPosition(position);
 | 
					            let word = model.getWordUntilPosition(position);
 | 
				
			||||||
            const nowTab = state.tabs.get(state.activeName);
 | 
					            const nowTab = state.tabs.get(state.activeName);
 | 
				
			||||||
@@ -495,6 +495,33 @@ const registerSqlCompletionItemProvider = () => {
 | 
				
			|||||||
            const dbs = nowTab.params?.dbs?.split(' ') || [];
 | 
					            const dbs = nowTab.params?.dbs?.split(' ') || [];
 | 
				
			||||||
            // console.log("光标前文本:=>" + textBeforePointerMulti)
 | 
					            // console.log("光标前文本:=>" + textBeforePointerMulti)
 | 
				
			||||||
            // console.log("最后输入的:=>" + lastToken)
 | 
					            // 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) {
 | 
					            if (lastToken.indexOf('.') > -1 || secondToken.indexOf('.') > -1) {
 | 
				
			||||||
                // 如果是.触发代码提示,则进行【 库.表名联想 】 或 【 表别名.表字段联想 】
 | 
					                // 如果是.触发代码提示,则进行【 库.表名联想 】 或 【 表别名.表字段联想 】
 | 
				
			||||||
                let str = lastToken.substring(0, lastToken.lastIndexOf('.'))
 | 
					                let str = lastToken.substring(0, lastToken.lastIndexOf('.'))
 | 
				
			||||||
@@ -503,7 +530,6 @@ const registerSqlCompletionItemProvider = () => {
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                // 库.表名联想
 | 
					                // 库.表名联想
 | 
				
			||||||
 | 
					 | 
				
			||||||
                if (dbs && dbs.filter((a: any) => a === str)?.length > 0) {
 | 
					                if (dbs && dbs.filter((a: any) => a === str)?.length > 0) {
 | 
				
			||||||
                    let tables = await dbInst.loadTables(str)
 | 
					                    let tables = await dbInst.loadTables(str)
 | 
				
			||||||
                    let suggestions: languages.CompletionItem[] = []
 | 
					                    let suggestions: languages.CompletionItem[] = []
 | 
				
			||||||
@@ -526,36 +552,43 @@ const registerSqlCompletionItemProvider = () => {
 | 
				
			|||||||
                // 表别名.表字段联想
 | 
					                // 表别名.表字段联想
 | 
				
			||||||
                let tableInfo = getTableByAlias(sql, db, str)
 | 
					                let tableInfo = getTableByAlias(sql, db, str)
 | 
				
			||||||
                if (tableInfo.tableName) {
 | 
					                if (tableInfo.tableName) {
 | 
				
			||||||
                    let table = tableInfo.tableName
 | 
					                    let tableName = tableInfo.tableName
 | 
				
			||||||
                    let db = tableInfo.dbName;
 | 
					                    let db = tableInfo.dbName;
 | 
				
			||||||
                    // 取出表名并提示
 | 
					                    // 取出表名并提示
 | 
				
			||||||
                    let dbHits = await dbInst.loadDbHints(db)
 | 
					                    let suggestions = await hintTableColumns(tableName, db);
 | 
				
			||||||
                    let columns = dbHits[table]
 | 
					                    if(suggestions.length > 0){
 | 
				
			||||||
                    let suggestions: languages.CompletionItem[] = []
 | 
					                        return { suggestions };
 | 
				
			||||||
                    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 }
 | 
					 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                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关键字
 | 
					            // mysql关键字
 | 
				
			||||||
            sqlLanguage.keywords.forEach((item: any) => {
 | 
					            sqlLanguage.keywords.forEach((item: any) => {
 | 
				
			||||||
                suggestions.push({
 | 
					                suggestions.push({
 | 
				
			||||||
@@ -606,7 +639,7 @@ const registerSqlCompletionItemProvider = () => {
 | 
				
			|||||||
            })
 | 
					            })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // 库名提示
 | 
					            // 库名提示
 | 
				
			||||||
            if (dbs) {
 | 
					            if (dbs && dbs.length > 0) {
 | 
				
			||||||
                dbs.forEach((a: any) => {
 | 
					                dbs.forEach((a: any) => {
 | 
				
			||||||
                    suggestions.push({
 | 
					                    suggestions.push({
 | 
				
			||||||
                        label: {
 | 
					                        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 {
 | 
					            return {
 | 
				
			||||||
                suggestions: suggestions
 | 
					                suggestions: suggestions
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user