Browse Source

添加替换Rule的接口

yjp 1 month ago
parent
commit
d130ef4cee
3 changed files with 118 additions and 2 deletions
  1. 117 1
      convenient/domain/query_rule/rule/query_rule_parser.go
  2. 0 1
      go.mod
  3. 1 0
      go.sum

+ 117 - 1
convenient/domain/query_rule/rule/query_rule_parser.go

@@ -35,7 +35,7 @@ type Rule struct {
 }
 
 func (r Rule) check() error {
-	if strutils.IsStringNotEmpty(r.LogicalOperator) {
+	if r.isNode() {
 		return r.checkAsNode()
 	} else {
 		return r.checkAsLeaf()
@@ -98,6 +98,10 @@ func (r Rule) checkAsLeaf() error {
 	return nil
 }
 
+func (r Rule) isNode() bool {
+	return strutils.IsStringNotEmpty(r.LogicalOperator)
+}
+
 // HasRule 检查是否存在规则
 // 参数:
 // - dbSchema: 数据库schema
@@ -160,6 +164,118 @@ func FormConditionClauseByRule(domainName string, r Rule, ruleParams map[string]
 	return c, nil
 }
 
+const (
+	modifyBranchRoot  = "root"
+	modifyBranchLeft  = "left"
+	modifyBranchRight = "right"
+)
+
+func ModifyLeafRuleStr(ruleStr string, leafRuleCallback func(leafRule *Rule) error) (string, error) {
+	rootRule := new(Rule)
+	err := json.Unmarshal([]byte(ruleStr), rootRule)
+	if err != nil {
+		return "", err
+	}
+
+	err = modifyLeafRule(nil, rootRule, modifyBranchRoot, leafRuleCallback)
+	if err != nil {
+		return "", err
+	}
+
+	newRuleStr, err := json.Marshal(rootRule)
+	if err != nil {
+		return "", err
+	}
+
+	return string(newRuleStr), nil
+}
+
+func modifyLeafRule(parentRule *Rule, r *Rule, branch string, leafRuleCallback func(leafRule *Rule) error) error {
+	if r == nil {
+		return nil
+	}
+
+	err := r.check()
+	if err != nil {
+		return err
+	}
+
+	if !r.isNode() {
+		err := leafRuleCallback(r)
+		if err != nil {
+			return err
+		}
+
+		if parentRule == nil {
+			return nil
+		}
+
+		switch branch {
+		case modifyBranchRoot:
+			return nil
+		case modifyBranchLeft:
+			parentRule.Left = r
+		case modifyBranchRight:
+			parentRule.Right = r
+		default:
+			return errors.New("不支持的分支类型: " + branch)
+		}
+	}
+
+	err = modifyLeafRule(r, r.Left, modifyBranchLeft, leafRuleCallback)
+	if err != nil {
+		return err
+	}
+
+	err = modifyLeafRule(r, r.Right, modifyBranchRight, leafRuleCallback)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func modifyRule(rootRule *Rule, ruleCallback func(parentRule *Rule, r *Rule, branch string) error) error {
+	if rootRule == nil {
+		return nil
+	}
+
+	err := rootRule.check()
+	if err != nil {
+		return err
+	}
+
+	if !rootRule.isNode() {
+		return ruleCallback(nil, rootRule, modifyBranchRoot)
+	}
+
+	err = ruleCallback(rootRule, rootRule.Left, modifyBranchLeft)
+	if err != nil {
+		return err
+	}
+
+	if rootRule.Left.isNode() {
+		err := modifyRule(rootRule.Left, ruleCallback)
+		if err != nil {
+			return err
+		}
+	}
+
+	err = ruleCallback(rootRule, rootRule.Right, modifyBranchRight)
+	if err != nil {
+		return err
+	}
+
+	if rootRule.Right.isNode() {
+		err := modifyRule(rootRule.Right, ruleCallback)
+		if err != nil {
+			return err
+		}
+	}
+
+	return nil
+}
+
 func getEnabledRule(dbSchema string, scope string, domainName string, i *infrastructure.Infrastructure) (Rule, error) {
 	dbExecutor := i.DBExecutor()
 

+ 0 - 1
go.mod

@@ -81,7 +81,6 @@ require (
 	golang.org/x/sys v0.20.0 // indirect
 	golang.org/x/text v0.15.0 // indirect
 	golang.org/x/tools v0.6.0 // indirect
-	google.golang.org/genproto v0.0.0-20240318140521-94a12d6c2237 // indirect
 	google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect
 	google.golang.org/grpc v1.64.0 // indirect
 	google.golang.org/protobuf v1.34.1 // indirect

+ 1 - 0
go.sum

@@ -287,6 +287,7 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/genproto v0.0.0-20240318140521-94a12d6c2237/go.mod h1:9sVD8c25Af3p0rGs7S7LLsxWKFiJt/65LdSyqXBkX/Y=
 google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc=
 google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=
 google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY=