如何将以下drools规则标准重构为函数?

时间:2013-10-05 12:13:08

标签: java drools

rule "size must be greater than 1 billion"
    when
        $typeMaster : TypeMaster ( $type : keyValue["type"] , 
                                   $code : keyValue["code"],
                                       ( $type in ( "CB1", "CB2" ) && $code == "123" ) ||
                                       ( $type in ( "B1", "B2" ) && $code == "234" ) &&
                                   keyValue["size"] <= 1000000000 )
    then
        messageService.save(Type.ERROR, kcontext, $typeMaster);
end

我在drools中有上述规则,在TypeMaster事实/对象中,有一个keyValue映射,获取类型和代码并根据几个标准检查它们的值,当它们满足时,检查大小是否<=十亿。如果它满足标准,那么它将在结果中保存带有错误和规则名称的所需对象。

我想重构代码。但是我希望所有类型和代码检查都在rules文件中,因为如果任何规则发生更改,可以在文件本身中更改它,而不是进入Java代码并更改硬编码变量。你能建议吗?

1 个答案:

答案 0 :(得分:0)

如何将检查方法添加到TypeMaster Fact中。像这样的东西

class TypeMaster {
  boolean isTypeIn( String... params ) {
    // Check if this.type is in params
  }
  boolean isCodeIn( String... params ) {
    // Check if this.code is in params
  }
  boolean isSizeSmallerOrEqualTo( long value ) {
    return this.size <= value  // You might not need this util method
  }
}

然后在你的规则中你会有类似的东西

rule "size must be greater than 1 billion"
    when
        $typeMaster : TypeMaster ( typeIn( "CB1", "CB2" ) && codeIn( "123" ) ||
                                   typeIn( "B1", "B2" ) && codeIn( "234" ) &&
                                   sizeSmallerOrEqualTo( 1000000000  )
    then
        messageService.save(Type.ERROR, kcontext, $typeMaster);
end

我现在无法验证var args params在从Drools调用方法时是否有效,但如果失败则可以使用数组,多个参数等

另一种选择是覆盖TypeMaster中的getType()getCode(),使其直接返回值,而不是通过map获取它们。喜欢这个

class TypeMaster {
  Map values // this represents your key-value map
  getType() {
    return values.get( "type" )
  }
  getCode() {
    return values.get( "code" )
  }
  // getSize() similarly
}

在此之后,您的规则不会发生太大变化

rule "size must be greater than 1 billion"
    when
        $typeMaster : TypeMaster ( ( $type in ( "CB1", "CB2" ) && $code == "123" ) ||
                                   ( $type in ( "B1", "B2" ) && $code == "234" ) &&
                                     size <= 1000000000 )
    then
        messageService.save(Type.ERROR, kcontext, $typeMaster);
end

希望你能理解。