Skip to content

Latest commit

 

History

History
41 lines (38 loc) · 9.4 KB

中文描述.md

File metadata and controls

41 lines (38 loc) · 9.4 KB

中文文档|英文文档

一.标准规则表达式:

  1. 元素: 一组[]表示元素,元素分为节点(Node)和叶子节点(Leaf)。Node是包含元素的单元,可以包含Node,也可以包含Leaf.Leaf包含函数。
  2. 规则: 元素与元素之间的关系是"与"或者"或"。做以下限定:如果一个元素完全是由Node组成,那么Node之间的关系是"或",如果含有Leaf 那么元素之间的关系是"与"。
  3. 特殊元素: Bud 是一个只会返回True的Leaf,表示成[]。 这个是为了处理元素内的完全是由Node组成,但是Node之间又必须用"与"相连的情况。root 元素是根元素,所有元素的起点。
  4. 函数: $加名称表示一个函数,例:$fun。在函数前面加一个叹号表示取反 例 !$func。函数的实现是由第三方语言实现,本表达式不支持对元素取反,只能对函数取反。
  5. 函数参数: 参数值由##包裹key 例:#param1#, 多个参数例子#param1#,#param2#。没有参数或使用默认参数,参数值置空.默认参数为param有且仅有1个。默认值和自定义值互斥。
  6. 函数基准值: 基准值由{}包裹,{key:value}形式,没有基准值,置空。使用默认基准值且初始化不赋值,置空。例 $fun(#param1#),使用基准值且赋值的情况忽略 key 例:$fun(#param1#,{:1})或 $fun(#param1#,{1})。遇到基准值初值格式化有冒号的情况,分隔的冒号不能省略, 例 $dateFun(#param1#,{:2020-01-01 00:00:00}),默认基准值有且仅有一个,默认值和自定义值互斥。
  7. 基准值特殊类型: 列表元素与元素之间用,隔开,例 {base1:1,2,3,4,5}表示一个列表值,字典值(Map) 例 {base1:k1|v1,k2|v2,k3|v3},亦可自定义基准值格式。时间格式默认yyyy-MM-dd HH:mm:ss。
  8. 表达式的使用: 一组符合规范的表达式是这样的 例: [[[$func1()][$func2({1})][$func3({:2020-01-01 00:00:00})]][[[$func1()][$func4(#param1#)]][[$func5(#param2#,#param3#)]]][[[$func6(#param4#,{base1:1},$func7(#param5#,{base2:},{base3:k1|v1,k2|v2})][$func8({base4:1,2,3,4,5})]][[$func9()][$func10()][!$func4(#param1#),$func9()]][]]].参数为空的表示没有参数或者使用默认参数,基准值可以在表达式中直接赋初值,也可以当作表达式参数传入。func1.param 表示函数func1的默认参数param,func7.base2表示函数func7的基准值base2,func6基准值是base1,值是1,func8的基准值是列表,func7.base3是个字典值。例子中表达式Root由3个Node组成,第一个Node由两个Leaf组成,Leaf与Leaf是与的关系,第二个Node是由两个Node组成,这两个是或的关系,第三个是由两个Node组成,但是里面有一个[] 表示两个Node之间的关系是与,三个Node之间的关系是或。

二.java使用:

  1. 元素: 元素有4个 Node,Leaf,Bud 以及Root。 都继承自Element。Node下面是Element 一个Node可以有多个ELement(Node的elements对象)。Root继承自Node是所有节点起始。Leaf包含一个Rule的集合(rules对象,是所有Node的末端,Leaf中的Rule之间的关系是与的关系。Bud是一个特殊的Leaf 永远返回True,如果和Bud同级的都是Node 那么,这些Node 通过与相连,如果同级的都是Node 那么通过或相连,有Leaf那么通过与相连。节点关系全是短路与或短路或,Leaf有个默认返回值,如果Leaf下面没有Rules,则excute会返回这个默认值的值,不传默认是false。
  2. 规则: Rule 规则Rule是自定义的,这个是最复杂也是最灵活的。 rule中有两个默认参数 param 和base 这个是最复杂也是最灵活的。所有的逻辑基本都是在rule上执行的。通过继承Rule 即可以自定义一个Rule 自定义Rule需要实现excute方法,Rule中有两个值 一个是基准值 这个值是用来做基准的,比方说大于3的满足条件,这个3即为基准值,作为判断依据,基准值也可以动态维护,计算传入的。而参数是来传入的,作为判断条件,判断的过程在excute里。返回一个boolean类型的。excuteMsg方法是一个返回自定义结果的方法,有需要可以复写,当Rule的excute方法判断是flase,需要返回一些自定义的结果进行下一步处理的时候可以复写这个方法,默认是返回一个字符信息。Nrule 是对Rule对象取反的意思,初始化的时候可以放入一个Rule对象。
  3. 获取提供的规则: RuleProducer中的静态方法getFeildInfo,会返回可提供的规则: 规则名称:function 规则描述:desc,描述语言:lang (用于i18n)。 字段描述:字段描述有两类,一个是name,例 func7.base2,另外一个是simpleName,例:base2。 fieldType是个枚举类型标识标识字段是参数还是基准值。value是基准值特有的,如果有设定的默认值既是设定的默认值。如果没有设定默认值,需要匹配规则的时候传入。
  4. Root对象的管理: Root有一个unid来标识唯一root,但是有一种情况,同一个Root,需要的参数不同,所初始化的实例不同。推荐使用unid+&+根据应传入参数的字母顺序+&分割以后的字符串,经过32位md5大写后的值作为唯一主键在系统中存储,应传入参数是指所有的的param+需要动态配置的base 可以通过RootProducer中getRootParamByUnid方法获取,这两个接口是为客户系统对规则引擎所需要的参数组合而返回的。rootProducer 可以通过xml,properties,注解,以及storePlugin 来初始化。同理里面也有相关获取提供对root增删改的接口,以及相应root需要的参数的接口getRootsParam。
  5. StorePlugin: 这个是root对象存储管理的插件,单机模式可以任意选择存储方式,对于集群模式,应使用同步模式实现(实现SynchStorePlugin),也可以对root自行管理。如果Root初始化一次基本不再变动(写死的规则)任何管理模式都可以,推荐使用redis对Root进行管理,实现SynchStorePlugin.
  6. 执行: engine.doExcute方法,传入表达式/unid/root+参数组成的param map,具体map中的key是通过RootProducer中getRootsParam 返回的参数name组成的。执行结果会返回,一般情况是字符串,也可以开发者自己订制,自定义rule的时候重写Rule的excuteMsg方法。doExcute 可以通过一个有Root注解的类,一个unid(注册了Root对象之后) 一个root对象,还有标准规则表达式来进行执行。
  7. 注解: 注解分为两种。一种是框架使用(framework包下),一种是注解式规则使用(application包下)
  • framework包:
    1. @DateFormat 用在Rule中基准值或者参数上,把时间格式把时间格式化成字符串也能把 字符串格式化成时间,默认是yyyy-MM-dd HH:mm:ss
    2. @Formator 用在Rule中基准值或者参数上 value是一个Formator类,这个是为了自定义格式化类型,格式化到标准规则表达式中,亦可从标准规则表达式,反解成对象。 继承com.github.obhen233.formator.Formator,实现 parse 和format。
    3. @Function 是用在Rule类上的,用来格式化名称使用,如果不使用默认Rule类名首字母小写,是表达式函数名称。要求项目中唯一。
    4. @NoBase 是用在Rule类上,表示这个Rule是一个没有基准值的规则,比方说日期大于当前时间。
    5. @NoParam 是用在Rule类上,表示这个Rule是一个没有参数的规则,比方说限定周几。
    6. @RuleBase 用在Rule中自定义字段上,表示这个字段是个基准值。value值是这个字段在标准表达式中的名称,默认是字段名称,base是这个字段的默认值,初始化的时候会把base赋值到这个对象的这个字段上,必须实现get set。
    7. @RuleParam 用在Rule中自定义字段上,表示这个字段是个参数值。value值是这个字段在标准表达式中的名称,默认是字段名称,必须实现get set。
    8. @Description 描述,是用在自定义字段、Rule类 对这个字段或者Rule的描述desc 是描述文字,lang指的是对应的I18n的值,默认中文 zh_cn。
  • application包:
    1. @IfNull 用在Leaf上,当Leaf下如果没有Rule的时候,表示excute方法返回的值是true 或false。
    2. @Leaf 放在一个继承了Element的类上面,表示这个Leaf里面有什么Rule。
    3. @Node 放在继承了Element的类上面表示这个Node里面有哪些Node 或者Leaf 或者Bud。
    4. @Root 表示这个是个Root元素,unid 唯一标识。
    5. @Rule 放在注解Leaf 里面表示 Leaf下面有啥Rule not表示这个Rule 是否取反。默认不取反。
  1. I18n: 简单的方法是通过@Description注解,还有一个办法是通过I18n.properies 这个里面 function.zh_cn 表示这个函数的中文描述是什么,如果找不到function.zh 它会去找function这个key function.param.zh_cn表示function 函数的param的中文描述,如果找不到他会去找function.param。优先级是 先Description 然后 function.zh_cn 最后 function,什么都没有返回一个空字符串。

本规则表达式还处于开发中,未经过全面测试,用于生产环境请经过周密测试之后。

例: https://github.com/obhen233/engineDemo.git