2017-03-02 105 views
0

我有大量的几乎重复的规则来实现。他们是完全一样的,但右侧略有不同。例如是否可以使用指定的参数集扩展规则或将参数传递到Drools中的规则?

rule "AS77" extends "IVD01" 
    @description(" IF Individual Identifier = E, THEN Other Description is required. ") 
    when 
    $source : Owner($errCode : "427") 
    then 
end 

rule "AS78" extends "IVD01" 
    @description(" IF Individual Identifier = E, THEN Other Description is required. ") 
    when 
    $source : JntOwner($errCode : "428") 
    then 
end 

rule "IDV01" 
    @description("IF Individual Identifier = E, THEN Other Description is required. ") 
    when 
    IDVerify(idType == "E", otherDscrp == null) from $source 
    then 
    _reject.getErrorCode().add($errCode.toString()); 
end 

我想做类似上面的事情,但我知道我不能,因为“$ source”在子规则中。我也知道我不能切换它,并且使条件扩展其他规则的规则,因为Drools规则只能扩展另一个规则。在java中我会做一个方法,如

static void evalIdVerify(IDVerify idv, String errorCode) { 
    if ("E".equals(idv.getIdType()) && idv.getOtherDescript() == null) { 
    _reject.getErrorCode().add(errorCode); 
    } 
} 

并根据需要使用它。有什么办法可以编写一个可以像方法一样调用并接受参数的规则吗?或者一些其他解决方案不只是一遍又一遍地写同样的规则?我无法控制这些类,这些规则每年都会由第三方修改,所以为了可维护性,我真的很希望它们只能定义一次。任何帮助,将不胜感激。谢谢。

回答

0

但是你可以“切换它”。所有你需要做的就是插入IDVerify对象作为一个事实。

rule "IDV01" 
    @description("IF Individual Identifier = E, THEN Other Description is required. ") 
when 
    $id: IDVerify(idType == "E", otherDscrp == null) 
then 
end 

rule "IDV01 for Owner" extends "IVD01" 
when 
    $source: Owner($errCode : "427", id == $id) 
then 
    _reject.getErrorCode().add($errCode.toString()); 
end 

另一种选择是将其写为每个检查一个规则:

rule "IDV01 for Owner" 
when 
    $source: Owner($errCode : "427", 
       $id.idType == "E", $id.otherDscrp == null) 
then 
    _reject.getErrorCode().add($errCode.toString()); 
end 

你可以把IDVerify考不上布尔函数或静态方法,减少重复的代码量。

+0

谢谢,我已经尝试了第一个解决方案,但它不适合我,因为我不小心只插入了IDVerify对象。一旦我插入Owner和JntOwner对象,它就起作用了。 – maxl