|
@@ -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)
|
|
|
+}
|
|
|
+
|
|
|
|
|
|
|
|
|
|
|
@@ -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()
|
|
|
|