[rules-users] newbie: update and shallowCache

Piccand, Regis rpiccand at verisign.com
Tue Apr 15 08:25:13 EDT 2008


Hi Edson,
 
Thanks for your help. I restructured my biz objects to avoid nested
structures, which makes it work now (I have new objects to hold
allocatedHour per subject).
 
However, I have the feeling that this constraint has a certain impact on
o-o design (more flat objects vs composite object). The documentation
says that nested values should be considered immutable, unless using the
modify block (as you suggested) and retract/re-assert the objects in the
workingMemory ; it also has a much greater performance cost.
 
Am I getting it right when saying that the object design should really
be like 'many flat-type objects avoiding composite approach' to have
Drools perform well or is it more sensible to have a proper o-o design
and tweak Drools (using modify block, disabling cache, etc.)
 
Thanks in advance for sharing your experience
 
Regis
 
 
 
when

$lesson : Lesson(allocated == false, session.type == Session.DISTINCT)

$subjectAllocation : SubjectAllocation( subject == $lesson.subject,
$allocatedDays : 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) ;

$subjectAllocation.addAllocation($availableHour ) ;

update($subjectAllocation) ;

 


________________________________

From: rules-users-bounces at lists.jboss.org
[mailto:rules-users-bounces at lists.jboss.org] On Behalf Of Edson Tirelli
Sent: Monday, April 14, 2008 4:55 PM
To: Rules Users List
Subject: Re: [rules-users] newbie: update and shallowCache



   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/20080415/15c4e6fa/attachment.html 


More information about the rules-users mailing list