Browse Source

修改bug

yjp 4 weeks ago
parent
commit
b108346f83

+ 28 - 42
convenient/domain/query_rule/query_rule.go

@@ -67,7 +67,7 @@ func (queryParams *BaseAdvanceQueryParams) GetPageSize() int {
 type FormAdditionalSelectClausesFunc func(queryParams AdvanceQueryParams) ([]string, error)
 type FormAdditionalFromFunc func(queryParams AdvanceQueryParams) ([]clause.Clause, error)
 type FormAdditionalConditionsFunc func(queryParams AdvanceQueryParams) (clause.Clause, error)
-type FormOtherClausesFunc func(queryParams AdvanceQueryParams) ([]clause.Clause, error)
+type FormOrderByFunc func(queryParams AdvanceQueryParams) (clause.Clause, error)
 
 type AddUseQueryRuleQueryRouteParams struct {
 	DBSchema                        string
@@ -75,7 +75,7 @@ type AddUseQueryRuleQueryRouteParams struct {
 	FormAdditionalSelectClausesFunc FormAdditionalSelectClausesFunc
 	FormAdditionalFromFunc          FormAdditionalFromFunc
 	FormAdditionalConditionsFunc    FormAdditionalConditionsFunc
-	FormOtherClausesFunc            FormOtherClausesFunc
+	FormOrderByFunc                 FormOrderByFunc
 	Object                          domain.Object
 	QueryMiddlewares                []binding.Middleware
 }
@@ -118,16 +118,8 @@ func AddUseQueryRuleQueryRoute[O any](binder *binding.Binder, addParams *AddUseQ
 				return errResponse, errors.New("需要传递领域对象应该为实体")
 			}
 
-			var selectClause *clause.Select
-			var countClause *clause.Select
-			var fromClause *clause.From
-			var additionalConditions clause.Clause
-
+			// 构造select语句块
 			selectClauses := make([]string, 0)
-			fromClauses := []clause.Clause{clause.TableName(domain.TableName(addParams.DBSchema, e))}
-			selectOtherClauses := make([]clause.Clause, 0)
-			countOtherClauses := make([]clause.Clause, 0)
-
 			if addParams.FormAdditionalSelectClausesFunc != nil {
 				additionalSelectClauses, err := addParams.FormAdditionalSelectClausesFunc(advanceQueryParams)
 				if err != nil {
@@ -137,6 +129,8 @@ func AddUseQueryRuleQueryRoute[O any](binder *binding.Binder, addParams *AddUseQ
 				selectClauses = additionalSelectClauses
 			}
 
+			// 构造from语句块
+			fromClauses := []clause.Clause{clause.TableName(domain.TableName(addParams.DBSchema, e))}
 			if addParams.FormAdditionalFromFunc != nil {
 				additionalFromClauses, err := addParams.FormAdditionalFromFunc(advanceQueryParams)
 				if err != nil {
@@ -146,57 +140,49 @@ func AddUseQueryRuleQueryRoute[O any](binder *binding.Binder, addParams *AddUseQ
 				fromClauses = append(fromClauses, additionalFromClauses...)
 			}
 
-			fromClause = clause.NewFrom(fromClauses)
-			limitClause := clause.NewLimit(advanceQueryParams.GetPageNo(), advanceQueryParams.GetPageSize())
-
-			if addParams.FormAdditionalConditionsFunc != nil {
-				conditions, err := addParams.FormAdditionalConditionsFunc(advanceQueryParams)
-				if err != nil {
-					return errResponse, err
-				}
-
-				additionalConditions = conditions
-			}
-
-			if strutils.IsStringEmpty(advanceQueryParams.GetRule()) {
-				if additionalConditions != nil {
-					selectOtherClauses = append(selectOtherClauses, clause.NewWhere(additionalConditions), limitClause)
-					countOtherClauses = append(countOtherClauses, clause.NewWhere(additionalConditions))
-				} else {
-					selectOtherClauses = append(selectOtherClauses, limitClause)
-				}
-			} else {
+			// 构造where语句块
+			var conditionsClause clause.Clause
+			if strutils.IsStringNotEmpty(advanceQueryParams.GetRule()) {
 				queryRule := new(rule.Rule)
 				err := json.Unmarshal([]byte(advanceQueryParams.GetRule()), queryRule)
 				if err != nil {
 					return errResponse, err
 				}
 
-				conditionClause, err := rule.FormConditionClauseByRule(e.DomainCamelName(), *queryRule, nil)
+				ruleConditionClause, err := rule.FormConditionClauseByRule(e.DomainCamelName(), *queryRule, nil)
 				if err != nil {
 					return errResponse, err
 				}
 
-				if additionalConditions != nil {
-					conditionClause = clause.NewConditionJoin(conditionClause, additionalConditions).And()
+				conditionsClause = ruleConditionClause
+			}
+
+			if addParams.FormAdditionalConditionsFunc != nil {
+				additionalConditionsClause, err := addParams.FormAdditionalConditionsFunc(advanceQueryParams)
+				if err != nil {
+					return errResponse, err
 				}
 
-				selectOtherClauses = append(selectOtherClauses, clause.NewWhere(conditionClause), limitClause)
-				countOtherClauses = append(countOtherClauses, clause.NewWhere(conditionClause))
+				conditionsClause = clause.NewConditionJoin(conditionsClause, additionalConditionsClause).And()
 			}
 
-			if addParams.FormOtherClausesFunc != nil {
-				otherClauses, err := addParams.FormOtherClausesFunc(advanceQueryParams)
+			// 构造order by语句块
+			var orderByClause clause.Clause
+			if addParams.FormOrderByFunc != nil {
+				innerOrderByClause, err := addParams.FormOrderByFunc(advanceQueryParams)
 				if err != nil {
 					return errResponse, err
 				}
 
-				selectOtherClauses = append(selectOtherClauses, otherClauses...)
-				countOtherClauses = append(countOtherClauses, otherClauses...)
+				orderByClause = innerOrderByClause
 			}
 
-			selectClause = clause.NewSelect(selectClauses, fromClause, selectOtherClauses...)
-			countClause = clause.NewSelect([]string{"COUNT(*) AS total"}, fromClause, countOtherClauses...)
+			// 构造limit语句块
+			limitClause := clause.NewLimit(advanceQueryParams.GetPageNo(), advanceQueryParams.GetPageSize())
+
+			fromClause := clause.NewFrom(fromClauses)
+			selectClause := clause.NewSelect(selectClauses, fromClause, clause.NewWhere(conditionsClause), orderByClause, limitClause)
+			countClause := clause.NewSelect([]string{"COUNT(*) AS total"}, fromClause, clause.NewWhere(conditionsClause))
 
 			selectClauseStr, err := selectClause.Clause()
 			if err != nil {

+ 8 - 0
framework/core/infrastructure/database/clause/select.go

@@ -39,6 +39,10 @@ func (clause *Select) Clause() (string, error) {
 
 	otherClauseBuilder := strings.Builder{}
 	for _, otherClause := range clause.otherClauses {
+		if otherClause == nil {
+			continue
+		}
+
 		otherClauseStr, err := otherClause.Clause()
 		if err != nil {
 			return "", err
@@ -62,6 +66,10 @@ func (clause *Select) Args() []any {
 	args = append(args, clause.fromClause.Args()...)
 
 	for _, otherClause := range clause.otherClauses {
+		if otherClause == nil {
+			continue
+		}
+		
 		args = append(args, otherClause.Args()...)
 	}