ok thanks, I reproduced the problem with the following below. If you change the String insertion order it works. I'll get this fixed over the weekend:
    @Test
    public void testQueryWithObject() throws Exception {
        String str = "" +
            "package org.drools.test  \n" +

            "import java.util.List\n" +
            "import java.util.ArrayList\n" +

            "global List list\n" +

            "dialect \"mvel\"\n" +
            "\n" +

            "import org.drools.integrationtests.BackwardChainingTest.Q\n" +
            "import org.drools.integrationtests.BackwardChainingTest.R\n" +
"import org.drools.integrationtests.BackwardChainingTest.S\n" +

            "query object(Object o)\n" +
            "    o := Object() \n" +
            "end\n" +

            "rule collectObjects when\n" +
            "   String( this == 'go1' )\n" +
            "   object( o; )\n" +
            "then\n" +
            "   list.add( o );\n" +
            "end\n" +


            "rule init when\n" +
            "   String( this == 'init' )\n" +
            "then\n" +
            " insert( new Q(1) );\n " +
            " insert( new Q(5) );\n " +
            " insert( new Q(6) );\n " +
            " insert( new R(1) );\n " +
            " insert( new R(4) );\n " +
            " insert( new R(6) );\n " +
            " insert( new R(2) );\n " +
            " insert( new S(2) );\n " +
            " insert( new S(3) );\n " +
            " insert( new S(6) );\n " +
            "end\n" +
            "";

KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
                          ResourceType.DRL );

        if ( kbuilder.hasErrors() ) {
            fail( kbuilder.getErrors().toString() );
        }

        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );

        kbase = SerializationHelper.serializeObject( kbase );

StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
        List<Integer> list = new ArrayList<Integer>();
        ksession.setGlobal( "list", list );

        ksession.insert( "go1" );
        ksession.fireAllRules();

        ksession.insert( "init" );
        ksession.fireAllRules();

        System.out.println( list );
    }

Mark
On 25/06/2011 11:22, Wolfgang Laun wrote:
// This rule prints all objects in WM.
rule findObject
when
    $o: Object()
then
    System.out.println( "Object: " + $o );
end

Happily I get
    Object: 42
    Object: a String object
    Object: org.drools.reteoo.InitialFactImpl@4dde85f0

Now the query way:
    query object( Object o )
        o := Object()
    end
    rule findObjectByQuery
    when
        object( $a ; )
    then
        System.out.println( "Object by query: " + $a );
    end

Surprisingly, I get just one:
    Object by query: org.drools.reteoo.InitialFactImpl@4dde85f0

A marvellous effect can be observed when the condition in rule
findObjectByQuery is modified to
    when
        Object()
        object( $a ; )
    then
I'd have guessed that the above result would appear repeatedly, once for each Object in WM, but that's not so. For N-1 facts the rule fires N*(N+1)/2 times, showing the "initial object" N times, the first inserted object N-1 times, the second one N-2 times and, finally, the last one
once.
Object by query: 42
Object by query: org.drools.reteoo.InitialFactImpl@4dde85f0
Object by query: a String object
Object by query: 100
Object by query: 42
Object by query: org.drools.reteoo.InitialFactImpl@4dde85f0
Object by query: a String object
Object by query: org.drools.reteoo.InitialFactImpl@4dde85f0
Object by query: a String object
Object by query: org.drools.reteoo.InitialFactImpl@4dde85f0

-W


_______________________________________________
rules-dev mailing list
rules-dev@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-dev

_______________________________________________
rules-dev mailing list
rules-dev@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-dev

Reply via email to