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 <mproctor(a)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(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-dev