|
...
|
...
|
@@ -14,6 +14,8 @@ var ( |
|
|
|
ErrQuerySetNameExists = fmt.Errorf("已存在")
|
|
|
|
ErrQuerySetParentNotExists = fmt.Errorf("父级不存在")
|
|
|
|
ErrQuerySetInvalidType = fmt.Errorf("查询集合的类型有误")
|
|
|
|
ErrQuerySetDeleteStatusOn = fmt.Errorf("无法删除已启用的内容")
|
|
|
|
ErrFieldsNotMatch = func(table string) error { return fmt.Errorf("[%v]字段数量不一致或类型不匹配", table) }
|
|
|
|
)
|
|
|
|
|
|
|
|
type QuerySetService struct {
|
|
...
|
...
|
@@ -99,6 +101,10 @@ func (ptr *QuerySetService) Update(ctx *domain.Context, querySetId int, queryCom |
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
if err = ptr.validQueryComponents(queryComponents); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
// 调用底层的组装sql
|
|
|
|
formulasGenerateResponse, err := ByteCore.FormulasGenerate(domain.ReqFormulasGenerate{
|
|
|
|
QuerySet: qs,
|
|
...
|
...
|
@@ -130,6 +136,24 @@ func (ptr *QuerySetService) Update(ctx *domain.Context, querySetId int, queryCom |
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (ptr *QuerySetService) validQueryComponents(queryComponents []*domain.QueryComponent) error {
|
|
|
|
if len(queryComponents) == 0 {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
m := queryComponents[0]
|
|
|
|
for i := 1; i < len(queryComponents); i++ {
|
|
|
|
item := queryComponents[i]
|
|
|
|
if len(item.MasterTable.Name) == 0 {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
if len(item.MasterTable.Fields) != len(m.MasterTable.Fields) {
|
|
|
|
return ErrFieldsNotMatch(item.MasterTable.Name)
|
|
|
|
}
|
|
|
|
// 类型匹配
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (ptr *QuerySetService) UpdateQuerySetLog(ctx *domain.Context, querySet *domain.QuerySet, queryComponents []*domain.QueryComponent) error {
|
|
|
|
var res = make([]FastSourceLog, 0)
|
|
|
|
if logs := conditionsEditLog(ctx, querySet, queryComponents); len(logs) > 0 {
|
|
...
|
...
|
@@ -395,6 +419,17 @@ func (ptr *QuerySetService) Rename(ctx *domain.Context, querySetId int, name str |
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
if qs.QuerySetInfo.BindTableId > 0 {
|
|
|
|
tableRepository, _ := repository.NewTableRepository(ptr.transactionContext)
|
|
|
|
table, err := tableRepository.FindOne(map[string]interface{}{"context": ctx, "tableId": qs.QuerySetInfo.BindTableId})
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
table.Name = name
|
|
|
|
if _, err := tableRepository.Save(table); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// 日志
|
|
|
|
if err = FastLog(ptr.transactionContext, domain.QuerySetLog, qs.QuerySetId, &RenameQuerySetLog{
|
|
|
|
LogEntry: domain.NewLogEntry(qs.Name, qs.Type, domain.UnKnown, ctx),
|
|
...
|
...
|
@@ -442,17 +477,17 @@ func (ptr *QuerySetService) ChangeStatus(ctx *domain.Context, querySetId int, st |
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (ptr *QuerySetService) Copy(ctx *domain.Context, querySetId int, t string, groupId int, name string) error {
|
|
|
|
func (ptr *QuerySetService) Copy(ctx *domain.Context, querySetId int, t string, groupId int, name string) (*domain.QuerySet, error) {
|
|
|
|
querySetRepository, _ := repository.NewQuerySetRepository(ptr.transactionContext)
|
|
|
|
qs, err := querySetRepository.FindOne(map[string]interface{}{"querySetId": querySetId})
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
copy := copyQuerySet(qs, t, groupId, name)
|
|
|
|
copy.Sort, err = dao.QuerySetCurrentSort(ptr.transactionContext, copy.Type, copy.ParentId)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
// check duplicate name
|
|
|
|
options := map[string]interface{}{
|
|
...
|
...
|
@@ -462,45 +497,45 @@ func (ptr *QuerySetService) Copy(ctx *domain.Context, querySetId int, t string, |
|
|
|
"parentId": groupId,
|
|
|
|
}
|
|
|
|
if found, foundErr := querySetRepository.FindOne(options); foundErr == nil && found != nil && found.Name == name {
|
|
|
|
return ErrQuerySetNameExists
|
|
|
|
return nil, ErrQuerySetNameExists
|
|
|
|
}
|
|
|
|
if copy.QuerySetInfo.BindTableId != 0 {
|
|
|
|
tableRepository, _ := repository.NewTableRepository(ptr.transactionContext)
|
|
|
|
table, err := tableRepository.FindOne(map[string]interface{}{"tableId": copy.QuerySetInfo.BindTableId})
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
copyTable := NewTable(domain.TableType(t), name, table.Fields(false), 0).WithContext(ctx).WithPrefix(qs.Type)
|
|
|
|
|
|
|
|
copyTable, err = tableRepository.Save(copyTable)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
// 调用底层的组装sql
|
|
|
|
formulasGenerateResponse, err := ByteCore.FormulasGenerate(domain.ReqFormulasGenerate{
|
|
|
|
QuerySet: qs,
|
|
|
|
Table: table,
|
|
|
|
Table: copyTable,
|
|
|
|
QueryComponents: qs.QueryComponents,
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
if len(formulasGenerateResponse.FormulaName) > 0 && formulasGenerateResponse.FormulaName != table.SQLName {
|
|
|
|
copyTable.SQLName = formulasGenerateResponse.FormulaName
|
|
|
|
tableRepository, _ := repository.NewTableRepository(ptr.transactionContext)
|
|
|
|
copyTable, err = tableRepository.Save(copyTable)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
copy.QuerySetInfo.BindTableId = copyTable.TableId
|
|
|
|
}
|
|
|
|
_, err = querySetRepository.Save(copy)
|
|
|
|
copy, err = querySetRepository.Save(copy)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
return copy, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func copyQuerySet(qs *domain.QuerySet, t string, groupId int, name string) *domain.QuerySet {
|
|
...
|
...
|
@@ -528,10 +563,14 @@ func (ptr *QuerySetService) Delete(ctx *domain.Context, querySetId int) error { |
|
|
|
}
|
|
|
|
querySetRepository, _ := repository.NewQuerySetRepository(ptr.transactionContext)
|
|
|
|
tableDependencyService, _ := NewTableDependencyService(ptr.transactionContext)
|
|
|
|
// 1.判断依赖,删除表
|
|
|
|
for i := range querySets {
|
|
|
|
if _, err := querySetRepository.Remove(querySets[i]); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
if querySets[i].Flag != domain.FlagGroup && querySets[i].Type == domain.SchemaTable.ToString() && querySets[i].Status == domain.StatusOn {
|
|
|
|
return ErrQuerySetDeleteStatusOn
|
|
|
|
}
|
|
|
|
if querySets[i].QuerySetInfo.BindTableId > 0 {
|
|
|
|
if err := tableDependencyService.HasDependencyError(ctx, querySets[i].QuerySetInfo.BindTableId); err != nil {
|
|
|
|
return err
|
|
...
|
...
|
@@ -539,6 +578,11 @@ func (ptr *QuerySetService) Delete(ctx *domain.Context, querySetId int) error { |
|
|
|
if err := dao.TableSoftDelete(ptr.transactionContext, querySets[i].QuerySetInfo.BindTableId, domain.TableType(querySets[i].Type)); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// 2.底层清理
|
|
|
|
for i := range querySets {
|
|
|
|
if querySets[i].QuerySetInfo.BindTableId > 0 {
|
|
|
|
ByteCore.FormulasClear(domain.ReqFormulasClear{
|
|
|
|
QuerySetId: querySets[i].QuerySetId,
|
|
|
|
})
|
|
...
|
...
|
@@ -653,6 +697,14 @@ func (ptr *QuerySetService) DependencyGraph(ctx *domain.Context, querySetId int) |
|
|
|
|
|
|
|
tableDependencyService, _ := NewTableDependencyService(ptr.transactionContext)
|
|
|
|
dependencies = tableDependencyService.TableDependTree(tables, querySet.QuerySetInfo.BindTableId)
|
|
|
|
|
|
|
|
_, querySets, err := querySetRepository.Find(map[string]interface{}{"context": ctx, "bindTableIds": dependencies.TableIds()})
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
if len(querySets) > 0 {
|
|
|
|
dependencies.BindQuerySet(querySets)
|
|
|
|
}
|
|
|
|
return dependencies, nil
|
|
|
|
}
|
|
|
|
|
...
|
...
|
|