instaer / aviator-rule-engine

基于AviatorScript的规则引擎实例
93 stars 55 forks source link

条件组的个人建议 #6

Closed Zsir2022 closed 1 year ago

Zsir2022 commented 1 year ago

1 在规则上增加逻辑运算关系,感觉不是最完美的方案,建议引入条件组的概念(conditionGroup) 条件装配为条件组,然后在规则中只对条件组通过逻辑运算关系装配为规则执行的决策条件,这样就不需要另外增加“XOR”,以及判断是否覆盖返回值的问题; 例:

{
    "conditionGroup":[
        {
            "groupCode":"g1",
            "condition":"a==1 || b==2"
        },
        {
            "groupCode":"g2",
            "condition":"c==3||d==4"
        }
    ],
    "rule":{
        "ruleCondition":[
            {
                "logicType":"AND",
                "conditionGroup":"g1"
            },
            {
                "logicType":"AND",
                "conditionGroup":"g2"
            }
        ],
        "returnValues":{
            "returnType":"BOOLEAN、MAP",
            "returnData":"{'key':'value'}"
        }
    }
}
  1. 另外返回值建议增加返回类型可配置化,根据需要配置返回boolean或者map,返回map时value考虑下是否可以放置数组结构数据

个人拙见,相互学习交流

instaer commented 1 year ago

感谢你的建议。

  1. 你说的这个条件组我理解应该和规则的含义是一致的,目前是三个维度:条件->规则->规则集。条件上配置的是最小的条件单元,规则是多个条件的组合,规则集是最终执行的对象,规则之间之所以添加规则逻辑关系,是因为考虑到可能有以下两种场景:

    • 规则1(a == 1 || b == 2) AND 规则2(c == 3 || d == 4)
let rmap = seq.map('myvalue', 'result_default');
if((a == 1 || b == 2) && (c == 3 || d == 4)){
seq.put(rmap, 'myvalue', 'result_1');
}
return rmap;
let rmap = seq.map('myvalue', 'result_default');
if((a == 1 || b == 2)){
seq.put(rmap, 'myvalue', 'result_1');
}
elsif(c == 3 || d == 4){
seq.put(rmap, 'myvalue', 'result_2');   
}
return rmap;

另外就是返回值覆盖的问题,第一种情况一个判断分支只有一种返回值,第二种情况因为有多个判断分支所以有多种返回值,为了同时满足这两种情况,返回值只能配置在规则上。并且在第一种情况中,因为两个规则都有返回值配置,所以以组合顺序最后一个为准。

  1. 你提到的返回值应该是指返回值集合。目前的返回值集合配置的确没有定义严格的类型,变量名和返回值在配置时是绑定的,通常来说,可以从变量名称的字典文档中了解它对应的类型。对于返回值集合中的值支持boolean、map以及map的value支持数组结构,这个我认为通过设置json对象字符串形式更简单(如{'myvar1':'success','myvar2':500,'myvar3':[1,2,3]}),这个后续会支持一下。