Skip to content

Commit bd5202c

Browse files
committed
merge
2 parents a6fbbab + 0716f16 commit bd5202c

3 files changed

Lines changed: 420 additions & 25 deletions

File tree

chat2db-client/src/utils/IntelliSense/field.ts

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,25 @@ const addIntelliSenseField = async (props: {
3131
}
3232
};
3333

34+
function checkFieldContext(text) {
35+
const normalizedText = text.trim().toUpperCase();
36+
const columnKeywords = ['SELECT', 'WHERE', 'AND', 'OR', 'GROUP BY', 'ORDER BY', 'SET'];
37+
38+
for (const keyword of columnKeywords) {
39+
if (normalizedText.endsWith(keyword)) {
40+
return true;
41+
}
42+
}
43+
44+
return false;
45+
}
46+
3447
const registerIntelliSenseField = (tableList: string[], dataSourceId, databaseName, schemaName) => {
3548
intelliSenseField.dispose();
3649
fieldList = {};
3750
intelliSenseField = monaco.languages.registerCompletionItemProvider('sql', {
3851
triggerCharacters: [' ', '.', '('],
3952
provideCompletionItems: async (model, position) => {
40-
console.log('registerIntelliSenseField');
41-
4253
// 获取到当前行文本
4354
const textUntilPosition = model.getValueInRange({
4455
startLineNumber: position.lineNumber,
@@ -47,7 +58,9 @@ const registerIntelliSenseField = (tableList: string[], dataSourceId, databaseNa
4758
endColumn: position.column,
4859
});
4960

61+
const isFieldContext = checkFieldContext(textUntilPosition);
5062
const match = textUntilPosition.match(/(\b\w+\b)[^\w]*$/);
63+
5164
let word;
5265
if (match) {
5366
word = match[1];
@@ -58,7 +71,6 @@ const registerIntelliSenseField = (tableList: string[], dataSourceId, databaseNa
5871
return; // 如果没有匹配到,直接返回
5972
}
6073
if (word && tableList.includes(word) && !fieldList[word]) {
61-
console.log('registerIntelliSenseField start word');
6274
const data = await sqlService.getAllFieldByTable({
6375
dataSourceId,
6476
databaseName,
@@ -68,7 +80,7 @@ const registerIntelliSenseField = (tableList: string[], dataSourceId, databaseNa
6880
fieldList[word] = data;
6981
}
7082

71-
const suggestions = Object.keys(fieldList).reduce((acc, cur) => {
83+
const suggestions: monaco.languages.CompletionItem[] = Object.keys(fieldList).reduce((acc, cur) => {
7284
const arr = fieldList[cur].map((fieldObj) => ({
7385
label: {
7486
label: fieldObj.name,
@@ -77,11 +89,11 @@ const registerIntelliSenseField = (tableList: string[], dataSourceId, databaseNa
7789
},
7890
kind: monaco.languages.CompletionItemKind.Field,
7991
insertText: fieldObj.name,
92+
sortText: (isFieldContext ? '01' : '02') + fieldObj.name,
8093
}));
8194

8295
return [...acc, ...arr];
8396
}, []);
84-
console.log('field suggestions', suggestions);
8597

8698
return {
8799
suggestions,

chat2db-client/src/utils/IntelliSense/table.ts

Lines changed: 48 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,47 @@ let intelliSenseTable = monaco.languages.registerCompletionItemProvider('sql', {
1111
},
1212
});
1313

14+
/** 根据不同的数据库,插入不同的表名 */
15+
const handleInsertText = (text, databaseCode: DatabaseTypeCode = DatabaseTypeCode.MYSQL) => {
16+
if (
17+
[
18+
DatabaseTypeCode.POSTGRESQL,
19+
DatabaseTypeCode.ORACLE,
20+
DatabaseTypeCode.DB2,
21+
DatabaseTypeCode.SQLITE,
22+
].includes(databaseCode)
23+
) {
24+
return `\"${text}\"`;
25+
} else if([DatabaseTypeCode.SQLSERVER].includes(databaseCode)){
26+
return `[${text}]`;
27+
} else if ([DatabaseTypeCode.MYSQL].includes(databaseCode)) {
28+
return `\`${text}\``;
29+
} else {
30+
return `${text}`;
31+
}
32+
};
33+
34+
function checkTableContext(text) {
35+
const normalizedText = text.trim().toUpperCase();
36+
const tableKeywords = ['FROM', 'JOIN', 'INNER JOIN', 'LEFT JOIN', 'RIGHT JOIN', 'UPDATE'];
37+
38+
for (const keyword of tableKeywords) {
39+
if (normalizedText.endsWith(keyword)) {
40+
return true;
41+
}
42+
}
43+
44+
return false;
45+
}
46+
1447
const registerIntelliSenseTable = (
1548
tableList: Array<{ name: string; comment: string }>,
1649
databaseCode?: DatabaseTypeCode,
1750
dataSourceId?: number,
1851
databaseName?: string,
1952
schemaName?: string,
2053
) => {
21-
monaco.editor.registerCommand('myCustomCommand', (_: any, ...args: any[]) => {
22-
// access the arguments here
23-
console.log('trigger suggest', args[0]);
24-
// addIntelliSenseField(tableName)
54+
monaco.editor.registerCommand('addFieldList', (_: any, ...args: any[]) => {
2555
addIntelliSenseField(args[0]);
2656
return;
2757
});
@@ -30,13 +60,15 @@ const registerIntelliSenseTable = (
3060
intelliSenseTable = monaco.languages.registerCompletionItemProvider('sql', {
3161
triggerCharacters: [' '],
3262
provideCompletionItems: (model, position) => {
33-
const handleInsertText = (text) => {
34-
if (databaseCode === DatabaseTypeCode.POSTGRESQL) {
35-
return `${text}`;
36-
} else {
37-
return `${text}`;
38-
}
39-
};
63+
const lineContentUntilPosition = model.getValueInRange({
64+
startLineNumber: position.lineNumber,
65+
startColumn: 1,
66+
endLineNumber: position.lineNumber,
67+
endColumn: position.column,
68+
});
69+
70+
const isTableContext = checkTableContext(lineContentUntilPosition);
71+
4072
return {
4173
suggestions: (tableList || []).map((tableName) => {
4274
return {
@@ -46,12 +78,13 @@ const registerIntelliSenseTable = (
4678
description: '表名',
4779
},
4880
kind: monaco.languages.CompletionItemKind.Variable,
49-
insertText: handleInsertText(tableName.name),
81+
insertText: handleInsertText(tableName.name, databaseCode),
5082
// range: monaco.Range.fromPositions(position),
51-
documentation: tableName.comment,
83+
// documentation: tableName.comment,
84+
sortText: (isTableContext ? '01' : '02') + tableName.name,
5285
command: {
53-
id: 'myCustomCommand',
54-
title: 'operator_additional_suggestions',
86+
id: 'addFieldList',
87+
title: 'addFieldList',
5588
arguments: [
5689
{
5790
tableName: tableName.name,

0 commit comments

Comments
 (0)