我正在尝试在 Drools 中创建一个规则,该规则会根据假设的学生获得全优而触发。
import Student
import Semester
import java.util.*
dialect "mvel"
rule "straight As1"
when
$s : Student(
grades != null,
$g : grades
)
forall(
Semester(reading == "A", writing == "A", math == "A") from $g
)
then
System.out.println($s.getId() + ": s all As1: " + $s);
System.out.println($s.getId() + ": g all As1: " + $g);
end
rule "straight As2"
when
$s : Student(
grades != null,
$g : grades
)
$a : List(size() == $g.size) from
collect (Semester(reading == "A", writing == "A", math == "A") from $g)
then
System.out.println($s.getId() + ": s all As2: " + $s);
System.out.println($s.getId() + ": g all As2: " + $g);
end
这个的输出:
001: s all As1: Student{id='001', grades=[{writing=A, reading=A, math=A}, {writing=A, reading=A, math=A}], name='Albert'}
001: g all As1: [{writing=A, reading=A, math=A}, {writing=A, reading=A, math=A}]
----------------
002: s all As1: Student{id='002', grades=[{writing=B, reading=B, math=B}], name='Bob'}
002: g all As1: [{writing=B, reading=B, math=B}]
这里的问题是 Bob 没有 All As。我不知道如何让任何一个straight As
规则为 Albert 而不是 Bob 触发 -As1
尝试触发所有内容,而As2
尝试不会触发任何内容。
我已经能够编写规则来根据名称进行过滤。在调试时,我已经在getGrades()
触发器上设置了断点......但是没有断点在getMath()
,getWriting()
或者getReading()
被击中。
学生对象(收紧并删除 toString() )是:
public class Student {
private String id;
private List<Semester> grades;
private String name;
public Student() { }
public String getName() { return name; }
public String getId() { return id; }
public List<Semester> getGrades() { return grades; }
public void setName(String name) { this.name = name; }
public void setId(String id) { this.id = id; }
public void setGrades(List<Semester> grades) { this.grades = grades; }
}
相应的 Semester 对象(也收紧并删除了 toString() ):
public class Semester {
private String reading;
private String writing;
private String math;
public Semester() { }
public String getReading() { return reading; }
public String getWriting() { return writing; }
public String getMath() { return math; }
public void setReading(String reading) { this.reading = reading; }
public void setWriting(String writing) { this.writing = writing; }
public void setMath(String math) { this.math = math; }
}
这些对象是用代码片段实例化的:
YamlReader reader = new YamlReader(new FileReader(file));
Student student = reader.read(Student.class);
System.out.println(student.toString());
rv.add(student);
和一个 yaml 对象,例如:
id:
001
grades:
-
reading: A
writing: A
math: A
-
reading: A
writing: A
math: A
name:
Albert