Your explanation is absolutely superb. I modified my drl as per your
suggestions and it's just been completely transformed. Just one question
regarding one suggestion below :
-- is this something like a for each loop in java . This is the first example i
have seen in drl
-- will this automatically iterate over as many languages as have been inserted
?
-- the inserts .. don't they have to be within a rule block ? or did you just
omit other things to keep it simple
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, langScore.keySet not contains $name )
then
modify( $usrlt ){
setLangScore($name, $_score)
}
end
________________________________
From: Wolfgang Laun <wolfgang.laun(a)gmail.com
To: Manav
<manav7574(a)yahoo.com>; Rules Users List <rules-users(a)lists.jboss.org
Sent: Fri, August 13, 2010 1:37:45 PM
Subject: Re: [rules-users] Caching results in temperory variables
See inline annotations.
On 13 August 2010 04:34, Manav <manav7574(a)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, 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, langScore.keySet not contains $name )
then
modify( $usrlt ){
setLangScore($name, $_score)
}
end
HTH
--W
>----- Original Message ----
>From: Greg Barton <greg_barton(a)yahoo.com
>To:
Manav <manav7574(a)yahoo.com>; Rules Users List <rules-users(a)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(a)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(a)lists.jboss.org
>https://lists.jboss.org/mailman/listinfo/rules-users
>_______________________________________________
>rules-users mailing list
>rules-users(a)lists.jboss.org
>https://lists.jboss.org/mailman/listinfo/rules-users