[rules-users] newbie: update and shallowCache
Edson Tirelli
tirelli at post.com
Mon Apr 14 10:54:36 EDT 2008
Regis,
You are probably having problems with mutable predicates, when using "
subject.allocatedDays". As a first step to understand your problem, I
strongly encourage you to make constraints flat, i.e., avoid using nested
accessors. After you get used to what can and what can't be done, you can go
back to use nested accessors.
Also, I suggest you use modify() block instead of update():
*
rule
*"allocate"
*when*
$lesson : Lesson(allocated == *false*, session.type == Session.DISTINCT )
$subject : Subject( $allocatedDays : allocatedDays ) from $lesson.subject
$availableHour : Hour(allocated == *false*, day *not* *memberOf*$allocatedDays)
*then*
modify( $lesson) {
setHour($availableHour ),
setAllocated(*true*)
}
modify( $availableHour )
setSubject($lesson.getSubject()),
setAllocated(*true* )
}
**
*end*
Hope it helps.
[]s
Edson
2008/4/14 Piccand, Regis <rpiccand at verisign.com>:
> Hi all,
>
> I am evaluating Drools and am stuck with a simple rule that selects
> elements which do not correspond to the condition... Since I am updating
> objects in the RHD, I guess it has to do with my wrong understanding (and
> the cache...?)
>
>
> I am trying to allocate lessons to periods (hour). My object model can be
> summarize is as follows :
>
> Lesson
> boolean : allocated // true if the lesson has been allocated to an
> hour
> int : session // a session is a bunch of lessons
> Subject : subject // an allocated lesson is assigned a subject
>
> Subject
> Set<Day> : allocatedDays // days in which this subject is taught -
> checked before allocation, as a subject can only be taught once a day
>
> Hour
> boolean : allocated // true is this hour has been allocated with a
> lesson
> Day : day // the day this hour belongs to - required to check with
> subject.allocatedDays
>
>
> I put in the workingMemory a bunch of Lesson objects, which have been set
> with Subject and Session id. I also put a bunch of Hour object, set with a
> Day.
>
>
> My rule is as follows:
>
> *
>
> rule
> * "allocate"
>
> *when*
>
> $lesson : Lesson(allocated == *false*, session.type == Session.DISTINCT,
> $allocatedDays : subject.allocatedDays)
>
> $availableHour : Hour(allocated == *false*, day *not* *memberOf*$allocatedDays)
>
> *then*
>
> $lesson.setHour($availableHour ) ;
>
> $lesson.setAllocated(*true*) ;
>
> *update*($lesson);
>
> $availableHour.setSubject($lesson.getSubject()) ;
>
> $availableHour.setAllocated(*true* );
>
> *update*($availableHour);
>
> *end*
> When I set a debug on the first line of the THEN section, I can see that
> sometimes $availableHour.allocated == true ... sometimes $lesson.allocated
> == true (although it's an implicit And statement ...)
>
> Therefore, I can see that the update() works, but it seems that the rule
> does not use the updated object (due to shallow copy ??)
>
> Any help more than welcome
>
> Regis
>
>
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
>
--
Edson Tirelli
JBoss Drools Core Development
Office: +55 11 3529-6000
Mobile: +55 11 9287-5646
JBoss, a division of Red Hat @ www.jboss.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20080414/75459a17/attachment.html
More information about the rules-users
mailing list