Необходимо добавить несколько элементов в список - таблица решений - Drools - PullRequest
0 голосов
/ 30 мая 2020

Мне нужно создать новый множественный экземпляр объектов для класса Pojo в таблице решений слюни. Я реализовал, используя два факта Студенческий факт и предметный факт класса. Мне нужно запустить все правила в таблице решений, и мне нужно добавить все значения в список массивов объектов. Но я получаю только значения последних правил таблицы решений. Похоже, что значения таблицы решений переопределяются.

Факт 1

Class StudentFact{

 private int id;
 private String name;
 private List<SubejctFact> subjectList;

 public void setId(int id){
    this.id = id;
 }

 public int getId(){
    return id;
 } 

 public void setName(String name){
    this.Name = name;
 }    

 public String getName(){
    return name;
 }

     public void setSubjectList(List<Subject> subjectList) {
        this.subjectList = subjectList;
    }



    public int getSubjectList() {
        return subjectList;
    }




}

Факт 2

Class SubjectFact{
 private int subId;
 private String subjectName;

 public void setSubId(int subId){
     this.subId= subId;
 }

 public int getSubId(){
   return subId;
 }

 public void setSubjectName(String subjectName){
      this.subjectName = subjectName;
 }

 public int getSubejctName(){
      return subjectName;
 }

}

Текущий ответ

{
  "id":123,
  "name": "xyz",
  "subjectList": [
     { 
        "id": 6,
        "name":"Hindi"
     },
     {
        "id": 6,
        "name":"Hindi"
     }
}

Ожидаемый ответ

 {
      "id":123,
      "name": "xyz",
      "subjectList": [
         { 
            "id": 5,
            "name":"English"
         },
         {
            "id": 6,
            "name":"Hindi"
         }
    }

Моя таблица решений выглядит как

enter image description here

Кто-нибудь, пожалуйста, посоветуйте достичь ожидаемого ответа?

1 Ответ

1 голос
/ 01 июня 2020

Каждая строка в таблице становится правилом, каждый столбец действия становится строкой в ​​затем блоке.
Для каждого правила вам нужен оператор для создания темы, операторы для его заполнения и оператор для добавления его к соответствующему ученику.
Значения в 'CREATE' и 'COLLECT' необходимы, в противном случае действие будет пропущено.
; требуется в ячейке без 'target object' и не требуется, когда вы указываете '$ subject' и ' Объекты $ student. Не спрашивайте меня почему. Только что проанализировал сгенерированный drl.
Вы можете скрыть две «технические строки».

enter image description here

Это сгенерирует два правила, как показано ниже

package draft;
//generated from Decision Table
import draft.Student;
import draft.Subject;
// rule values at A9, header at A4
rule "Rule 1"
    when
        $student:Student(id == "123")
    then
        Subject $subject = new Subject();
        $subject.setSubId(5);
        $subject.setSubjectName('English');
        $student.addSubject($subject);
end

// rule values at A10, header at A4
rule "Rule 2"
    when
        $student:Student(id == "123")
    then
        Subject $subject = new Subject();
        $subject.setSubId(6);
        $subject.setSubjectName('Hindi');
        $student.addSubject($subject);
end

PS: Я боролся с тем, что " автоматически заменяется редактором Cal c на `` который не был допустимым символом для парсера слюни, поэтому я использовал одинарные кавычки, которые оказались специальным символом на начало ячейки в редакторе и пропущено. Итак, фактическое значение ячейки, которое, наконец, сработало для меня, было ''English'.

Вот мои модели

public class Student {
    private int id;
    private String name;
    private List<Subject> subjectList = new ArrayList<>();

    public Student(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getId() {
        return id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void addSubject(Subject subject) {
        subjectList.add(subject);
    }

    public void setSubjectList(List<Subject> subjectList) {
        this.subjectList = subjectList;
    }

    public List<Subject> getSubjectList() {
        return subjectList;
    }
}

public class Subject {
    private int subId;
    private String subjectName;

    public void setSubId(int subId) {
        this.subId = subId;
    }

    public int getSubId() {
        return subId;
    }

    public void setSubjectName(String subjectName) {
        this.subjectName = subjectName;
    }

    public String getSubejctName() {
        return subjectName;
    }
}

тест

@DroolsSession(resources = "draft/ApplicableSubjects.xls",
        builderProperties = "drools.dump.dir = target/dump")
public class PlaygroundTest {

    @Rule
    public DroolsAssert drools = new DroolsAssert();

    @Test
    public void testIt() {
        drools.insertAndFire(new Student(123, "Student 123"));
        drools.printFacts();
    }
}

тестовый результат

00:00:00 --> inserted: Student[id=123,name=Student 123,subjectList=[]]
00:00:00 --> fireAllRules
00:00:00 <-- 'Rule 1' has been activated by the tuple [Student]
00:00:00 <-- 'Rule 2' has been activated by the tuple [Student]
00:00:00 Facts (1):
Student[id=123,name=Student 123,subjectList=[draft.Subject@1ded7b14, draft.Subject@29be7749]]
...