Чтобы найти, что все условие условие является истинным в правиле - PullRequest
0 голосов
/ 21 ноября 2018

В drool у нас есть возможность найти, что все кортежи условий удовлетворяют правилу, когда я выполняю сеанс без состояния с фактом.

ex: если у нас есть условие правила в правиле RUL1, car.schi== 'A' ||car.carKind str [setsWith] 'A'

, если RUL1 удовлетворен из-за car.schi, то есть ли у нас API, где я могу получить эту информацию (car.schi).

Пример, который я привел, был проще, но наше действительное бизнес-правило было настолько сложным, как показано ниже,

(car.carKind! = \ "EZZ \" && car.carKind! = \ "ENG \" && car.carKind! = \ "ETD \") && ((car.schi содержит \ "N1 \" || car.schi содержит \ "N2 \") || ((car.schi содержит \ "IH \" || car.schi содержит \ "N4 \" || car.schi содержит \ "OM \" || car.schi содержит \ "DA \" || car.schi содержит \ "N5 \" || car.schi содержит \ "PA \""|| car.schi содержит \" FG \ "|| car.schi содержит \" PL \ "|| car.schi содержит \" PC \ "|| car.schi содержит \" PO \ "|| car.schiсодержит \ "NG \" || car.schi содержит \ "OX \" || car.schi содержит \ "OP \" || car.schi содержит \ "NS \" || car.schi содержит \ "FS \"|| car.schi содержит \ "FL \" || car.schi содержит \ "N3 \" || car.schi содержит \ "CM \" || car.schi содержит \ "DW \" || car.schi содержит\ "PB \") && (validateElementRule ($ trainrul)esRequestDTO.getElementRuleMap (), \ "1_N \", true, $ trainrulesRequestDTO.getCar (). getCarNumb ())))) && (((car.prevSchi не содержит \ "N2 \" && car.prevSchi не содержит \ "N1 \ ") && (car.prevLoadEmpty == \" L \ ") && ((car.prevCarKind str [startWith] \" F \ "||car.prevCarKind str [setsWith] \ "YF \") && (car.prevCarKind не str [arsWith] \ "FI \" && car.prevCarKind не str [начат с] \ "FW \" && car.prevCarKind не str [начинается с] \ "FB \") && (car.prevCarKind! = \ "YFB \"))) ||((car.nextSchi не содержит \ "N2 \" && car.nextSchi не содержит \ "N1 \") && (car.nextLoadEmpty == \ "L \") && ((car.nextCarKind str [startWith] \ "F\ "|| car.nextCarKind, стрне str [arsWith] \ "FI \" && car.nextCarKind не str [startWith] \ "FW \") && (car.nextCarKind! = \ "Y \" || car.nextCarKind! = \ "YFB \"))))

Если мы хотим разделить его на различные правила, чтобы определить, было ли оно выполнено из-за (prevCarKind, prevSchi, prevLoadEmpty) или (nextCarKind, nextSchi, nextLoadEmpty), было бы слишком сложно разделитьсложное правило.

Я также дал условие правила, как изображение взято из нашего пользовательского интерфейса приложения. Графическое представление приведенной выше строки условия правила Было бы полезно, если бы кто-то мог сообщить нам о том, как определить, удовлетворяется ли вышеприведенное условие в зависимости от того, на каком условии.B

Спасибо, Мадхан

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Вы можете разделить ваше условие на несколько функций (и определить их в 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
0 голосов
/ 29 ноября 2018

Нет, ты не можешь.Но вы можете разделить правило на несколько правил следующим образом:

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

rule "RUL1B"
when
    car.carKind[0] == 'A'
then
   ...
end
...