规则引擎 Drools(十四):DSL

DSL 用于将 DSLR 中的语句转为 DRL 的语言。

DSLR 由业务专家编写,DSL 由开发人员编写。

DSL 通过正则表达式匹配,将 DSLR 中的语句替换为 DRL 代码。

DSL 语法

[<scope>]<dsl expression>=<replacement text>

<scope> 支持以下四种不同类型:

  • when 或 condition,应用于规则的 LHS
  • then 或 consequence,应用于规则的 RHS
  • *,同时应用于规则的 LHS 和 RHS
  • keyword,可应用于 DSLR 任何位置,甚至规则定义之外

<dsl expression> 是 Java 正则表达式,并支持提取变量,在 <replacement text> 中使用。

示例:

定义 DSLR

rule "test"  
    when
    then
        say hello
end  

将 say 替换为 Java 代码

[then]say {words:\w*}=System.out.println("{words}");

结果为:

rule "test"  
    when
    then
        System.out.println("hello");
end  

条件约束

在 LHS 中,为类型增加条件约束通过一个“-”实现。

示例:

上面示例的升级版,添加条件,只撩妹

rule "test"  
    when
        Person
        - is a girl
    then
        say hello
end  
[when]Person=Person($name: name)
[when]- is a {sex:\w*}=sex=="{sex}"
[then]say {words:\w*}=System.out.println($name + ", {words}");

结果为:

rule "test"  
    when
        Person($name: name, sex=="girl")
    then
        System.out.println($name + " hello");
end