[rules-users] Working Memory and agenda-group

Wolfgang Laun wolfgang.laun at gmail.com
Fri Dec 30 04:10:32 EST 2011


This is a bug. Please submit a JIRA.

In spite of all the fixes that have been made, using dialect "mvel" is
still risky.

In this case, it would appear that the WM insert from inside the called
function is somehow hidden from the Engine due to the RHS being evaluated
in a MVEL context. You can easily verify this by adding another rule:

rule "objects"
 ## agenda-group "Foo" (not
when
  $object: Object()
then
  System.out.println( "Fact: " + $object.getClass() + " " + $object);
end

-W


2011/12/30 Maciej Gowin <maciej.abacus.gowin at gmail.com>

> I agree - my mistake, Because of tests I've forgotten to delete 'X'... So
> it's not the case... Sorry...
> But did another try and when I've used
>
>
> rule "Check Object A and Set Default"
> dialect "mvel"
>
> It was not working correctly. Then I moved to:
>
>
> rule "Check Object A and Set Default"
> dialect "java"
>
> and it works fine. So it is ok if we will change Mike's 'NOT WORKING'
> example to:
>
> --------------------------------------------------
> package com.sample
>
> import com.sample.ObjectA
> import org.drools.WorkingMemory
>
> function void insertDefault(WorkingMemory workingMemory) {
>   SomeDefault someDefault = new SomeDefault();
>   someDefault.setMinValueA(100);
>   someDefault.setMinValueB(20.0);
>   someDefault.setMaxValueB(20000.0);
>   workingMemory.insert(someDefault);
>
> }
>
> declare SomeDefault
>   minValueA : Integer
>   minValueB : Double
>   maxValueB : Double
> end
>
> rule "Check Object A and Set Default"
>   dialect "java"
>
>   agenda-group "Foo"
>   salience 100
>   when
>     $a : ObjectA()
>   then
>     insertDefault(drools.getWorkingMemory());
> end
>
> rule "Use the defaults"
>   dialect "mvel"
>
>   agenda-group "Foo"
>   salience 90
>   when
>     $default : SomeDefault()
>   then
>     System.out.println("Default minA=" + $default.minValueA)
> end
> --------------------------------------------------
>
> Any ideas why?
>
>
> 2011/12/30 Mauricio Salatino <salaboy at gmail.com>
>
>> One is SomeDefault and the other one is SomeDefaultX.
>> The Declared type, as far as I remember overrides the to string with
>> the representation that you are seeing there:
>> SomeDefault( minValueA=100, minValueB=20.0, maxValueB=20000.0 )
>> What is SomeDefaultX??
>> Cheers
>> 2011/12/29 Maciej Gowin <maciej.abacus.gowin at gmail.com>:
>> > I did some debbuging with 'declare SomeDefault'. This is what I found:
>> >
>> > CASE1: RHS = drools.getWorkingMemory().insert(new SomeDefaultX())
>> > Working memory objects:
>> > Object[fact
>> > 0:2:2082419441:2082419441:2:DEFAULT:com.sample.SomeDefaultX at 7c1f32f1]
>> > Object[fact 0:1:140683595:140683595:1:DEFAULT:com.sample.ObjectA at 862a94b
>> ]
>> >
>> > CASE2: RHS = insertDefault(drools.getWorkingMemory())
>> > Working memory objects:
>> > Object[fact 0:2:176338845:1:2:DEFAULT:SomeDefault( minValueA=100,
>> > minValueB=20.0, maxValueB=20000.0 )]
>> > Object[fact
>> 0:1:1125048577:1125048577:1:DEFAULT:com.sample.ObjectA at 430ee101]
>> >
>> > Please note the difference between DEFAULT:com.sample.SomeDefault and
>> > DEFAULT:SomeDefault.
>> > So when inserting an object to WorkingMemory inside function
>> insertDefault
>> > which is declared in DRL file
>> > something strange is going on... It seems like it is a bug. It is worth
>> > mentioning that I get following result
>> > inside insertDefault:
>> > System.out.println(SomeDefault.class.getName());
>> > ---> com.sample.SomeDefault
>> >
>> > Hope it will help :)
>> >
>> >
>> >
>> >
>> > 2011/12/30 Maciej Gowin <maciej.abacus.gowin at gmail.com>
>> >>
>> >> Of course it's only my guess. I'm not an expert. Please correct me if
>> I'm
>> >> wrong :)
>> >>
>> >>
>> >> 2011/12/30 Maciej Gowin <maciej.abacus.gowin at gmail.com>
>> >>>
>> >>> It's not the different WorkingMemory. It's all about class name
>> >>> confusion. It looks like the class type does not match.
>> >>> Please try to create SomeDefault in standard way, not with 'declare'
>> >>> statement. It works ok.
>> >>>
>> >>>
>> >>> 2011/12/30 Mike Key <mikey at zenbitz.com>
>> >>>>
>> >>>> I guess that is exactly my confusion :)  Why would it be that doing
>> the
>> >>>> exact same thing, one inserting into working memory from a function
>> and the
>> >>>> other simply doing it within the RHS of the rule cause downstream
>> rules not
>> >>>> to fire in the function call case?  The rules are both in the same
>> >>>> agenda-group, both the function example and the insert from the RHS
>> of the
>> >>>> rule example are simply inserting a new fact into working memory.
>> >>>>
>> >>>> It makes it seem like the function call is somehow inserting into a
>> >>>> *different* working memory, which I'm sure is not the case, but the
>> >>>> downstream rule does not fire none-the-less.
>> >>>>
>> >>>> Thanks for any clarity.
>> >>>>
>> >>>>
>> >>>> On Thu, Dec 29, 2011 at 3:59 PM, Mauricio Salatino <
>> salaboy at gmail.com>
>> >>>> wrote:
>> >>>>>
>> >>>>> Agenda-groups segment the agenda and not the working memory :)
>> >>>>> Probably that is part of your confusion.
>> >>>>>
>> >>>>>
>> >>>>> 2011/12/29 Mike Key <mikey at zenbitz.com>:
>> >>>>> > I am a fairly new Drools user and am trying to understand how
>> working
>> >>>>> > memory
>> >>>>> > is segmented when using agenda groups.  I have an agenda-group
>> that
>> >>>>> > has
>> >>>>> > focus set immediately from the session as follows with a few
>> objects
>> >>>>> > being
>> >>>>> > inserted:
>> >>>>> >
>> >>>>> > ksession.insert(objectA);
>> >>>>> > ksession.insert(objectB);
>> >>>>> > ksession.getAgenda().getAgendaGroup("Foo").setFocus();
>> >>>>> >
>> >>>>> > I have 2 rules simplified down to illustrate my confusion.  The
>> first
>> >>>>> > rule
>> >>>>> > simply sets some default values evaluated in the second rule if
>> >>>>> > objectA
>> >>>>> > exists.  In the example that works I set the defaults in the RHS
>> >>>>> > explicitly.
>> >>>>> >  However I want to use these defaults from different
>> agenda-groups,
>> >>>>> > so when
>> >>>>> > I put them in a function, the second rule never fires, the
>> activation
>> >>>>> > is
>> >>>>> > created for the first rule but never the second.  Can someone
>> tell me
>> >>>>> > why
>> >>>>> > the use of a function seems to alter the truth of the rule?
>> >>>>> >
>> >>>>> > THIS WORKS:
>> >>>>> >
>> >>>>> > declare SomeDefault
>> >>>>> >   minValueA : Integer
>> >>>>> >   minValueB : Double
>> >>>>> >   maxValueB : Double
>> >>>>> > end
>> >>>>> >
>> >>>>> > rule "Check Object A and Set Default"
>> >>>>> >   agenda-group "Foo"
>> >>>>> >   salience 100
>> >>>>> >   when
>> >>>>> >     $a : ObjectA()
>> >>>>> >   then
>> >>>>> >     default = new SomeDefault()
>> >>>>> >     default.minValueA = 100
>> >>>>> >     default.minValueB = 20.0
>> >>>>> >     default.maxValueB = 20000.0
>> >>>>> >     insert(default)
>> >>>>> > end
>> >>>>> >
>> >>>>> > rule "Use the defaults"
>> >>>>> >   agenda-group "Foo"
>> >>>>> >   salience 100
>> >>>>> >   when
>> >>>>> >     $default : SomeDefault()
>> >>>>> >   then
>> >>>>> >     System.out.println("Default minA=" + $default.minValueA)
>> >>>>> > end
>> >>>>> >
>> >>>>> > THIS DOES NOT WORK:
>> >>>>> >
>> >>>>> > declare SomeDefault
>> >>>>> >   minValueA : Integer
>> >>>>> >   minValueB : Double
>> >>>>> >   maxValueB : Double
>> >>>>> > end
>> >>>>> >
>> >>>>> > rule "Check Object A and Set Default"
>> >>>>> >   agenda-group "Foo"
>> >>>>> >   salience 100
>> >>>>> >   when
>> >>>>> >     $a : ObjectA()
>> >>>>> >   then
>> >>>>> >     insertDefault(drools.getWorkingMemory())
>> >>>>> > end
>> >>>>> >
>> >>>>> > rule "Use the defaults"
>> >>>>> >   agenda-group "Foo"
>> >>>>> >   salience 90
>> >>>>> >   when
>> >>>>> >     $default : SomeDefault()
>> >>>>> >   then
>> >>>>> >     System.out.println("Default minA=" + $default.minValueA)
>> >>>>> > end
>> >>>>> >
>> >>>>> > function void insertDefault(WorkingMemory workingMemory) {
>> >>>>> >   SomeDefault default = new SomeDefault();
>> >>>>> >   default.setMinValueA(100);
>> >>>>> >   default.setMinValueB(20.0);
>> >>>>> >   default.setMaxValueB(20000.0);
>> >>>>> >   workingMemory.insert(default);
>> >>>>> > }
>> >>>>> >
>> >>>>> > In the latter (non-working) example the first rule activates and
>> then
>> >>>>> > drools
>> >>>>> > returns, it never even attempts to try to fire the second rule.
>> >>>>> >  However in
>> >>>>> > the working example BOTH rules fire as I would expect.  I am
>> guessing
>> >>>>> > this
>> >>>>> > is a simple misunderstanding on my part.  Any assistance in
>> >>>>> > understanding
>> >>>>> > why this nuance doesn't seem to work would be greatly appreciated.
>> >>>>> >
>> >>>>> > Thanks.
>> >>>>> >
>> >>>>> > MiKey
>> >>>>> >
>> >>>>> > _______________________________________________
>> >>>>> > rules-users mailing list
>> >>>>> > rules-users at lists.jboss.org
>> >>>>> > https://lists.jboss.org/mailman/listinfo/rules-users
>> >>>>> >
>> >>>>>
>> >>>>>
>> >>>>>
>> >>>>> --
>> >>>>>  - CTO @ http://www.plugtree.com
>> >>>>>  - MyJourney @ http://salaboy.wordpress.com
>> >>>>>  - Co-Founder @ http://www.jugargentina.org
>> >>>>>  - Co-Founder @ http://www.jbug.com.ar
>> >>>>>
>> >>>>>  - Salatino "Salaboy" Mauricio -
>> >>>>>
>> >>>>> _______________________________________________
>> >>>>> rules-users mailing list
>> >>>>> rules-users at lists.jboss.org
>> >>>>> https://lists.jboss.org/mailman/listinfo/rules-users
>> >>>>
>> >>>>
>> >>>>
>> >>>> _______________________________________________
>> >>>> rules-users mailing list
>> >>>> rules-users at lists.jboss.org
>> >>>> https://lists.jboss.org/mailman/listinfo/rules-users
>> >>>>
>> >>>
>> >>
>> >
>> >
>> > _______________________________________________
>> > rules-users mailing list
>> > rules-users at lists.jboss.org
>> > https://lists.jboss.org/mailman/listinfo/rules-users
>> >
>>
>>
>>
>> --
>>  - CTO @ http://www.plugtree.com
>>  - MyJourney @ http://salaboy.wordpress.com
>>  - Co-Founder @ http://www.jugargentina.org
>>  - Co-Founder @ http://www.jbug.com.ar
>>
>>  - Salatino "Salaboy" Mauricio -
>>
>> _______________________________________________
>> rules-users mailing list
>> rules-users at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/rules-users
>>
>
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20111230/0d1d0f05/attachment.html 


More information about the rules-users mailing list