shunt插件
shunt插件是一个非常重要的插件,它可以将所有的action插件通过一定的逻辑判断串联起来,可以将它理解为if else语句,通过判断来决定最终执行哪些actions指令,这意味着通过这种方式可以实现一个复杂的递归指令,下面看一个例子
{
"actions": [
{
"name": "test_get",
"get": {
"relation": {
"classes":["ZsTestPO"]
},
"groupShow":true,
"fields":["name","salary","currentDate"],
"condition":{
"where":{
"eq":{"ZsTestPO.name":["mmm"]}
}
}
}
},{
"name":"test_shunt",
"shunt":{
"ifAnd":true,
"if":{
"name":"test_get",
"path":"/data/2/ZsTestPO/salary",
"value":300,
"asserts":["testAsserts"],
"usual":[{
"in":[null,true,300.0]
},{
"name":"test_get",
"path":"/data/0/current_date",
"lt":"2023-08-20 00:00:00","ge":"2023-08-03 00:00:00"
}],
"br":[{
"usual":[{
"le":300,"in":[300.1]
}],
"br":[{
"usual":[{
"name":"test_get",
"path":"/data/1/ZsTestPO/salary",
"le":1100,"in":["zxc",{"name":"test_get","path":"/data/0/ZsTestPO/salary"}]
}]
}]
}]
},
"then":[
{
"name": "shunt_then",
"get": {
"relation": {
"classes":["ZsTestPO"]
},
"fields":["name"]
}
}
],"else":[
{
"name":"shunt_else",
"get": {
"relation": {
"classes":["ZsTestPO"]
},
"fields":["name"]
}
}
]
}
}
]
}
上面的例子看起来非常的复杂,接下来我们逐一进行分解说明
由于shunt插件是对前面action插件执行后的结果进行判断,因此在执行shunt插件之前应该至少有一个action已经执行成功并产生结果。JSRuleAssert对象对应的if判断中有如下几个属性
- ifAnd:表示第一层的与或逻辑为and还是or
- name:表示从哪一个action的结果中取值
- path:jackson node path,用于从结果集中取指定的值,如果node是一个数组,那么可以通过/加数字来指定某一条结果的值,如nodeA/1/nodeB
- value:没有获取到值时的默认值,此外无论是通过name,path还是value取得的值类型只能为String,int,Double,Long,Boolean,null
- asserts:自定义断言器,数组的值为spring bean的名称,多个断言器之间的与或关系取决于ifAnd以及br属性
- usual:框架内置的基本判断功能,它包含in,ni,gt,ge,lt,le,判断时需要注意值的类型,例如从name和path中取到的value值为double类型,那么只有当in的数组中存在300.0时才会为true,300则为false。当字符串的格式为框架定义的时间格式时则会用时间来进行判断,取不到数值时可以用null来进行判断。此外usual对象中还提供了name,path,value属性,它表示将采用这些属性获取到的值作为判断条件而非父属性获取到的值,否则将采用父属性的值作为判断条件。最后,多个usual对象之间的与或关系取决于ifAnd以及br属性。
- br:表示bracket,它与get插件中的判断条件逻辑相同,如果ifAnd为true,则第一层的与或逻辑为and,使用br属性可对判断条件进行包裹,此时这些被包裹的条件将进入到第二层,此时与或逻辑发生反转,条件与条件之间的与或关系全部为or,以此类推,可实现复杂的判断。
提示:usual对象内部的in,ni,gt,ge,lt,le属性可以是一个map类型,在map中依然可以声明name,path,value属性,表示使用当前属性来重新获取比较值
注意:当通过name和path属性没有取到值的时候则不会覆盖默认的value值,因此value为300是Integer类型而非数据库返回的double类型