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代码并更改硬编码变量。你能建议吗?
答案 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
希望你能理解。