[rules-users] Caching results in temperory variables

Wolfgang Laun wolfgang.laun at gmail.com
Fri Aug 13 04:07:45 EDT 2010


See inline annotations.

On 13 August 2010 04:34, Manav <manav7574 at yahoo.com> wrote:

> Thanks for your response Greg. As you said this is what i tried to fix the
> issue
> by creating a UserResult obj that has score as a property and inserting the
> same
> in working memory. I update the results in subsequent rules in the "then"
> clause. There are some issues that i faced in this as well :-
>
> -- In my last rule if i want to do a check on score property of  my result
> object in the "when" clause the score has not been updated .
>
> -- however if i do the same check in the "then" clause it seems to work
> properly.
>
>
> -- I tried to overcome by doing an update in one of my rules to check if
> that
> would work. That however went into an infinite loop.  So i used the
> "lock-on-active true" property . However it seemed to work well for only
> the
> first user object and doesn't work for other user objects that are loaded
> later.
>
>
> Below is the sample rule file . If the scenario is not clear pls do let me
> know
> and i will send across the different drls as attachments .
>
>
>
> salience 200
> when
>     User ($id : id)
> then
>     UserResult urslt = new UserResult ($id);
>     insert ($id)
>

Here I'd expect
       insert( urslt );

Also, to be on the safe side, I always add a pattern
       not( UserResult( id == $id ) )
to avoid the creation of multiple UserResult's for the same User (if there's
a minimal chance it might be modified during the following fusillade).

end
>
> rule "JapaneseScore"

> salience 100


>
lock-on-active truewhen
>     $usr : User (language.keySet contains "Japanese", $j_score :
> language["Japanese"])
>

I prefer to add a binding of User's id:  User( $id == id )

>     $urslt :  UserResult (id == $usr.id)
>
so I can simplify this. Add a constraint to avoid looping:

        $urslt : USerResult( id == $id, langScore.keySet not contains
"Japanese" )


> then
>     $usrlt.setLangScore("Japanese", $j_score);
>
        update( $usrlt );

> end
>


rule "FrenchScore"

> salience 50
>
Why not 100?


> lock-on-active true

not necessary now


> when
>     User (language.keySet contains "French", $f_score : language["French"])
>     $urslt :  UserResult (id == $usr.id)
>
Same as before:
 $urslt :  UserResult (id == $id <http://usr.id/>, langScore.keySet not
contains "French" )

then
>     $usrlt.setLangScore("French", $_score);
>     update ($usrlt);
> end
>
> salience 25
> when
>     UserResult (score > 4) // does not work
> then
>     // if ($usr_rslt.getScore() > 4)  --> works well
>     // update the db
> end
>
> Regards,
> Manav
>


The repetition of rules JapanesScore and FrenchScore could be avoided by
inserting static objects

insert( new Language( "Japanese" ) );
insert( new Language( "French" ) );
// more of the same

rule "PolyglottScore"
salience 100
when
   Language( $name : name )
   User ($id : id, language.keySet contains $name", $f_score :
language[$name])
   $urslt :  UserResult (id == $id <http://usr.id/>, langScore.keySet not
contains $name )
then
    modify( $usrlt ){
       setLangScore($name, $_score)
    }
end

HTH
--W



>
>
> ----- Original Message ----
> From: Greg Barton <greg_barton at yahoo.com>
> To: Manav <manav7574 at yahoo.com>; Rules Users List <
> rules-users at lists.jboss.org>
> Sent: Thu, August 12, 2010 9:29:28 PM
> Subject: Re: [rules-users] Caching results in temperory variables
>
> You must either update an existing working memory object or insert a new
> working
> memory object with the results.  That's how rules communicate with each
> other.
>
> GreG
>
> On Aug 12, 2010, at 10:31 AM, Manav <manav7574 at yahoo.com> wrote:
>
> Hi,
>
> I am using the version 5.x of drools and i have a scenario where i want to
> hold
> the result of
>
> a test in one rule to a temperory variable . This result will then be used
> in
> another rule that will be fired
>
> later in the sequence .
>
> For ex :
>
> salience 100
> when
>     User (language.keySet contains "Japanese", $j_score :
> language["Japanese"])
> then
>     // do something
> end
>
> salience 50
> when
>     User (language.keySet contains "French", $f_score : language["French"])
> then
>     // do something
> end
>
> salience 25
> when
>     eval (($j_score + $f_score) > 4)
> then
>     // update the same to db
> end
>
> Is this possible in Drools 5.x ?
>
> Regards,
> Manav
>
>
>
>
> _______________________________________________
> 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/20100813/2de4beb1/attachment.html 


More information about the rules-users mailing list