Правило слюни не оценивается, предыдущие правила работают нормально - PullRequest
1 голос
/ 26 апреля 2019

У меня есть правила drools, где я сравниваю числовые значения из java-объекта с числом в правиле, и, если правило истинно, счетчик, который находится в java-объекте, увеличивается. Наконец, если счетчик превышает определенное число, следует выполнить другое правило. Это последнее правило никогда не оценивается.

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

Когда я изменяю правило для оценки на true, когда счетчик равен 0, оно оценивается как true.

Кажется, он принимает значение, с которым был создан экземпляр.

Мой Java-объект выглядит так (упрощенно):

public class CTDSIRSNotification {

    private double temperature;
    private double heartRate;
    private double respRate;
    private double paCo2;
    private double wbCellCount;
    private double immatureBand;

    private double counter;


    public CTDSIRSNotification(double temperature, double heartRate, double respRate, double paCo2, double wbCellCount, double immatureBand) {
        this.temperature = temperature;
        this.heartRate = heartRate;
        this.respRate = respRate;
        this.paCo2 = paCo2;
        this.wbCellCount = wbCellCount;
        this.immatureBand = immatureBand;
    }
//getters and setters
}

вот мои правила:

rule "temperature"
    when
    $n1 : CTDSIRSNotification( temperature > 38 || temperature < 36 )
    then
    $n1.setCounter($n1.getCounter()+1);
    System.out.println($n1.getCounter()+", temperature");
end

rule "respRateAndPaCo2"
    when
    $n1 : CTDSIRSNotification( respRate > 20 || paCo2 < 32 )
    then
    $n1.setCounter($n1.getCounter()+1);
    System.out.println($n1.getCounter()+", respRateAndPaCo2");
end

rule "wbCellCountAndimmatureBand"
    when
    $n1 : CTDSIRSNotification( wbCellCount > 12000 || wbCellCount < 4000 || immatureBand > 10 )
    then 
    $n1.setCounter($n1.getCounter()+1);
    System.out.println($n1.getCounter()+", wbCellCountAndimmatureBand");
end 

rule "sirsNotification"
    when
    $n1 : CTDSIRSNotification( counter >= 3 )
    then 
    System.out.println($n1.getCounter()+", Alert for SIRS");
end

и вывод показывает, что счетчик увеличивается:

1.0, temperature
2.0, respRateAndPaCo2
3.0, wbCellCountAndimmatureBand

когда я изменяю последнее правило для проверки на 0:

rule "sirsNotification"
    when
    $n1 : CTDSIRSNotification( counter >= 0 )
    then 
    System.out.println($n1.getCounter()+", Alert for SIRS");
end

значение равно true, хотя счетчик, если напечатано, равен 3:

1.0, temperature
2.0, respRateAndPaCo2
3.0, wbCellCountAndimmatureBand
3, Alert for SIRS

Проблема в том, что я не могу проверить переменные, которые меняются во время выполнения правил?

1 Ответ

2 голосов
/ 26 апреля 2019

Вам нужно вызвать метод update из ваших правил, который увеличивает счетчик.Это заставляет механизм правил осознавать, что факт был изменен.Поэтому правила, которые зависят от этого факта, должны быть переоценены.

rule "temperature"
    when
    $n1 : CTDSIRSNotification( temperature > 38 || temperature < 36 )
    then
    $n1.setCounter($n1.getCounter()+1);
    System.out.println($n1.getCounter()+", temperature");
    update($n1);
end

rule "respRateAndPaCo2"
    when
    $n1 : CTDSIRSNotification( respRate > 20 || paCo2 < 32 )
    then
    $n1.setCounter($n1.getCounter()+1);
    System.out.println($n1.getCounter()+", respRateAndPaCo2");
    update($n1);
end

rule "wbCellCountAndimmatureBand"
    when
    $n1 : CTDSIRSNotification( wbCellCount > 12000 || wbCellCount < 4000 || immatureBand > 10 )
    then 
    $n1.setCounter($n1.getCounter()+1);
    System.out.println($n1.getCounter()+", wbCellCountAndimmatureBand");
    update($n1);
end 

rule "sirsNotification"
    when
    $n1 : CTDSIRSNotification( counter >= 3 )
    then 
    System.out.println($n1.getCounter()+", Alert for SIRS");
end
...