Правила слюни: Арифмети c Операции - PullRequest
0 голосов
/ 16 марта 2020

Я пытаюсь написать простое правило. Выполнить набор расчетов. Я понимаю, что вычисления могут быть выполнены с помощью функций. Но бизнес логика c включает в себя расчеты.

package com.sample.rules
import com.sample.rules.Test
rule "Calculate"
    when
        Test(calculate == true)
    then
        finalValue = Test(InitialValue) + 10;
        Test.setFinalValue(finalValue)
        System.out.println("FinalValue=" + Test.getFinalValue();
end

Файл класса с переменной

public class Test {
    private int finalValue;
    private int initialValue;
    private boolean calculate;


    public int getFinalValue() {
        return FinalValue;
    }
    public void setFinalValue(int FinalValue) {
        this.FinalValue = FinalValue;
    }
    public int getInitialValue() {
        return InitialValue;
    }
    public void setInitialValue(int InitialValue) {
        this.InitialValue = InitialValue;
    }

    public boolean isCalculate() {
        return calculate;
    }
    public void setCalculate(boolean calculate) {
        this.calculate = calculate;
    }
}

Файл приложения, как показано ниже

public class CalculationApp {
    public static void main(String[] args) {        
         System.out.println( "Bootstrapping the Rule Engine ..." );       
            KieServices ks = KieServices.Factory.get();
            KieContainer kContainer = ks.getKieClasspathContainer();
            KieSession kSession =  kContainer.newKieSession("ksession-rules");

            Test test = new Test();
            test.setInitialValue(20);
            test.setCalculate(true);
            kSession.insert(test);

            int fired = kSession.fireAllRules();
            System.out.println( "Number of Rules executed = " + fired );           
    }
}

Файл правила выдает ошибку:

Rule Compilation error finalValue cannot be resolved to a variable
Cannot make a static reference to the non-static method getInitialValue() from the type Test
finalValue cannot be resolved to a variable
Cannot make a static reference to the non-static method getFinalValue() from the type Test

Пока я нашел ответ методом проб и ошибок: я пытаюсь понять логику c позади него. Я имею в виду, Назначение variable (я понимаю, что переменная имеет другое значение) / assignment в условии when понятно, но то же самое, что и работа части Then. Я имею в виду, item.setFinalValue(...) часть.

Ответы [ 2 ]

1 голос
/ 16 марта 2020

В вашем правиле есть несколько проблем, о чем свидетельствует ошибка.

Ошибка компиляции правила finalValue не может быть разрешена в переменной

finalValue не может быть разрешена в переменной

Первая проблема заключается в том, что вы никогда не объявляете finalValue, просто пытаетесь присвоить его с правой стороны. Чтобы это исправить, просто объявите finalValue. Предполагая, что это целое число:

int finalValue = ...

Это идентично тому, как это работает в Java.

Однако, учитывая, как выглядит оригинальное правило, я думаю, что вы пытаетесь вытянуть начальное значение из тестового объекта. Чтобы сделать это, вы должны сделать что-то вроде этого:

rule "Calculate"
when
  Test( calculate == true,
        $initialValue: initialValue ) // assign the $initialValue variable
then
  int finalValue = $initialValue + 10; // set finalValue by adding 10 to $initialValue

Невозможно сделать stati c ссылку на нестатический c метод getInitialValue () из типа Test

Невозможно сделать статическую c ссылку на нестатический c метод getFinalValue () из типа Test

Обе эти ошибки указывают на то, что вы пытаетесь вызвать методы экземпляра без экземпляра объекта. Это снова то же самое, что и в Java, где, если у вас есть метод экземпляра, вы должны вызывать его для экземпляра.

Предполагая, что это методы класса Test, вы изменили бы свое правило на быть:

package com.sample.rules
import com.sample.rules.Test

rule "Calculate"
when
  $test : Test( calculate == true,
                $initialValue: initialValue )
then
  int finalValue = $initialValue + 10;
  $test.setFinalValue(finalValue); // call against $test instance
  System.out.println("FinalValue=" + $test.getFinalValue()); // you were also missing a parenthesis
end
0 голосов
/ 16 марта 2020

То, что сработало, было:

rule "Calculate"
    when
        item: Test(calculate == true)
    then        
        item.setFinalValue(item.getInitialValue() + 10)
        System.out.println("FinalValue=" + item.getFinalValue();
end
...