mirror of
https://gitee.com/dromara/mayfly-go
synced 2025-11-03 16:00: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