Skip to content

Commit 2d348de

Browse files
authored
Merge pull request #3176 from actiontech/sql_optimization_sqle
Sql optimization sqle
2 parents bbf12af + be8fbcd commit 2d348de

33 files changed

+2866
-248
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ go 1.19
55
require (
66
github.com/DATA-DOG/go-sqlmock v1.5.0
77
github.com/Masterminds/semver/v3 v3.1.1
8-
github.com/actiontech/dms v0.0.0-20240425090459-b8b791fa96af
8+
github.com/actiontech/dms v0.0.0-20251124062012-1fffc50886d9
99
github.com/actiontech/java-sql-extractor v0.0.0-20231103015812-cdd5fc040f62
1010
github.com/actiontech/mybatis-mapper-2-sql v0.5.1-0.20240119100929-4c4ddc90b1c2
1111
github.com/agiledragon/gomonkey v2.0.2+incompatible

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,8 @@ github.com/VividCortex/ewma v1.1.1 h1:MnEK4VOv6n0RSY4vtRe3h11qjxL3+t0B8yOL8iMXdc
4848
github.com/VividCortex/ewma v1.1.1/go.mod h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA=
4949
github.com/acomagu/bufpipe v1.0.4 h1:e3H4WUzM3npvo5uv95QuJM3cQspFNtFBzvJ2oNjKIDQ=
5050
github.com/acomagu/bufpipe v1.0.4/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4=
51-
github.com/actiontech/dms v0.0.0-20240425090459-b8b791fa96af h1:g0a5B/hp6og8QcMWg5Ga6Hv6I6+yJ/TY2Dyz7EPxcxM=
52-
github.com/actiontech/dms v0.0.0-20240425090459-b8b791fa96af/go.mod h1:xhu4id1GnOt5Gip+xa+EGX9/0aKXxWIAn35VHE76kQQ=
51+
github.com/actiontech/dms v0.0.0-20251124062012-1fffc50886d9 h1:8ysaZOvG3B1JMI13dkc6VZ2DRtvxk9IdfqAklQ9xVD8=
52+
github.com/actiontech/dms v0.0.0-20251124062012-1fffc50886d9/go.mod h1:xhu4id1GnOt5Gip+xa+EGX9/0aKXxWIAn35VHE76kQQ=
5353
github.com/actiontech/java-sql-extractor v0.0.0-20231103015812-cdd5fc040f62 h1:JM7WnLzlvXOGE90KKd+aigi+qUDS+U5dLwQMNpTKZxE=
5454
github.com/actiontech/java-sql-extractor v0.0.0-20231103015812-cdd5fc040f62/go.mod h1:adDZHhAf2LRMx2h0JzofPXn12x2XlyQjVE116KXquwo=
5555
github.com/actiontech/mybatis-mapper-2-sql v0.5.1-0.20240119100929-4c4ddc90b1c2 h1:Txeii4CZzDNbvvtGoJSFNcBTHyLD0uR6Sd16waQZSxY=

sqle/api/app.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,9 @@ func StartApi(net *gracenet.Net, exitChan chan struct{}, config *config.SqleOpti
160160
// 内部调用
161161
v1Router.POST("/data_resource/handle", v1.OperateDataResourceHandle, sqleMiddleware.AdminUserAllowed())
162162
v1Router.POST(fmt.Sprintf("%s/connection", dmsV1.InternalDBServiceRouterGroup), v1.CheckInstanceIsConnectable, sqleMiddleware.AdminUserAllowed())
163+
164+
// 系统功能开关
165+
v1Router.GET("/system/module_status", v1.GetSystemModuleStatus)
163166
}
164167

165168
// project admin router
@@ -315,6 +318,11 @@ func StartApi(net *gracenet.Net, exitChan chan struct{}, config *config.SqleOpti
315318
v2ProjectRouter.POST("/:project_name/audit_plans/:audit_plan_name/sqls/full", v2.FullSyncAuditPlanSQLs, sqleMiddleware.ScannerVerifier())
316319
v2ProjectRouter.POST("/:project_name/audit_plans/:audit_plan_name/sqls/partial", v2.PartialSyncAuditPlanSQLs, sqleMiddleware.ScannerVerifier())
317320

321+
// sql optimization
322+
v2ProjectRouter.POST("/:project_name/sql_optimization_records", v2.SQLOptimize)
323+
v2ProjectRouter.GET("/:project_name/sql_optimization_records", v2.GetOptimizationRecords)
324+
v2ProjectRouter.GET("/:project_name/sql_optimization_records/:optimization_record_id/detail", v2.GetOptimizationSQLDetail)
325+
318326
}
319327

320328
{

sqle/api/controller/v1/instance.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -326,8 +326,9 @@ func GetInstanceSchemas(c echo.Context) error {
326326
}
327327

328328
const ( // InstanceTipReqV1.FunctionalModule Enums
329-
create_audit_plan = "create_audit_plan"
330-
create_workflow = "create_workflow"
329+
FunctionalModuleCreateAuditPlan = "create_audit_plan"
330+
FunctionalModuleCreateWorkflow = "create_workflow"
331+
FunctionalModuleCreateOptimization = "create_optimization"
331332
)
332333

333334
type InstanceTipReqV1 struct {
@@ -379,10 +380,12 @@ func GetInstanceTips(c echo.Context) error {
379380

380381
var operationType v1.OpPermissionType
381382
switch req.FunctionalModule {
382-
case create_audit_plan:
383+
case FunctionalModuleCreateAuditPlan:
383384
operationType = v1.OpPermissionTypeSaveAuditPlan
384-
case create_workflow:
385+
case FunctionalModuleCreateWorkflow:
385386
operationType = v1.OpPermissionTypeCreateWorkflow
387+
case FunctionalModuleCreateOptimization:
388+
operationType = v1.OpPermissionTypeCreateOptimization
386389
default:
387390
}
388391

sqle/api/controller/v1/sql_audit_record.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -93,18 +93,18 @@ func CreateSQLAuditRecord(c echo.Context) error {
9393
}
9494

9595
s := model.GetStorage()
96-
sqls := getSQLFromFileResp{}
96+
sqls := GetSQLFromFileResp{}
9797
user, err := controller.GetCurrentUser(c, dms.GetUser)
9898
if err != nil {
9999
return controller.JSONBaseErrorReq(c, err)
100100
}
101101
if req.Sqls != "" {
102-
sqls = getSQLFromFileResp{
102+
sqls = GetSQLFromFileResp{
103103
SourceType: model.TaskSQLSourceFromFormData,
104104
SQLsFromFormData: req.Sqls,
105105
}
106106
} else {
107-
sqls, err = getSQLFromFile(c)
107+
sqls, err = GetSQLFromFile(c)
108108
if err != nil {
109109
return controller.JSONBaseErrorReq(c, err)
110110
}
@@ -166,7 +166,7 @@ func CreateSQLAuditRecord(c echo.Context) error {
166166
})
167167
}
168168

169-
type getSQLFromFileResp struct {
169+
type GetSQLFromFileResp struct {
170170
SourceType string
171171
SQLsFromFormData string
172172
SQLsFromSQLFiles []SQLsFromSQLFile
@@ -184,7 +184,7 @@ type SQLFromXML struct {
184184
SQL string
185185
}
186186

187-
func (s getSQLFromFileResp) MergeSQLs() (sqls string) {
187+
func (s GetSQLFromFileResp) MergeSQLs() (sqls string) {
188188
for _, v := range s.SQLsFromSQLFiles {
189189
sqls += v.SQLs
190190
}
@@ -194,7 +194,7 @@ func (s getSQLFromFileResp) MergeSQLs() (sqls string) {
194194
return sqls
195195
}
196196

197-
func addSQLsFromFileToTasks(sqls getSQLFromFileResp, task *model.Task, plugin driver.Plugin) error {
197+
func addSQLsFromFileToTasks(sqls GetSQLFromFileResp, task *model.Task, plugin driver.Plugin) error {
198198
var num uint = 1
199199

200200
fileTask := func(sqlsText, filePath string, defaultStartLine uint64) error {
@@ -245,7 +245,7 @@ func addSQLsFromFileToTasks(sqls getSQLFromFileResp, task *model.Task, plugin dr
245245
return nil
246246
}
247247

248-
func buildOnlineTaskForAudit(c echo.Context, s *model.Storage, userId uint64, instanceName, instanceSchema, projectUid string, sqls getSQLFromFileResp) (*model.Task, error) {
248+
func buildOnlineTaskForAudit(c echo.Context, s *model.Storage, userId uint64, instanceName, instanceSchema, projectUid string, sqls GetSQLFromFileResp) (*model.Task, error) {
249249
instance, exist, err := dms.GetInstanceInProjectByName(c.Request().Context(), projectUid, instanceName)
250250
if err != nil {
251251
return nil, err
@@ -290,7 +290,7 @@ func buildOnlineTaskForAudit(c echo.Context, s *model.Storage, userId uint64, in
290290
return task, nil
291291
}
292292

293-
func buildOfflineTaskForAudit(userId uint64, dbType string, sqls getSQLFromFileResp) (*model.Task, error) {
293+
func buildOfflineTaskForAudit(userId uint64, dbType string, sqls GetSQLFromFileResp) (*model.Task, error) {
294294
task := &model.Task{
295295
CreateUserId: userId,
296296
ExecuteSQLs: []*model.ExecuteSQL{},

sqle/api/controller/v1/system_module.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ type ModuleStatusRes struct {
2424
}
2525

2626
// @Summary 查询系统功能支持情况信息
27-
// @Description get module status for modulealities in the system
27+
// @Description get module status for module in the system
2828
// @Id getSystemModuleStatus
2929
// @Tags system
3030
// @Security ApiKeyAuth
@@ -50,3 +50,15 @@ func GetSystemModuleStatus(c echo.Context) error {
5050
},
5151
})
5252
}
53+
54+
type GetSystemModuleRedDotsRes struct {
55+
controller.BaseRes
56+
Data ModuleRedDots `json:"data"`
57+
}
58+
59+
type ModuleRedDots []ModuleRedDot
60+
61+
type ModuleRedDot struct {
62+
ModuleName string `json:"module_name" enums:"global_dashboard"`
63+
HasRedDot bool `json:"has_red_dot"`
64+
}

sqle/api/controller/v1/task.go

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -96,14 +96,14 @@ const (
9696
GitPassword = "git_user_password"
9797
)
9898

99-
func getSQLFromFile(c echo.Context) (getSQLFromFileResp, error) {
99+
func GetSQLFromFile(c echo.Context) (GetSQLFromFileResp, error) {
100100
// Read it from sql file.
101101
fileName, sqlsFromSQLFile, exist, err := controller.ReadFile(c, InputSQLFileName)
102102
if err != nil {
103-
return getSQLFromFileResp{}, err
103+
return GetSQLFromFileResp{}, err
104104
}
105105
if exist {
106-
return getSQLFromFileResp{
106+
return GetSQLFromFileResp{
107107
SourceType: model.TaskSQLSourceFromSQLFile,
108108
SQLsFromSQLFiles: []SQLsFromSQLFile{{
109109
FilePath: fileName,
@@ -114,12 +114,12 @@ func getSQLFromFile(c echo.Context) (getSQLFromFileResp, error) {
114114
// If sql_file is not exist, read it from mybatis xml file.
115115
fileName, data, exist, err := controller.ReadFile(c, InputMyBatisXMLFileName)
116116
if err != nil {
117-
return getSQLFromFileResp{}, err
117+
return GetSQLFromFileResp{}, err
118118
}
119119
if exist {
120120
sqls, err := mybatis_parser.ParseXMLs([]mybatis_parser.XmlFile{{Content: data}}, true)
121121
if err != nil {
122-
return getSQLFromFileResp{}, errors.New(errors.ParseMyBatisXMLFileError, err)
122+
return GetSQLFromFileResp{}, errors.New(errors.ParseMyBatisXMLFileError, err)
123123
}
124124
sqlsFromXMLs := make([]SQLFromXML, len(sqls))
125125
for i := range sqls {
@@ -129,7 +129,7 @@ func getSQLFromFile(c echo.Context) (getSQLFromFileResp, error) {
129129
SQL: sqls[i].SQL,
130130
}
131131
}
132-
return getSQLFromFileResp{
132+
return GetSQLFromFileResp{
133133
SourceType: model.TaskSQLSourceFromMyBatisXMLFile,
134134
SQLsFromXMLs: sqlsFromXMLs,
135135
}, nil
@@ -138,10 +138,10 @@ func getSQLFromFile(c echo.Context) (getSQLFromFileResp, error) {
138138
// If mybatis xml file is not exist, read it from zip file.
139139
sqlsFromSQLFiles, sqlsFromXML, exist, err := getSqlsFromZip(c)
140140
if err != nil {
141-
return getSQLFromFileResp{}, err
141+
return GetSQLFromFileResp{}, err
142142
}
143143
if exist {
144-
return getSQLFromFileResp{
144+
return GetSQLFromFileResp{
145145
SourceType: model.TaskSQLSourceFromZipFile,
146146
SQLsFromSQLFiles: sqlsFromSQLFiles,
147147
SQLsFromXMLs: sqlsFromXML,
@@ -151,16 +151,16 @@ func getSQLFromFile(c echo.Context) (getSQLFromFileResp, error) {
151151
// If zip file is not exist, read it from git repository
152152
sqlsFromSQLFiles, sqlsFromJavaFiles, sqlsFromXMLs, exist, err := getSqlsFromGit(c)
153153
if err != nil {
154-
return getSQLFromFileResp{}, err
154+
return GetSQLFromFileResp{}, err
155155
}
156156
if exist {
157-
return getSQLFromFileResp{
157+
return GetSQLFromFileResp{
158158
SourceType: model.TaskSQLSourceFromGitRepository,
159159
SQLsFromSQLFiles: append(sqlsFromSQLFiles, sqlsFromJavaFiles...),
160160
SQLsFromXMLs: sqlsFromXMLs,
161161
}, nil
162162
}
163-
return getSQLFromFileResp{}, errors.New(errors.DataInvalid, fmt.Errorf("input sql is empty"))
163+
return GetSQLFromFileResp{}, errors.New(errors.DataInvalid, fmt.Errorf("input sql is empty"))
164164
}
165165

166166
func saveFileFromContext(c echo.Context) (*model.AuditFile, error) {
@@ -241,16 +241,16 @@ func CreateAndAuditTask(c echo.Context) error {
241241
if err := controller.BindAndValidateReq(c, req); err != nil {
242242
return err
243243
}
244-
var sqls getSQLFromFileResp
244+
var sqls GetSQLFromFileResp
245245
var err error
246246

247247
if req.Sql != "" {
248-
sqls = getSQLFromFileResp{
248+
sqls = GetSQLFromFileResp{
249249
SourceType: model.TaskSQLSourceFromFormData,
250250
SQLsFromFormData: req.Sql,
251251
}
252252
} else {
253-
sqls, err = getSQLFromFile(c)
253+
sqls, err = GetSQLFromFile(c)
254254
if err != nil {
255255
return controller.JSONBaseErrorReq(c, err)
256256
}
@@ -843,15 +843,15 @@ func AuditTaskGroupV1(c echo.Context) error {
843843
}
844844

845845
var err error
846-
var sqls getSQLFromFileResp
846+
var sqls GetSQLFromFileResp
847847
var fileRecord *model.AuditFile
848848
if req.Sql != "" {
849-
sqls = getSQLFromFileResp{
849+
sqls = GetSQLFromFileResp{
850850
SourceType: model.TaskSQLSourceFromFormData,
851851
SQLsFromFormData: req.Sql,
852852
}
853853
} else {
854-
sqls, err = getSQLFromFile(c)
854+
sqls, err = GetSQLFromFile(c)
855855
if err != nil {
856856
return controller.JSONBaseErrorReq(c, err)
857857
}

0 commit comments

Comments
 (0)