Hi Sudhir,
What you need is an accumulate. I recommend you to read documentation about
it.
I've attached a test case of your scenario.
Best,
---------- Forwarded message ----------
From: Sudhir M <[email protected]>
Date: Wed, Jan 6, 2010 at 5:04 AM
Subject: [rules-users] doubt in using collections and nested objects
To: [email protected]
Hi All,
I have a scenario which is similar to the one detailed below
There is a class Student and each students has a list of subjects.
Each subject has a name and a flag which is an indicator of pass or
failure.
Now how can I write a rule which tells me if there are atleast 10
students who failed in a subject maths.
Thanks
sudhir.
_______________________________________________
rules-users mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/rules-users
--
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Esteban Aliverti
package org.drools.user.test;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderError;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.io.ResourceFactory;
import org.drools.runtime.StatefulKnowledgeSession;
import org.drools.runtime.rule.FactHandle;
import org.drools.util.FileManager;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
public class StudentCollectionTest {
FileManager fileManager;
@Before
public void setUp() throws Exception {
fileManager = new FileManager();
fileManager.setUp();
}
@After
public void tearDown() throws Exception {
fileManager.tearDown();
}
public class Student {
private String name;
private List<Subject> subjects = new ArrayList<Subject>();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Subject> getSubjects() {
return subjects;
}
public void setSubjects(List<Subject> subjects) {
this.subjects = subjects;
}
public boolean addSubject(Subject e) {
return subjects.add(e);
}
}
public class Subject {
private String name;
private boolean passed;
public Subject(String name, boolean passed) {
this.name = name;
this.passed = passed;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isPassed() {
return passed;
}
public void setPassed(boolean passed) {
this.passed = passed;
}
}
@Test
public void test() throws Exception {
String header1 = "";
header1 += "package org.drools.user.test\n";
header1 += "import java.util.List\n";
header1 += "import org.drools.user.test.StudentCollectionTest.*\n";
header1 += "global List list\n\n";
String rule1 = "";
rule1 += "rule TwoOrMoreStudentsWhoFailedMath\n";
rule1 += "when\n";
rule1 += "\t$match:List(size >= 2) from accumulate(\n";
rule1 += "\t\t$student:Student($subjects:subjects) AND\n";
rule1 += "\t\tSubject(name==\"Math\", passed == false) from $subjects,\n";
rule1 += "\t\tcollectList($student)\n";
rule1 += "\t)\n";
rule1 += "then\n";
rule1 += "list.addAll($match);\n";
rule1 += "end\n";
System.out.println("rule1= \n"+rule1+"\n\n");
File f1 = fileManager.newFile("rule1.drl");
Writer output = new BufferedWriter(new FileWriter(f1));
output.write(header1);
output.write(rule1);
output.close();
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newFileResource(f1), ResourceType.DRL);
if (kbuilder.hasErrors()) {
for (KnowledgeBuilderError error : kbuilder.getErrors()) {
System.err.println(error);
}
fail("Could not parse knowledge.");
}
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
List<Student> list = new ArrayList<Student>();
ksession.setGlobal("list", list);
//insert two Student instances
Student s1 = new Student();
s1.setName("Robert");
s1.addSubject(new Subject("Math", true));
s1.addSubject(new Subject("Literature", false));
Student s2 = new Student();
s2.setName("Paul");
s2.addSubject(new Subject("Math", false));
s2.addSubject(new Subject("Literature", false));
FactHandle s1FH = ksession.insert(s1);
FactHandle s2FH = ksession.insert(s2);
ksession.fireAllRules();
//the rule was never activated
assertEquals(0, list.size());
//now, Robert fails Math!!
s1.setSubjects(new ArrayList<Subject>());
s1.addSubject(new Subject("Math", false));
s1.addSubject(new Subject("Literature", false));
ksession.update(s1FH, s1);
ksession.fireAllRules();
assertEquals(2, list.size());
ksession.dispose();
}
}
_______________________________________________
rules-users mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/rules-users