fix: some bug
- calculate item rename - Formula add function MixTableModel()
正在显示
5 个修改的文件
包含
71 行增加
和
3 行删除
| @@ -428,7 +428,9 @@ func (querySetService *QuerySetService) CalculateItemPreview(ctx *domain.Context | @@ -428,7 +428,9 @@ func (querySetService *QuerySetService) CalculateItemPreview(ctx *domain.Context | ||
| 428 | defer func() { | 428 | defer func() { |
| 429 | transactionContext.RollbackTransaction() | 429 | transactionContext.RollbackTransaction() |
| 430 | }() | 430 | }() |
| 431 | - | 431 | + if q.Formula.MixTableModel() { |
| 432 | + q.Formula.ExprSql = q.Formula.Complete() | ||
| 433 | + } | ||
| 432 | _, result := GetItemValues(transactionContext, q) | 434 | _, result := GetItemValues(transactionContext, q) |
| 433 | if err := transactionContext.CommitTransaction(); err != nil { | 435 | if err := transactionContext.CommitTransaction(); err != nil { |
| 434 | return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | 436 | return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) |
| @@ -483,6 +485,10 @@ func GetItemValues(transactionContext application.TransactionContext, q *query.C | @@ -483,6 +485,10 @@ func GetItemValues(transactionContext application.TransactionContext, q *query.C | ||
| 483 | if err != nil { | 485 | if err != nil { |
| 484 | return nil, nil | 486 | return nil, nil |
| 485 | } | 487 | } |
| 488 | + | ||
| 489 | + if q.Formula.MixTableModel() { | ||
| 490 | + q.Formula.ExprSql = q.Formula.Complete() | ||
| 491 | + } | ||
| 486 | value := starrocks.CalculateItemValue(starrocks.DB, q.Formula) | 492 | value := starrocks.CalculateItemValue(starrocks.DB, q.Formula) |
| 487 | 493 | ||
| 488 | var result = make([]itemValue, 0) | 494 | var result = make([]itemValue, 0) |
| @@ -432,6 +432,9 @@ func (tableService *TableService) ValidExprSql(ctx *domain.Context, cmd *command | @@ -432,6 +432,9 @@ func (tableService *TableService) ValidExprSql(ctx *domain.Context, cmd *command | ||
| 432 | for _, f := range cmd.TableFields { | 432 | for _, f := range cmd.TableFields { |
| 433 | set.AddStr(f.TableSqlName) | 433 | set.AddStr(f.TableSqlName) |
| 434 | } | 434 | } |
| 435 | + if cmd.MixTableModel() { | ||
| 436 | + cmd.ExprSql = cmd.Complete() | ||
| 437 | + } | ||
| 435 | selectValue := cmd.ExprSql | 438 | selectValue := cmd.ExprSql |
| 436 | //if _, parseErr := strconv.ParseFloat(cmd.ExprSql, 64); parseErr != nil { | 439 | //if _, parseErr := strconv.ParseFloat(cmd.ExprSql, 64); parseErr != nil { |
| 437 | // selectValue = "'" + selectValue + "'" | 440 | // selectValue = "'" + selectValue + "'" |
| 1 | package domain | 1 | package domain |
| 2 | 2 | ||
| 3 | -import "fmt" | 3 | +import ( |
| 4 | + "fmt" | ||
| 5 | + "github.com/zeromicro/go-zero/core/collection" | ||
| 6 | + "strings" | ||
| 7 | +) | ||
| 4 | 8 | ||
| 5 | var ( | 9 | var ( |
| 6 | SchemaTable TableType = "Schema" // 方案 | 10 | SchemaTable TableType = "Schema" // 方案 |
| @@ -95,6 +99,50 @@ type FieldExpr struct { | @@ -95,6 +99,50 @@ type FieldExpr struct { | ||
| 95 | ExprSql string `json:"exprSql"` | 99 | ExprSql string `json:"exprSql"` |
| 96 | } | 100 | } |
| 97 | 101 | ||
| 102 | +func (expr *FieldExpr) Complete() string { | ||
| 103 | + exprSql := expr.ExprSql | ||
| 104 | + for _, f := range expr.TableFields { | ||
| 105 | + sql := fmt.Sprintf("%s.%s", f.TableSqlName, f.FieldSqlName) | ||
| 106 | + //zhSql := fmt.Sprintf("%s.%s", f.TableName, f.FieldSqlName) | ||
| 107 | + sub := fmt.Sprintf("max(%s.%s)", f.TableSqlName, f.FieldSqlName) | ||
| 108 | + //zhSub := fmt.Sprintf("max(%s.%s)", f.TableName, f.FieldSqlName) | ||
| 109 | + if strings.Contains(expr.ExprSql, fmt.Sprintf("(%s)", sql)) { | ||
| 110 | + continue | ||
| 111 | + } | ||
| 112 | + exprSql = strings.ReplaceAll(exprSql, sql, sub) | ||
| 113 | + //expr.ExprSql = strings.ReplaceAll(expr.ExprSql, sql, sub) | ||
| 114 | + //expr.ExprHuman = strings.ReplaceAll(expr.ExprHuman, zhSql, zhSub) | ||
| 115 | + } | ||
| 116 | + return exprSql | ||
| 117 | +} | ||
| 118 | + | ||
| 119 | +func (expr *FieldExpr) Tables() []int { | ||
| 120 | + set := collection.NewSet() | ||
| 121 | + for _, f := range expr.TableFields { | ||
| 122 | + if f.TableId == 0 { | ||
| 123 | + continue | ||
| 124 | + } | ||
| 125 | + set.Add(f.TableId) | ||
| 126 | + } | ||
| 127 | + return set.KeysInt() | ||
| 128 | +} | ||
| 129 | + | ||
| 130 | +func (expr *FieldExpr) MixTableModel() bool { | ||
| 131 | + var result = 0 | ||
| 132 | + for _, f := range expr.TableFields { | ||
| 133 | + if strings.HasPrefix(f.TableSqlName, strings.ToLower(CalculateItem.ToString())) { | ||
| 134 | + if result&1 == 0 { | ||
| 135 | + result += 1 | ||
| 136 | + } | ||
| 137 | + } else { | ||
| 138 | + if result&2 == 0 { | ||
| 139 | + result += 2 | ||
| 140 | + } | ||
| 141 | + } | ||
| 142 | + } | ||
| 143 | + return result == 3 | ||
| 144 | +} | ||
| 145 | + | ||
| 98 | type LabelColumn struct { | 146 | type LabelColumn struct { |
| 99 | Column TableField `json:"column,omitempty"` | 147 | Column TableField `json:"column,omitempty"` |
| 100 | LabelExpr string `json:"labelExpr"` | 148 | LabelExpr string `json:"labelExpr"` |
| @@ -141,11 +141,15 @@ func NewFormulaCalculate(table *domain.Table, queryComponent *domain.QueryCompon | @@ -141,11 +141,15 @@ func NewFormulaCalculate(table *domain.Table, queryComponent *domain.QueryCompon | ||
| 141 | if queryComponent.Formula != nil { | 141 | if queryComponent.Formula != nil { |
| 142 | formula := queryComponent.Formula | 142 | formula := queryComponent.Formula |
| 143 | res.DatabaseTableName = formula.TableFields[0].TableSqlName | 143 | res.DatabaseTableName = formula.TableFields[0].TableSqlName |
| 144 | + exprSql := formula.ExprSql | ||
| 145 | + if queryComponent.Formula.MixTableModel() { | ||
| 146 | + exprSql = queryComponent.Formula.Complete() | ||
| 147 | + } | ||
| 144 | for _, f := range queryComponent.Formula.TableFields { | 148 | for _, f := range queryComponent.Formula.TableFields { |
| 145 | res.FormulaCalculateFields = append(res.FormulaCalculateFields, &FormulaCalculateField{ | 149 | res.FormulaCalculateFields = append(res.FormulaCalculateFields, &FormulaCalculateField{ |
| 146 | DatabaseTableName: f.TableSqlName, | 150 | DatabaseTableName: f.TableSqlName, |
| 147 | FieldSchema: NewFieldSchema(f), | 151 | FieldSchema: NewFieldSchema(f), |
| 148 | - CalculateExpression: formula.ExprSql, | 152 | + CalculateExpression: exprSql, |
| 149 | CalculateFieldName: table.DataFields[0].SQLName, | 153 | CalculateFieldName: table.DataFields[0].SQLName, |
| 150 | }) | 154 | }) |
| 151 | } | 155 | } |
| @@ -688,6 +688,10 @@ func (ptr *QuerySetService) CreateOrUpdateCalculateItemTable(ctx *domain.Context | @@ -688,6 +688,10 @@ func (ptr *QuerySetService) CreateOrUpdateCalculateItemTable(ctx *domain.Context | ||
| 688 | dependencyTables := querySet.GetDependencyTables(queryComponents) | 688 | dependencyTables := querySet.GetDependencyTables(queryComponents) |
| 689 | tableRepository, _ := repository.NewTableRepository(ptr.transactionContext) | 689 | tableRepository, _ := repository.NewTableRepository(ptr.transactionContext) |
| 690 | queryComponent := queryComponents[0] | 690 | queryComponent := queryComponents[0] |
| 691 | + //!!!warning:每个字段默认需要带函数,没有就补全max() | ||
| 692 | + //if queryComponent.Formula.MixTableModel() { | ||
| 693 | + // queryComponent.Formula.Complete() | ||
| 694 | + //} | ||
| 691 | field := DataField(querySet.Name, domain.String.ToString(), domain.MainTableField, 1) | 695 | field := DataField(querySet.Name, domain.String.ToString(), domain.MainTableField, 1) |
| 692 | if len(queryComponent.Formula.TableFields) > 0 { | 696 | if len(queryComponent.Formula.TableFields) > 0 { |
| 693 | field.SQLType = queryComponent.Formula.TableFields[0].FieldSQLType | 697 | field.SQLType = queryComponent.Formula.TableFields[0].FieldSQLType |
| @@ -793,6 +797,9 @@ func (ptr *QuerySetService) Rename(ctx *domain.Context, querySetId int, name str | @@ -793,6 +797,9 @@ func (ptr *QuerySetService) Rename(ctx *domain.Context, querySetId int, name str | ||
| 793 | return err | 797 | return err |
| 794 | } | 798 | } |
| 795 | table.Name = name | 799 | table.Name = name |
| 800 | + if table.TableType == domain.CalculateItem.ToString() && len(table.DataFields) > 0 { | ||
| 801 | + table.DataFields[0].Name = name | ||
| 802 | + } | ||
| 796 | if _, err := tableRepository.Save(table); err != nil { | 803 | if _, err := tableRepository.Save(table); err != nil { |
| 797 | return err | 804 | return err |
| 798 | } | 805 | } |
-
请 注册 或 登录 后发表评论