[rules-dev] Locating objects by query/BC

Wolfgang Laun wolfgang.laun at gmail.com
Mon Jun 27 09:44:06 EDT 2011


Did you apply the pull request - sorry, you'll have to pick the last commit.
(I'll re-clone as soon as this commit is taken off of my repo.)

-W

On 27 June 2011 15:34, Mark Proctor <mproctor at codehaus.org> wrote:

> **
> On 27/06/2011 10:38, Wolfgang Laun wrote:
>
> I saw a commit and tried again, but the problem is still around.
> I added a test to BackwardChainingTest - see the pull request.
>
> I have created a jira to track this:
> https://issues.jboss.org/browse/JBRULES-3101
>
> I'm going to first write core unit tests around the rete  dsl, as it's
> easier to test multi permutations for left/right input triggering and will
> better stop future regressions.
>
> commit here shows me updating the rete dsl testing engine for queries:
>
> https://github.com/droolsjbpm/drools/commit/279c9df98434d668d6adc837982a40ae6b9c97d3
>
> i've added a basic test to start with that shows it working for right then
> left triggering, but failing for left then right triggering.
>
> https://github.com/droolsjbpm/drools/blob/279c9df98434d668d6adc837982a40ae6b9c97d3/drools-core/src/test/resources/org/drools/reteoo/test/JoinNodeUnificationTest.nodeTestCase
>
> At the same time i'm applying the fixes, which needs to be done to each
> node. In essence the code to get the memory iterator and the first entry for
> each left tuple assertion needs to be applied to each right object
> assertions and all the modifies.
>
> Mark
>
>
> -W
>
> On 25 June 2011 14:10, Mark Proctor <mproctor at 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 at 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 at 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 at 4dde85f0
>> Object by query: a String object
>> Object by query: 100
>> Object by query: 42
>> Object by query: org.drools.reteoo.InitialFactImpl at 4dde85f0
>> Object by query: a String object
>> Object by query: org.drools.reteoo.InitialFactImpl at 4dde85f0
>> Object by query: a String object
>> Object by query: org.drools.reteoo.InitialFactImpl at 4dde85f0
>>
>> -W
>>
>>
>> _______________________________________________
>> rules-dev mailing listrules-dev at lists.jboss.orghttps://lists.jboss.org/mailman/listinfo/rules-dev
>>
>>
>>
>> _______________________________________________
>> rules-dev mailing listrules-dev at lists.jboss.orghttps://lists.jboss.org/mailman/listinfo/rules-dev
>>
>>
>>
>> _______________________________________________
>> rules-dev mailing list
>> rules-dev at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/rules-dev
>>
>>
>
> _______________________________________________
> rules-dev mailing listrules-dev at lists.jboss.orghttps://lists.jboss.org/mailman/listinfo/rules-dev
>
>
>
> _______________________________________________
> rules-dev mailing list
> rules-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-dev
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-dev/attachments/20110627/4aa1d4d5/attachment.html 


More information about the rules-dev mailing list