Hi all,

I am trying to insert some object, querying them and the retract them.
My question, when I query the inserted objects using defined "query",
it return 0 objects. But when I iterate over all objects in WM, the
objects are returned.

Any information is appreciated!

Files:
===================test.drl====================
package tests;
query "selectQuery"
      p : ClassP()
end
==================end of test.drl================

==================Test.java====================
package tests;

import java.io.*;
import java.io.InputStreamReader;
import org.drools.RuleBase;
import org.drools.RuleBaseFactory;
import org.drools.StatefulSession;
import org.drools.compiler.PackageBuilder;
import org.drools.QueryResult;
import org.drools.QueryResults;
import org.drools.FactHandle;
import java.util.Iterator;

public class Test {
    public static void main (String args[]) {
        try {
            Reader source = new
InputStreamReader(Test.class.getResourceAsStream("../test.drl"));
            final PackageBuilder builder = new PackageBuilder();
            builder.addPackageFromDrl(source);
            if (builder.hasErrors()) {
                System.out.println(builder.getErrors().toString());
                System.exit(0);
            }
            final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
            ruleBase.addPackage(builder.getPackage());
            final StatefulSession session = ruleBase.newStatefulSession();

            System.out.println("Inserting objects ...");
            for (int i = 0; i < 5; i ++) {
                session.insert(new ClassP(1, i));
            }
        
            System.out.println("Querying objects ...");
            QueryResults results = session.getQueryResults("selectQuery");
            System.out.println("ResultSize = " + results.size());
            
/***************************************************************************************
             Here, it reports results.size() is 0, and there should be
5 objects in WM right now. It is
             the place I got the question.

             I have no idea whether I am using the "query" correctly.
Anything wrong?
            
***************************************************************************************/
            for (Iterator it = results.iterator(); it.hasNext(); ) {
                final QueryResult result = (QueryResult) it.next();
                ClassP p = (ClassP) result.get("p");
                System.out.println("p(" + p.getFirst() + ", " + 
p.getSecond()+")");
            }

            System.out.println("Deleting ...");
            for (Iterator it = session.iterateFactHandles(); it.hasNext(); ) {
                FactHandle factHandle = (FactHandle) it.next();
                ClassP p = (ClassP) session.getObject(factHandle);
                System.out.println("p(" + p.getFirst() + ", " + 
p.getSecond()+")");
                session.retract(factHandle);
            }
            
/***************************************************************************************
             Here, it prints out: it is deleting p(1, 1), ... p(1, 5).
             It verifies that there are the 5 objects inserted.
            
***************************************************************************************/

            session.dispose();
        } catch (Exception e) {
            System.out.println(e);
            System.exit(0);
        }
    }

    public static class ClassP {
        private int first;
        private int second;
        public ClassP() {}
        public ClassP(int firstIn, int secondIn) {
            this.first  = firstIn;
            this.second = secondIn;
        }
        public int getFirst() {
            return this.first;
        }
        public int getSecond() {
            return this.second;
        }
    }
}
========================end of Test.java=====================

Thanks a lot,

-- 
Senlin Liang
_______________________________________________
rules-users mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/rules-users

Reply via email to