forked from OtterMind/Chat2DB
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtable.ts
More file actions
97 lines (85 loc) · 2.91 KB
/
Copy pathtable.ts
File metadata and controls
97 lines (85 loc) · 2.91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import { DatabaseTypeCode } from '@/constants';
import * as monaco from 'monaco-editor/esm/vs/editor/editor.api';
import { addIntelliSenseField } from './field';
import i18n from '@/i18n';
import { compatibleDataBaseName } from '../database';
export const resetSenseTable = () => {
intelliSenseTable.dispose();
};
/** 当前库下的表 */
let intelliSenseTable = monaco.languages.registerCompletionItemProvider('sql', {
provideCompletionItems: () => {
return { suggestions: [] };
},
});
const checkTableContext = (text) => {
const normalizedText = text.trim().toUpperCase();
const tableKeywords = ['FROM', 'JOIN', 'INNER JOIN', 'LEFT JOIN', 'RIGHT JOIN', 'UPDATE'];
for (const keyword of tableKeywords) {
if (normalizedText.endsWith(keyword)) {
return true;
}
}
return false;
};
const handleInsertText = (keyword: string, tableName: string, databaseCode: DatabaseTypeCode) => {
if (/^[\"\`\[]/.test(keyword)) {
return tableName;
}
return compatibleDataBaseName(tableName, databaseCode);
};
const registerIntelliSenseTable = (
tableList: Array<{ name: string; comment: string }>,
databaseCode: DatabaseTypeCode,
dataSourceId?: number,
databaseName?: string | null,
schemaName?: string | null,
) => {
monaco.editor.registerCommand('addFieldList', (_: any, ...args: any[]) => {
addIntelliSenseField(args[0]);
return;
});
resetSenseTable();
intelliSenseTable = monaco.languages.registerCompletionItemProvider('sql', {
triggerCharacters: [' ', '.'],
provideCompletionItems: (model, position) => {
const lineContentUntilPosition = model.getValueInRange({
startLineNumber: position.lineNumber,
startColumn: 1,
endLineNumber: position.lineNumber,
endColumn: position.column,
});
const isTableContext = checkTableContext(lineContentUntilPosition);
// 获取触发提示的字符
const match = lineContentUntilPosition.match(/\S+$/);
const word = match ? match[0] : '';
return {
suggestions: (tableList || []).map((tableName) => ({
label: {
label: tableName.name,
detail: databaseName ? `(${databaseName})` : null,
description: i18n('sqlEditor.text.tableName'),
},
kind: monaco.languages.CompletionItemKind.Folder,
insertText: handleInsertText(word, tableName.name, databaseCode),
// range: monaco.Range.fromPositions(position),
// documentation: tableName.comment,
sortText: isTableContext ? '01' : '08',
command: {
id: 'addFieldList',
title: 'addFieldList',
arguments: [
{
tableName: tableName.name,
dataSourceId,
databaseName,
schemaName,
},
],
},
})),
};
},
});
};
export { intelliSenseTable, registerIntelliSenseTable };