0

在 drool 中,当我使用事实执行无状态会话时,我们可以选择查找规则中所有条件元组满足的内容。

例如:如果我们在规则 RUL1 中有规则条件,car.schi == 'A' || car.carKind str[startsWith] 'A'

如果因为 car.schi 而满足 RUL1,那么我们是否有任何 API 可以获取此信息(car.schi)。

我给出的示例比较简单,但我们的实际业务规则非常复杂,如下所示,

|| car.schi 包含 \"CM\" || car.schi 包含 \"DW\" || car.schi 包含 \"PB\") && (validateElementRule($trainrulesRequestDTO.getElementRuleMap(),\"1_N\",true,$trainrulesRequestDTO.getCar().getCarNumb()))))) && (((car.prevSchi不包含 \"N2\" && car.prevSchi 不包含 \"N1\") && (car.prevLoadEmpty == \"L\") && ((car.prevCarKind str[startsWith] \"F\" || car .prevCarKind str[startsWith] \"YF\") && (car.prevCarKind not str[startsWith] \"FI\" && car.prevCarKind not str[startsWith] \"FA\" && car.prevCarKind not str[startsWith] \"FW\" && car.prevCarKind not str[startsWith] \"FB\") && (car.prevCarKind != \"YFB\"))) || ((car.

如果我们要将其拆分为不同的规则以查找是否满足规则是因为 (prevCarKind , prevSchi , prevLoadEmpty) 或 (nextCarKind, nextSchi,nextLoadEmpty) 拆分复杂规则太难了。

我还给出了规则条件作为从我们的 UI 应用程序中获取的图像。 上述规则条件字符串的图形视图 如果有人可以让我们知道如何根据哪个条件查找是否满足上述条件,将会很有帮助。

问候, Madhankumar。乙

谢谢,马丹

4

2 回答 2

0

不,你不能。但是您可以将规则拆分为多个规则,如下所示:

rule "RUL1A"
when
    car.schi == 'A'
then
    ...
end

rule "RUL1B"
when
    car.carKind[0] == 'A'
then
   ...
end
于 2018-11-29T18:37:35.930 回答
0

您可以将您的条件拆分为几个函数(并在 drl 中定义它们):

function boolean isKindEzzEngEtd(Car car) {
    return car.carKind in ["EZZ", "ENG", "ETD"];
}

function boolean isSchiContainsN1N2(Car car) {
    return (car.schi contains "N1" || car.schi contains "N2");
}

...

then use the functions inside your rules (it also improves readablility and re-use):

rule "RUL1"
when
   $car: Car() 
   !isKindEzzEngEtd($car) || isSchiContainsN1N2($car) && ...
then
    -- call the functions one by one to find out which one returned true:
    System.out.println("NOT isKindEzzEngEtd: " + !isKindEzzEngEtd($car));
    System.out.println("isSchiContainsN1N2: " + isSchiContainsN1N2($car));    
end
于 2018-12-01T17:18:06.377 回答