edi.rule.model.JSRuleMatches Maven / Gradle / Ivy
package edi.rule.model;
import java.util.LinkedHashMap;
import java.util.List;
import edi.rule.annotation.JSRuleCheck;
import edi.rule.extend.interfaces.IJSRuleModel;
import lombok.Data;
/**
* @author 摩拉克斯
* @date 2022年3月29日 下午2:30:42
* 条件模型,用于解析where条件,其中包括等于,不等于,大于,小于,大于等于,小于等于,模糊查询,in查询(包含子查询等)
*/
@Data
public final class JSRuleMatches implements IJSRuleModel{
/**
*
等于条件,key为字段名,value为值数组,对值为null是否是字符串不敏感,保证有序
*
例子:"eq":{"ZsTestPO.test_field":["zzz",null]},表示test_field = 'zzz' and/or test_field is null
* */
public LinkedHashMap eq;
/**
* 不等于条件,key为字段名,value为值数组,对值为null是否是字符串不敏感,保证有序
*
例子:"ne":{"view.ZsTestView.test_field":["zzz","null"]},表示test_field != 'zzz' and test_field is not null
* */
public LinkedHashMap ne;
/**
* in条件,key为字段名,value为值数组,对应的sql表示为 field in ('a','b'),保证有序
*
例子:"in":{"ZsTestPO.bonus":["asd"]}
* */
public LinkedHashMap in;
/**
* not in条件
*
例子:"ni":{"ZsTestPO.bonus":["asd"]}
* */
public LinkedHashMap ni;
/**
* 模糊条件,key为字段名,value为值数组,值需要自行写%符号以优化索引操作,保证有序
*
例子:"li":{"view.ZsTestView.test_field":["%zzz%","bbb%"]}
* */
public LinkedHashMap li;
/**
* 模糊条件的否定模式,not like
*
例子:"nl":{"view.ZsTestView.test_field":["%zzz%","bbb%"]}
* */
public LinkedHashMap nl;
/**
* 大于条件,key为字段名,value为值,对数值是否为字符串不敏感,保证有序
*
例子:"gt":{"ZsTestPO.bonus":22}
* */
public LinkedHashMap gt;
/**
* 小于条件,key为字段名,value为值,对数值是否为字符串不敏感,保证有序
*
例子:"lt":{"ZsTestPO.bonus":"19"}
* */
public LinkedHashMap lt;
/**
* 大于等于条件
*
例子:"ge":{"ZsTestPO.bonus":"10"}
* */
public LinkedHashMap ge;
/**
* 小于等于条件
*
例子:"le":{"ZsTestPO.bonus":20}
* */
public LinkedHashMap le;
/**
* 子查询模型,可以是一个类,也可以是一个视图,还可以是前面执行过的action产生的sql子查询
*
例子:"matches":{
"to":{
"in":{"ZsTestPO.test_field":{"action":"poAction"},
"ZsTestPO.id":{"view":"view.ZsTestView"}}
}
}
* */
@JSRuleCheck
public JSRuleToPointer to;
/**
*
括号bracket,表示条件组,与where后面的()括号含义相同,用于and or的条件关联
*
说明:当条件全为and或者全为or的时候是不需要加括号的,只有在and遇到or的变化时才需要加括号,例如:A and B or C,到这里就出现歧义了
*
可以分为(A and B) or C或者A and (B or C),所以需要加bracket,而bracket里面的条件表达式如果再次出现了不同则需要再加一个bracket
*
同一个bracket下所有的表达式都为同一层,且同一层的逻辑相同,要么全是and要么全是or,如果我们把每一个括号定义为一个层面,那么没有括号的为第一层
*
第一层的条件关系为and,第二层为or,第三层又变成了and,所以根据这个逻辑,我们只需要在第一层也就是{@link JSRuleConditions#type}配置好即可
*
例子:"br":[
{"br":[
{"gt":{"ZsTestPO.bonus":"19"},"le":{"ZsTestPO.salary":"10.5"}}
]
},
{"in":{"ZsTestPO.name":["qqq","xxx"]}},
{"br":[
{"like":{"view.ZsTestView.ohNo":["%v%"],"view.ZsTestView.test_field":["%zzz%"]}}
]
}
]
* */
public List br;
}