Skip to content

Commit 049eb69

Browse files
authored
Merge pull request #768 from actiontech/feature/issue-2572-2
[feature](SqlOptimization): Add confirmation step and adjust permission
2 parents 1616cdc + 2b7cee6 commit 049eb69

File tree

26 files changed

+634
-104
lines changed

26 files changed

+634
-104
lines changed

packages/shared/lib/features/usePermission/__tests__/__snapshots__/index.test.ts.snap

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,9 @@ exports[`usePermission should match snapshot 1`] = `
218218
"DELETE": "action:delete_sql_management_exception",
219219
"EDIT": "action:edit_sql_management_exception",
220220
},
221+
"SQL_OPTIMIZATION": {
222+
"CREATE": "action:create_sql_optimization",
223+
},
221224
"VERSION_MANAGEMENT": {
222225
"ADD": "action:version_management_add_operator",
223226
"DELETE": "action:version_management_delete_operator",
@@ -631,6 +634,19 @@ exports[`usePermission should match snapshot 2`] = `
631634
],
632635
"type": "action",
633636
},
637+
"action:create_sql_optimization": {
638+
"dbServicePermission": {
639+
"opType": "create_optimization",
640+
},
641+
"id": "action:create_sql_optimization",
642+
"projectArchived": false,
643+
"projectManager": true,
644+
"role": [
645+
"admin",
646+
"systemAdministrator",
647+
],
648+
"type": "action",
649+
},
634650
"action:create_workflow": {
635651
"dbServicePermission": {
636652
"opType": "create_workflow",

packages/shared/lib/features/usePermission/permissionManifest.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1288,6 +1288,17 @@ export const PERMISSION_MANIFEST: Record<
12881288
opType: OpPermissionItemOpPermissionTypeEnum.create_workflow
12891289
}
12901290
},
1291+
// 快捷审核
1292+
[PERMISSIONS.ACTIONS.SQLE.SQL_OPTIMIZATION.CREATE]: {
1293+
id: PERMISSIONS.ACTIONS.SQLE.SQL_OPTIMIZATION.CREATE,
1294+
type: 'action',
1295+
projectArchived: false,
1296+
projectManager: true,
1297+
role: [SystemRole.admin, SystemRole.systemAdministrator],
1298+
dbServicePermission: {
1299+
opType: OpPermissionItemOpPermissionTypeEnum.create_optimization
1300+
}
1301+
},
12911302

12921303
// 流水线配置
12931304
[PERMISSIONS.ACTIONS.SQLE.PIPELINE_CONFIGURATION.CREATE]: {

packages/shared/lib/features/usePermission/permissions.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,9 @@ export const PERMISSIONS = {
255255
SQL_AUDIT: {
256256
CREATE: 'action:create_sql_audit'
257257
},
258+
SQL_OPTIMIZATION: {
259+
CREATE: 'action:create_sql_optimization'
260+
},
258261
PIPELINE_CONFIGURATION: {
259262
CREATE: 'action:create_pipeline_configuration',
260263
EDIT: 'action:edit_pipeline_configuration',

packages/sqle/src/locale/zh-CN/sqlAnalyze.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,14 @@ export default {
55

66
sqlExplain: 'SQL解析',
77
tableTitle: '{{tableName}}表',
8+
optimize: 'SQL优化',
9+
optimization: {
10+
confirmTitle: '是否启用高精度索引推荐?',
11+
confirmContent:
12+
'高精度索引推荐将统计SQL中列的区分度,提供更准确的索引优化建议,但可能会产生较大的数据库性能开销。',
13+
enableHighAnalysis: '是,启用高精度推荐',
14+
useRegularAnalysis: '否,使用常规推荐'
15+
},
816
optimizationResultDrawer: {
917
title: 'SQL调优结果详情',
1018
trackProgressTips: '也可进入 快捷诊断-SQL调优 页面追踪进度',

packages/sqle/src/locale/zh-CN/sqlOptimization.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,9 @@ export default {
4545
format: 'SQL美化',
4646
formatTips:
4747
'目前,支持 SQL 美化的数据库类型有 {{supportType}}。如果未选择数据源或选择的数据源类型尚未得到支持,进行 SQL 美化可能会导致 SQL 语句语法错误。',
48-
enableHighAnalysis:
49-
' 启用高精度索引推荐(将统计SQL中列的区分度,可能会产生较大的数据库性能开销 )',
48+
enableHighAnalysis: '启用高精度索引推荐',
49+
enableHighAnalysisTips:
50+
'将统计SQL中列的区分度,可能会产生较大的数据库性能开销',
5051
form: {
5152
optimizationType: '调优类型',
5253
optimizationTypeDesc:

packages/sqle/src/page/SqlAnalyze/Drawer/SqlOptimizationResultDrawer.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,10 @@ const SqlOptimizationResultDrawer = () => {
5353
open &&
5454
optimizationId &&
5555
(!optimizationResult?.status ||
56-
optimizationResult?.status ===
57-
OptimizationSQLDetailStatusEnum.optimizing)
56+
![
57+
OptimizationSQLDetailStatusEnum.finish,
58+
OptimizationSQLDetailStatusEnum.failed
59+
].includes(optimizationResult.status))
5860
) {
5961
getOptimizationResult(optimizationId);
6062
}

packages/sqle/src/page/SqlAnalyze/Drawer/__tests__/SqlOptimizationResultDrawer.test.tsx

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,4 +144,36 @@ describe('SqlOptimizationResultDrawer', () => {
144144

145145
expect(getOptimizationResultSpy).not.toHaveBeenCalled();
146146
});
147+
148+
it('should not call getOptimizationResult when optimization is failed', () => {
149+
const getOptimizationResultSpy = jest.fn();
150+
mockUseOptimizationResult.mockReturnValue({
151+
...defaultOptimizationResult,
152+
getOptimizationResult: getOptimizationResultSpy,
153+
optimizationResult: {
154+
status: OptimizationSQLDetailStatusEnum.failed
155+
}
156+
});
157+
158+
superRender(<SqlOptimizationResultDrawer />);
159+
160+
expect(getOptimizationResultSpy).not.toHaveBeenCalled();
161+
});
162+
163+
it('should call getOptimizationResult when optimization is optimizing', () => {
164+
const getOptimizationResultSpy = jest.fn();
165+
mockUseOptimizationResult.mockReturnValue({
166+
...defaultOptimizationResult,
167+
getOptimizationResult: getOptimizationResultSpy,
168+
optimizationResult: {
169+
status: OptimizationSQLDetailStatusEnum.optimizing
170+
}
171+
});
172+
173+
superRender(<SqlOptimizationResultDrawer />);
174+
175+
expect(getOptimizationResultSpy).toHaveBeenCalledWith(
176+
'test-optimization-id'
177+
);
178+
});
147179
});

packages/sqle/src/page/SqlAnalyze/ManagementConf/index.test.tsx

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import {
2626
} from '@actiontech/shared/lib/testUtil';
2727
import { useSelector } from 'react-redux';
2828
import { ModalName } from '../../../data/ModalName';
29-
import sqlOptimization from '@actiontech/shared/lib/testUtil/mockApi/sqle/sqlOptimization';
3029

3130
jest.mock('react-router', () => {
3231
return {
@@ -70,7 +69,8 @@ describe('SqlAnalyze/ManagementConfAnalyze', () => {
7069
getInstanceTipListSpy = sqleMockApi.instance.getInstanceTipList();
7170
mockUsePermission(
7271
{
73-
checkPagePermission: jest.fn().mockReturnValue(true)
72+
checkPagePermission: jest.fn().mockReturnValue(true),
73+
checkActionPermission: jest.fn().mockReturnValue(true)
7474
},
7575
{ useSpyOnMockHooks: true }
7676
);
@@ -211,7 +211,7 @@ describe('SqlAnalyze/ManagementConfAnalyze', () => {
211211
expect(container).toMatchSnapshot();
212212
});
213213

214-
it('should create sql optimization task', async () => {
214+
it('should create sql optimization task with enable_high_analysis', async () => {
215215
const spy = mockGetAnalyzeData(true);
216216
superRender(<ManagementConfAnalyze />, undefined, {
217217
routerProps: {
@@ -227,9 +227,48 @@ describe('SqlAnalyze/ManagementConfAnalyze', () => {
227227
});
228228
await act(async () => jest.advanceTimersByTime(3000));
229229
expect(getInstanceTipListSpy).toHaveBeenCalledTimes(1);
230+
230231
fireEvent.click(screen.getByText('SQL优化'));
231232
await act(async () => jest.advanceTimersByTime(0));
233+
234+
expect(screen.getByText('是,启用高精度推荐')).toBeInTheDocument();
235+
expect(screen.getByText('否,使用常规推荐')).toBeInTheDocument();
236+
237+
fireEvent.click(screen.getByText('是,启用高精度推荐'));
238+
await act(async () => jest.advanceTimersByTime(0));
239+
232240
expect(sqlOptimizeSpy).toHaveBeenCalledTimes(1);
241+
expect(sqlOptimizeSpy).toHaveBeenCalledWith(
242+
expect.objectContaining({
243+
enable_high_analysis: true,
244+
instance_name: 'Mysql1',
245+
schema_name: 'sqle'
246+
})
247+
);
248+
});
249+
250+
it('should create sql optimization task without enable_high_analysis', async () => {
251+
mockGetAnalyzeData(true);
252+
superRender(<ManagementConfAnalyze />, undefined, {
253+
routerProps: {
254+
initialEntries: ['/analyze?instance_name=Mysql1&schema=sqle']
255+
}
256+
});
257+
await act(async () => jest.advanceTimersByTime(3000));
258+
259+
fireEvent.click(screen.getByText('SQL优化'));
260+
await act(async () => jest.advanceTimersByTime(0));
261+
262+
fireEvent.click(screen.getByText('否,使用常规推荐'));
263+
await act(async () => jest.advanceTimersByTime(0));
264+
265+
expect(sqlOptimizeSpy).toHaveBeenCalledWith(
266+
expect.objectContaining({
267+
enable_high_analysis: false,
268+
instance_name: 'Mysql1',
269+
schema_name: 'sqle'
270+
})
271+
);
233272
});
234273

235274
test('should render error result of type "error" when response code is not 8001', async () => {

packages/sqle/src/page/SqlAnalyze/ManagementConf/index.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,9 @@ const ManagementConfAnalyze = () => {
4242

4343
const {
4444
setOptimizationCreationParams,
45-
onCreateSqlOptimizationOrview,
45+
onCreateSqlOptimization,
46+
onViewOptimizationResult,
47+
optimizationRecordId,
4648
createSqlOptimizationLoading,
4749
allowSqlOptimization
4850
} = useSqlOptimization();
@@ -143,7 +145,9 @@ const ManagementConfAnalyze = () => {
143145
initTime={initTime}
144146
selectedPoint={selectedPoint}
145147
setSelectedPoint={setSelectedPoint}
146-
onCreateSqlOptimizationOrview={onCreateSqlOptimizationOrview}
148+
onCreateSqlOptimization={onCreateSqlOptimization}
149+
onViewOptimizationResult={onViewOptimizationResult}
150+
optimizationRecordId={optimizationRecordId}
147151
createSqlOptimizationLoading={createSqlOptimizationLoading}
148152
allowSqlOptimization={allowSqlOptimization}
149153
getPerformanceStatistics={getPerformanceStatistics}

packages/sqle/src/page/SqlAnalyze/SqlAnalyze/SqlAnalyze.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,9 @@ const SqlAnalyze: React.FC<SqlAnalyzeProps> = (props) => {
2929
initTime,
3030
selectedPoint,
3131
setSelectedPoint,
32-
onCreateSqlOptimizationOrview,
32+
onCreateSqlOptimization,
33+
onViewOptimizationResult,
34+
optimizationRecordId,
3335
createSqlOptimizationLoading,
3436
allowSqlOptimization,
3537
getPerformanceStatistics,
@@ -45,7 +47,9 @@ const SqlAnalyze: React.FC<SqlAnalyzeProps> = (props) => {
4547
initTime,
4648
selectedPoint,
4749
setSelectedPoint,
48-
onCreateSqlOptimizationOrview,
50+
onCreateSqlOptimization,
51+
onViewOptimizationResult,
52+
optimizationRecordId,
4953
createSqlOptimizationLoading,
5054
allowSqlOptimization,
5155
getPerformanceStatistics,

0 commit comments

Comments
 (0)