Проблема слюней, почему слюни видят только мое первое правило? - PullRequest
1 голос
/ 11 февраля 2020

Мне нужна помощь с слюнями. Проблема заключается в том, что когда я запускаю приложение (что обычно делается весной) и когда я пытаюсь запустить все правила, запускается только первое правило, а другие правила не могут быть запущены.

Это мой drl файл с некоторыми моими 3 правилами.

    package drools.medicine

import com.example.demo.model.Pacijent;
import com.example.demo.model.Lek;
import com.example.demo.model.SastojakLeka;
import com.example.demo.model.Pregled;
import com.example.demo.model.ValidacijaDiagnoze;
import java.util.List;
import java.util.Set;
import java.util.HashSet;



rule "test-rule"
   agenda-group "alergija"
   when
       $vd: ValidacijaDiagnoze()
   then
       System.out.println("TEEEST!!!");
end



rule "Alergic-on-medicine"
    agenda-group "alergija"
    when
        $v: ValidacijaDiagnoze()
        $pregled: Pregled($prepisaniLek: prepisanLek)
        $lek: Lek() from $prepisaniLek
        $pacijent: Pacijent(alergicanNaLek($lek))
    then
        System.out.println("Pacijent je alergican na lek: "+ $lek.getNazivLeka());
        modify( $v ){
            setValid(false),
            setMessage("PATIENT IS ALLERGIC!")
        }
end


rule "Alergic-on-ingredient"
    agenda-group "alergija"
    lock-on-active
    when
        $v: ValidacijaDiagnoze()
        $pregled: Pregled($prepisaniLek: prepisanLek)
        $lek: Lek($sastojci: sastojak) from $prepisaniLek
        $sastojak: SastojakLeka() from $sastojci
        $pacijent: Pacijent(alergicanNaSastojak($sastojak))
    then
        System.out.println("Pacijent je alergican na sastojak " + $sastojak.getNazivSastojka());
        modify( $v ){
            setValid(false),
            setMessage("PATIENT IS ALLERGIC ON INGREDIENT!")
        }
end

Ниже я вызываю kieSession для запуска всех правил.

// Take medicine(and ingredient) and decide throw rules are they ok or not.
    @CrossOrigin(origins = "http://localhost:3000")
    @PostMapping(value = "/validation")
    public ResponseEntity<?> validateDiagnosis(@RequestBody PregledDto pregledDto){

        //TO DO--   
        KieSession kieSession = kieContainer.getKieBase("MedicineBase").newKieSession();


        //initial state, witch can be changed in rules if patient is allergic
        ValidacijaDiagnoze vd = new ValidacijaDiagnoze();
        vd.setMessage("PATIENT IS NOT ALLERGIC");
        vd.setValid(true);


        FactHandle fact;
        fact =  kieSession.insert(vd);
        kieSession.getAgenda().getAgendaGroup("alergija").setFocus();
        System.out.println("Number of fired rules: "+ kieSession.fireAllRules()); // 1
        kieSession.dispose();

        return new ResponseEntity<>(vd, HttpStatus.OK);

    }

И мой файл kmodule находится в папке META-INF.

<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <kbase name="DiagnosisBase" packages="drools.diagnosis">
        <ksession name="diagnosis" />
    </kbase>

    <kbase name="DiagnosisBase2" packages="drools.diagnosis2">
        <ksession name="diagnosis2" />
    </kbase>

    <kbase name="MedicineBase" packages="drools.medicine">
        <ksession name="medicine" />
    </kbase>

</kmodule>

Result in eclipse console.

Помогите мне решить проблему Я новичок в использовании слюней.

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

1 Ответ

1 голос
/ 11 февраля 2020

Число, возвращаемое методом kieSession.fireAllRules(), - это число правил, которые фактически соответствуют и были выполнены механизмом Drools. Если левая часть правила (предложение «когда») не соответствует входным данным, оно не соответствует и не будет выполнено.

В приведенных примерах правил тестовое правило проверяет только наличие наличие ValidacijaDiagnoze в рабочей памяти. Два других правила требуют, чтобы ValidacijaDiagnoze включал дочерние элементы (экземпляр Lek или SastojakLeka), а также экземпляр Pacijent также в рабочей памяти.

Однако в коде, который запускает правила, в рабочую память добавляется только ValidacijaDiagnoze, например:

ValidacijaDiagnoze vd = new ValidacijaDiagnoze();
vd.setMessage("PATIENT IS NOT ALLERGIC");
vd.setValid(true);

Поскольку этот экземпляр не связан с Lek или SastojakLeka, он не будет запускать другие правила , Кроме того, поскольку в рабочей памяти нет Pacijent, эти другие правила также не сработают.

Следовательно, поскольку только первое правило может вызвать, fireAllRules возвращает 1 потому что это количество правил, которые фактически выполняются.

...