是否可以使用一组指定的参数扩展规则或将参数传递到 Drools 中的规则中?

is it possible to extend a rule using a specified set of parameters or pass parameters into a rule in 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);
  }
}

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

但是你可以"switch it around"。您需要做的就是将 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测试放入布尔函数或静态方法中,减少代码重复量。