Skip to content

Commit 1dcfd49

Browse files
committed
perf: Add database to Intellisense
1 parent 18a27aa commit 1dcfd49

8 files changed

Lines changed: 104 additions & 58 deletions

File tree

chat2db-client/src/components/CascaderDB/index.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import cs from 'classnames';
55
import styles from './index.less';
66
import Iconfont from '../Iconfont';
77
import { databaseMap } from '@/constants/database';
8+
import { registerIntelliSenseDatabase } from '@/utils/IntelliSense';
89

910
interface IProps {
1011
className?: string;
@@ -55,7 +56,7 @@ function CascaderDB(props: IProps) {
5556
setCurDatabaseName(value);
5657
setSchemaOptions([]);
5758
setCurSchemeName('');
58-
59+
5960
props.onChange &&
6061
props.onChange({
6162
dataSourceId: curDataSourceId!,

chat2db-client/src/i18n/en-us/sqlEditor.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ export default {
22
'sqlEditor.text.keyword': 'Keyword',
33
'sqlEditor.text.function': 'Function',
44
'sqlEditor.text.tableName': 'TableName',
5+
'sqlEditor.text.databaseName': 'DatabaseName',
6+
'sqlEditor.text.schemaName': 'Schema',
57
'sqlEditor.text.viewName': 'ViewName',
68
'sqlEditor.text.fieldName': 'FieldName',
79

chat2db-client/src/i18n/zh-cn/sqlEditor.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ export default {
22
'sqlEditor.text.keyword': '关键词',
33
'sqlEditor.text.function': '函数',
44
'sqlEditor.text.tableName': '表名',
5+
'sqlEditor.text.databaseName': '数据库',
6+
'sqlEditor.text.schemaName': 'Schema',
57
'sqlEditor.text.viewName': '视图名',
68
'sqlEditor.text.fieldName': '字段名',
79
};

chat2db-client/src/pages/main/workspace/components/Tree/treeConfig.tsx

Lines changed: 9 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ export const treeConfig: { [key in TreeNodeType]: ITreeConfigItem } = {
100100
extraParams: {
101101
databaseType: t.type,
102102
dataSourceId: t.id,
103-
dataSourceName: t.name,
103+
dataSourceName: t.alias,
104104
},
105105
};
106106
});
@@ -324,9 +324,7 @@ export const treeConfig: { [key in TreeNodeType]: ITreeConfigItem } = {
324324

325325
[TreeNodeType.FUNCTION]: {
326326
icon: '\ue76a',
327-
operationColumn: [
328-
OperationColumn.CopyName
329-
],
327+
operationColumn: [OperationColumn.CopyName],
330328
},
331329

332330
[TreeNodeType.PROCEDURES]: {
@@ -363,9 +361,7 @@ export const treeConfig: { [key in TreeNodeType]: ITreeConfigItem } = {
363361

364362
[TreeNodeType.PROCEDURE]: {
365363
icon: '\ue73c',
366-
operationColumn: [
367-
OperationColumn.CopyName
368-
],
364+
operationColumn: [OperationColumn.CopyName],
369365
},
370366

371367
[TreeNodeType.TRIGGERS]: {
@@ -402,9 +398,7 @@ export const treeConfig: { [key in TreeNodeType]: ITreeConfigItem } = {
402398

403399
[TreeNodeType.TRIGGER]: {
404400
icon: '\ue64a',
405-
operationColumn: [
406-
OperationColumn.CopyName
407-
],
401+
operationColumn: [OperationColumn.CopyName],
408402
},
409403

410404
[TreeNodeType.VIEW]: {
@@ -422,9 +416,7 @@ export const treeConfig: { [key in TreeNodeType]: ITreeConfigItem } = {
422416
r(list);
423417
});
424418
},
425-
operationColumn: [
426-
OperationColumn.CopyName
427-
],
419+
operationColumn: [OperationColumn.CopyName],
428420
},
429421

430422
[TreeNodeType.VIEWCOLUMNS]: {
@@ -457,9 +449,7 @@ export const treeConfig: { [key in TreeNodeType]: ITreeConfigItem } = {
457449
},
458450
[TreeNodeType.VIEWCOLUMN]: {
459451
icon: '\ue647',
460-
operationColumn: [
461-
OperationColumn.CopyName
462-
],
452+
operationColumn: [OperationColumn.CopyName],
463453
},
464454

465455
[TreeNodeType.COLUMNS]: {
@@ -493,9 +483,7 @@ export const treeConfig: { [key in TreeNodeType]: ITreeConfigItem } = {
493483
},
494484
[TreeNodeType.COLUMN]: {
495485
icon: '\ue611',
496-
operationColumn: [
497-
OperationColumn.CopyName
498-
],
486+
operationColumn: [OperationColumn.CopyName],
499487
},
500488
[TreeNodeType.KEYS]: {
501489
icon: '\ueac5',
@@ -526,10 +514,7 @@ export const treeConfig: { [key in TreeNodeType]: ITreeConfigItem } = {
526514
},
527515
[TreeNodeType.KEY]: {
528516
icon: '\ue775',
529-
operationColumn: [
530-
OperationColumn.CopyName
531-
],
532-
517+
operationColumn: [OperationColumn.CopyName],
533518
},
534519
[TreeNodeType.INDEXES]: {
535520
icon: '\ueac5',
@@ -560,8 +545,6 @@ export const treeConfig: { [key in TreeNodeType]: ITreeConfigItem } = {
560545
},
561546
[TreeNodeType.INDEX]: {
562547
icon: '\ue65b',
563-
operationColumn: [
564-
OperationColumn.CopyName
565-
],
548+
operationColumn: [OperationColumn.CopyName],
566549
},
567550
};

chat2db-client/src/pages/main/workspace/components/WorkspaceHeader/index.tsx

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import styles from './index.less';
1515
import i18n from '@/i18n';
1616
import CreateDatabase, { ICreateDatabaseRef } from '@/components/CreateDatabase';
1717
import { getCurrentWorkspaceDatabase } from '@/utils/localStorage';
18+
import { registerIntelliSenseDatabase } from '@/utils/IntelliSense';
1819

1920
interface IProps {
2021
className?: string;
@@ -35,7 +36,6 @@ const notSupportCreateDatabaseType = [DatabaseTypeCode.H2];
3536
// 不支持创建schema的数据库类型
3637
const notSupportCreateSchemaType = [DatabaseTypeCode.ORACLE];
3738

38-
3939
const WorkspaceHeader = memo<IProps>((props) => {
4040
const { connectionModel, workspaceModel, mainPageModel, dispatch } = props;
4141
const { connectionList, curConnection } = connectionModel;
@@ -159,7 +159,11 @@ const WorkspaceHeader = memo<IProps>((props) => {
159159
label: t.name,
160160
};
161161
}) || [];
162+
162163
setCurDBOptions(dbList);
164+
registerIntelliSenseDatabase(
165+
res.map((t: any) => ({ name: t.name, dataSourceName: t.extraParams.dataSourceName })),
166+
);
163167
let databaseName = '';
164168
if (dbList.find((t: any) => t.value === localStorageWorkspaceDatabase.databaseName)) {
165169
databaseName = localStorageWorkspaceDatabase.databaseName!;
@@ -347,10 +351,7 @@ const WorkspaceHeader = memo<IProps>((props) => {
347351
value={[curWorkspaceParams?.databaseName || '']}
348352
>
349353
<div className={styles.crumbsItem}>
350-
<Iconfont
351-
className={styles.databaseTypeIcon}
352-
code="&#xe62c;"
353-
/>
354+
<Iconfont className={styles.databaseTypeIcon} code="&#xe62c;" />
354355
<div className={styles.text}>{curWorkspaceParams.databaseName}</div>
355356
<div className={styles.pullDownArrow}>
356357
<Iconfont code="&#xe88e;" />
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import * as monaco from 'monaco-editor/esm/vs/editor/editor.api';
2+
import i18n from '@/i18n';
3+
4+
let intelliSenseDatabase = monaco.languages.registerCompletionItemProvider('sql', {
5+
provideCompletionItems: () => {
6+
return { suggestions: [] };
7+
},
8+
});
9+
10+
const checkTableContext = (text) => {
11+
const normalizedText = text.trim().toUpperCase();
12+
const tableKeywords = ['FROM', 'JOIN', 'INNER JOIN', 'LEFT JOIN', 'RIGHT JOIN', 'UPDATE'];
13+
14+
for (const keyword of tableKeywords) {
15+
if (normalizedText.endsWith(keyword)) {
16+
return true;
17+
}
18+
}
19+
20+
return false;
21+
};
22+
23+
const registerIntelliSenseDatabase = (databaseName: Array<{name:string, dataSourceName:string}>) => {
24+
console.log('registerIntelliSenseDatabase', databaseName);
25+
intelliSenseDatabase.dispose();
26+
intelliSenseDatabase = monaco.languages.registerCompletionItemProvider('sql', {
27+
triggerCharacters: [' '],
28+
provideCompletionItems: (model, position) => {
29+
const lineContentUntilPosition = model.getValueInRange({
30+
startLineNumber: position.lineNumber,
31+
startColumn: 1,
32+
endLineNumber: position.lineNumber,
33+
endColumn: position.column,
34+
});
35+
const isTableContext = checkTableContext(lineContentUntilPosition);
36+
37+
return {
38+
suggestions: (databaseName || []).map(({name, dataSourceName}) => ({
39+
label: {
40+
label: name,
41+
// detail: `(${dataSourceName})`,
42+
description: i18n('sqlEditor.text.databaseName'),
43+
},
44+
sortText: isTableContext ? '01' : '08',
45+
kind: monaco.languages.CompletionItemKind.database,
46+
insertText: databaseName,
47+
})),
48+
};
49+
},
50+
});
51+
};
52+
53+
export { intelliSenseDatabase, registerIntelliSenseDatabase };
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
11
import { intelliSenseKeyword, registerIntelliSenseKeyword } from './keyword';
2+
import { intelliSenseDatabase, registerIntelliSenseDatabase } from './database';
23
import { intelliSenseTable, registerIntelliSenseTable } from './table';
34
import { intelliSenseField, registerIntelliSenseField } from './field';
5+
import { intelliSenseView, registerIntelliSenseView } from './view';
46
export {
57
intelliSenseKeyword,
68
registerIntelliSenseKeyword,
9+
intelliSenseDatabase,
10+
registerIntelliSenseDatabase,
711
intelliSenseTable,
812
registerIntelliSenseTable,
913
intelliSenseField,
1014
registerIntelliSenseField,
15+
intelliSenseView,
16+
registerIntelliSenseView,
1117
};

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

Lines changed: 24 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -63,32 +63,30 @@ const registerIntelliSenseTable = (
6363
const word = match ? match[0] : '';
6464

6565
return {
66-
suggestions: (tableList || []).map((tableName) => {
67-
return {
68-
label: {
69-
label: tableName.name,
70-
detail: databaseName ? `(${databaseName})` : null,
71-
description: i18n('sqlEditor.text.tableName'),
72-
},
73-
kind: monaco.languages.CompletionItemKind.Folder,
74-
insertText: handleInsertText(word, tableName.name, databaseCode),
75-
// range: monaco.Range.fromPositions(position),
76-
// documentation: tableName.comment,
77-
sortText: isTableContext ? '01' : '08',
78-
command: {
79-
id: 'addFieldList',
80-
title: 'addFieldList',
81-
arguments: [
82-
{
83-
tableName: tableName.name,
84-
dataSourceId,
85-
databaseName,
86-
schemaName,
87-
},
88-
],
89-
},
90-
};
91-
}),
66+
suggestions: (tableList || []).map((tableName) => ({
67+
label: {
68+
label: tableName.name,
69+
detail: databaseName ? `(${databaseName})` : null,
70+
description: i18n('sqlEditor.text.tableName'),
71+
},
72+
kind: monaco.languages.CompletionItemKind.Folder,
73+
insertText: handleInsertText(word, tableName.name, databaseCode),
74+
// range: monaco.Range.fromPositions(position),
75+
// documentation: tableName.comment,
76+
sortText: isTableContext ? '01' : '08',
77+
command: {
78+
id: 'addFieldList',
79+
title: 'addFieldList',
80+
arguments: [
81+
{
82+
tableName: tableName.name,
83+
dataSourceId,
84+
databaseName,
85+
schemaName,
86+
},
87+
],
88+
},
89+
})),
9290
};
9391
},
9492
});

0 commit comments

Comments
 (0)