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

Reply via email to