|
...
|
...
|
@@ -136,6 +136,60 @@ func (ptr *QuerySetService) Update(ctx *domain.Context, querySetId int, queryCom |
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (ptr *QuerySetService) PreviewPrepare(ctx *domain.Context, querySetId int, queryComponents []*domain.QueryComponent) (*domain.Table, error) {
|
|
|
|
querySetRepository, _ := repository.NewQuerySetRepository(ptr.transactionContext)
|
|
|
|
querySet, err := querySetRepository.FindOne(map[string]interface{}{"querySetId": querySetId})
|
|
|
|
tableRepository, _ := repository.NewTableRepository(ptr.transactionContext)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
if queryComponentsHasEdit(ctx, querySet, queryComponents) && querySet.QuerySetInfo.BindTableId > 0 {
|
|
|
|
if t, _ := tableRepository.FindOne(map[string]interface{}{"context": ctx, "tableId": querySet.QuerySetInfo.BindTableId}); t != nil {
|
|
|
|
return t, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// 验证
|
|
|
|
if err = ptr.validQueryComponents(queryComponents); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
var (
|
|
|
|
foundMasterTable *domain.Table
|
|
|
|
)
|
|
|
|
// 生成Table
|
|
|
|
masterTable := queryComponents[0].MasterTable
|
|
|
|
dependencyTables := querySet.GetDependencyTables(queryComponents)
|
|
|
|
foundMasterTable, err = tableRepository.FindOne(map[string]interface{}{"context": ctx, "tableId": masterTable.TableId})
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
masterTable = domain.NewQueryComponentTable(foundMasterTable)
|
|
|
|
var table *domain.Table = NewCopyTable(domain.TableType(domain.TemporaryTable), querySet.Name, domain.RangeFields(masterTable.Fields, domain.ChangeFieldFlag), 0).
|
|
|
|
WithContext(ctx).
|
|
|
|
WithPrefix(strings.ToLower(string(domain.TemporaryTable)))
|
|
|
|
// 循环依赖判断
|
|
|
|
if err = ptr.validDependentCircle(ctx, querySet, queryComponents); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
table.TableInfo.ApplyOnModule = domain.ModuleAll
|
|
|
|
table.TableInfo.DependencyTables = dependencyTables
|
|
|
|
table, err = tableRepository.Save(table)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
// 调用底层的组装sql
|
|
|
|
if _, err = ByteCore.FormulasGenerate(domain.ReqFormulasGenerate{
|
|
|
|
QuerySet: querySet,
|
|
|
|
Table: table,
|
|
|
|
QueryComponents: queryComponents,
|
|
|
|
}); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return table, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (ptr *QuerySetService) validQueryComponents(queryComponents []*domain.QueryComponent) error {
|
|
|
|
if len(queryComponents) == 0 {
|
|
|
|
return nil
|
|
...
|
...
|
@@ -154,6 +208,42 @@ func (ptr *QuerySetService) validQueryComponents(queryComponents []*domain.Query |
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (ptr *QuerySetService) validDependentCircle(ctx *domain.Context, querySet *domain.QuerySet, queryComponents []*domain.QueryComponent) error {
|
|
|
|
tableRepository, _ := repository.NewTableRepository(ptr.transactionContext)
|
|
|
|
var validTables = make([]*domain.Table, 0)
|
|
|
|
dependencyTables := querySet.GetDependencyTables(queryComponents)
|
|
|
|
if len(dependencyTables) > 0 {
|
|
|
|
_, tables, err := tableRepository.Find(map[string]interface{}{"context": ctx, "tableIds": dependencyTables})
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
tableMap := make(map[int]*domain.Table)
|
|
|
|
for i := range tables {
|
|
|
|
tableMap[tables[i].TableId] = tables[i]
|
|
|
|
}
|
|
|
|
for _, c := range queryComponents {
|
|
|
|
if t, ok := tableMap[c.MasterTable.TableId]; ok {
|
|
|
|
c.MasterTable = domain.NewQueryComponentTable(t)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
for _, t := range validTables {
|
|
|
|
if t.TableType == domain.SchemaTable.ToString() || t.TableType == domain.SubProcessTable.ToString() {
|
|
|
|
validTables = append(validTables, t)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// 循环依赖判断
|
|
|
|
tableDependencyService, _ := NewTableDependencyService(ptr.transactionContext)
|
|
|
|
if len(validTables) > 0 {
|
|
|
|
tree := tableDependencyService.TableDependTree(validTables, querySet.QuerySetInfo.BindTableId)
|
|
|
|
if tableDependencyService.Detect(ctx, tree.EdgesArray()) {
|
|
|
|
return NewCircleDependError(tableDependencyService.CircleTable(), querySet)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
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 {
|
|
...
|
...
|
@@ -254,10 +344,14 @@ func conditionsEditLog(ctx *domain.Context, querySet *domain.QuerySet, queryComp |
|
|
|
return res
|
|
|
|
}
|
|
|
|
|
|
|
|
func queryComponentsHasEdit(ctx *domain.Context, querySet *domain.QuerySet, queryComponents []*domain.QueryComponent) bool {
|
|
|
|
logs := selectsEditLog(ctx, querySet, queryComponents)
|
|
|
|
return len(logs) == 0
|
|
|
|
}
|
|
|
|
|
|
|
|
func selectsEditLog(ctx *domain.Context, querySet *domain.QuerySet, queryComponents []*domain.QueryComponent) []FastSourceLog {
|
|
|
|
var res = make([]FastSourceLog, 0)
|
|
|
|
oldQCs := domain.QueryComponentsToMapById(querySet.QueryComponents)
|
|
|
|
//newQCs := domain.QueryComponentsToMapById(queryComponents)
|
|
|
|
sourceId := querySet.QuerySetId
|
|
|
|
entry := domain.NewLogEntry(querySet.Name, querySet.Type, domain.UnKnown, ctx)
|
|
|
|
|
|
...
|
...
|
@@ -351,7 +445,7 @@ func (ptr *QuerySetService) CreateOrUpdateQuerySetTable(ctx *domain.Context, que |
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
masterTable = domain.NewQueryComponentTable(foundMasterTable)
|
|
|
|
var table *domain.Table = NewTable(domain.TableType(querySet.Type), querySet.Name, domain.RangeFields(masterTable.Fields, domain.ChangeFieldFlag), 0).WithContext(ctx).WithPrefix(strings.ToLower(querySet.Type))
|
|
|
|
var table *domain.Table = NewCopyTable(domain.TableType(querySet.Type), querySet.Name, domain.RangeFields(masterTable.Fields, domain.ChangeFieldFlag), 0).WithContext(ctx).WithPrefix(strings.ToLower(querySet.Type))
|
|
|
|
if querySet.QuerySetInfo.BindTableId > 0 {
|
|
|
|
table, err = tableRepository.FindOne(map[string]interface{}{"context": ctx, "tableId": querySet.QuerySetInfo.BindTableId})
|
|
|
|
if err != nil {
|
|
...
|
...
|
@@ -360,36 +454,41 @@ func (ptr *QuerySetService) CreateOrUpdateQuerySetTable(ctx *domain.Context, que |
|
|
|
table.DataFields = masterTable.Fields
|
|
|
|
table.UpdatedAt = time.Now()
|
|
|
|
}
|
|
|
|
var validTables = make([]*domain.Table, 0)
|
|
|
|
if len(dependencyTables) > 0 {
|
|
|
|
_, tables, err := tableRepository.Find(map[string]interface{}{"context": ctx, "tableIds": dependencyTables})
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
tableMap := make(map[int]*domain.Table)
|
|
|
|
for i := range tables {
|
|
|
|
tableMap[tables[i].TableId] = tables[i]
|
|
|
|
}
|
|
|
|
for _, c := range queryComponents {
|
|
|
|
if t, ok := tableMap[c.MasterTable.TableId]; ok {
|
|
|
|
c.MasterTable = domain.NewQueryComponentTable(t)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
for _, t := range validTables {
|
|
|
|
if t.TableType == domain.SchemaTable.ToString() || t.TableType == domain.SubProcessTable.ToString() {
|
|
|
|
validTables = append(validTables, t)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// 循环依赖判断
|
|
|
|
tableDependencyService, _ := NewTableDependencyService(ptr.transactionContext)
|
|
|
|
if len(validTables) > 0 {
|
|
|
|
tree := tableDependencyService.TableDependTree(validTables, querySet.QuerySetInfo.BindTableId)
|
|
|
|
if tableDependencyService.Detect(ctx, tree.EdgesArray()) {
|
|
|
|
return nil, NewCircleDependError(tableDependencyService.CircleTable(), querySet)
|
|
|
|
}
|
|
|
|
if err = ptr.validDependentCircle(ctx, querySet, queryComponents); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
//var validTables = make([]*domain.Table, 0)
|
|
|
|
//if len(dependencyTables) > 0 {
|
|
|
|
// _, tables, err := tableRepository.Find(map[string]interface{}{"context": ctx, "tableIds": dependencyTables})
|
|
|
|
// if err != nil {
|
|
|
|
// return nil, err
|
|
|
|
// }
|
|
|
|
// tableMap := make(map[int]*domain.Table)
|
|
|
|
// for i := range tables {
|
|
|
|
// tableMap[tables[i].TableId] = tables[i]
|
|
|
|
// }
|
|
|
|
// for _, c := range queryComponents {
|
|
|
|
// if t, ok := tableMap[c.MasterTable.TableId]; ok {
|
|
|
|
// c.MasterTable = domain.NewQueryComponentTable(t)
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// for _, t := range validTables {
|
|
|
|
// if t.TableType == domain.SchemaTable.ToString() || t.TableType == domain.SubProcessTable.ToString() {
|
|
|
|
// validTables = append(validTables, t)
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
//}
|
|
|
|
//
|
|
|
|
//// 循环依赖判断
|
|
|
|
//tableDependencyService, _ := NewTableDependencyService(ptr.transactionContext)
|
|
|
|
//if len(validTables) > 0 {
|
|
|
|
// tree := tableDependencyService.TableDependTree(validTables, querySet.QuerySetInfo.BindTableId)
|
|
|
|
// if tableDependencyService.Detect(ctx, tree.EdgesArray()) {
|
|
|
|
// return nil, NewCircleDependError(tableDependencyService.CircleTable(), querySet)
|
|
|
|
// }
|
|
|
|
//}
|
|
|
|
|
|
|
|
table.TableInfo.ApplyOnModule = domain.ModuleAll
|
|
|
|
table.TableInfo.DependencyTables = dependencyTables
|
...
|
...
|
|