【问题标题】:Need to add multiple items in list - decision table - Drools需要在列表中添加多个项目 - 决策表 - Drools
【发布时间】:2020-09-17 16:59:29
【问题描述】:

我需要在drools 决策表中为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"
         }
    }

我的决策表看起来像

任何人请建议达到预期的反应?

【问题讨论】:

    标签: java object arraylist jboss drools


    【解决方案1】:

    表格中的每一行都成为规则,每个操作列都成为 then 块中的一行。
    对于每条规则,您需要一个语句来创建主题、填充它的语句以及将其添加到匹配学生的语句。
    需要“CREATE”和“COLLECT”中的值,否则将跳过操作。
    在没有“目标对象”的单元格中需要;,并且在提供“$subject”和“$student”时不需要它' 对象。不要问我为什么。刚刚分析了生成的drl。
    您可能想要隐藏两个“技术专栏”。

    这将生成如下两条规则

    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:我正在努力解决 " 被 Calc 编辑器自动替换为 `` 这对于 drools 解析器来说是无效符号,所以我使用了单引号,这似乎是单元格开头的特殊符号编辑并跳过。所以最终对我有用的实际单元格值是''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]]
    

    【讨论】:

    • 谢谢@Mykhaylo。我试过你的解决方案。我仍然只得到最后一个规则值。我需要将它添加为数组列表,正如我之前在 (subjectList) 中提到的那样。您能就此提出建议吗?
    • 我添加了我拥有的所有来源,你是说你已经按照要求编辑了表格吗?请告诉我你的表生成的规则。
    • 是的@Mykhaylo。我按照您的建议更新了决策表。在您提到的上述解决方案中,将单个对象主题添加到学生事实。这对我有用!我的要求是需要将主题列表添加到学生事实。从上面提到的例子我得到这个结果: { "id":123, "name": "xyz", "subject": { "id": 6, "name":"Hindi" } }
    • 您能否就上述评论提出建议?还有一件事你能建议我在决策表中创建变量的可能方法吗?如果可能的话。
    • 每个表格行添加一个主题,由于有 2 个匹配行,您的学生应该有根据表格数据填充的 2 个主题列表,不确定您在问什么
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2013-03-05
    • 1970-01-01
    相关资源
    最近更新 更多