I saw a commit and tried again, but the problem is still around. I added a test to BackwardChainingTest - see the pull request.
-W On 25 June 2011 14:10, Mark Proctor <mproc...@codehaus.org> wrote: > ** > I have isolated the issue and know what it is, and why it works one way and > not the other. In short on unification if the variable is unbound we need to > turn off indexing for that specific join attempt. We do this when it's left > triggered, we don't do this when it's right triggered. Updated the code to > also do this on right triggering. Should have it fixed tonight. > > Thanks > > Mark > > On 25/06/2011 12:38, Mark Proctor wrote: > > 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 > listrules-dev@lists.jboss.orghttps://lists.jboss.org/mailman/listinfo/rules-dev > > > > _______________________________________________ > rules-dev mailing > listrules-dev@lists.jboss.orghttps://lists.jboss.org/mailman/listinfo/rules-dev > > > > _______________________________________________ > 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