Yes, unless you want the rules to react to the object in which you're accumulating the value. Globals should not be used in rule conditions if they're mutable. (The rete network cannot be informed when they change.)
--- On Sat, 8/8/09, sonia <[email protected]> wrote: > From: sonia <[email protected]> > Subject: Re: [rules-users] Strategy for initializing objects > To: "Rules Users List" <[email protected]> > Date: Saturday, August 8, 2009, 12:16 PM > Thank you. > > Accumulating increasingly on every step seems better then > doing > 'accumulate' on all objects, all the time. > Logically, it is the same as what I wanted - to accumulate > the total > size somewhere. Implementation-wise, the difference is the > additional > fact object for accumulation. > > Should I avoid using static or any non-fact external data > as part of > my calculations? > Isnt it just like using globals? > > 2009/8/8 Wolfgang Laun <[email protected]>: > > As an alternative, consider asserting a single Fact > Shelf with field x > > initially 0. Then you could do > > > > rule "Another box on the shelf" > > when > > b: Box( x == -1, $size : size ) > > s: Shelf( $x : x ) > > then > > b.setX( $x ); update( b ); > > s.setX( $x + $size ); update( s ); > > end > > > > -W > > > > > > 2009/8/8 Greg Barton <[email protected]> > >> > >> You answer your own question. Use accumulate: > >> > >> rule "Hello World" > >> when > >> b : Box( x == -1 ) > >> newX : Integer() from > accumulate( box: Box( x != -1 ), > >> > init( int i = 0; ), > >> > action( i += box.size; ), > >> > reverse( i -= box.size; ), > >> > result( i ) ) > >> then > >> System.out.println("Sum: " > + newX); > >> b.setX(newX); > >> System.out.println(b); > >> update(b); > >> end > >> > >> See attached project. > >> > >> --- On Sat, 8/8/09, sonia <[email protected]> > wrote: > >> > >> > From: sonia <[email protected]> > >> > Subject: Re: [rules-users] Strategy for > initializing objects > >> > To: "Rules Users List" <[email protected]> > >> > Date: Saturday, August 8, 2009, 2:36 AM > >> > In general: I want to set a property > >> > in the Box objects, depending on > >> > all previously set objects.. > >> > > >> > My goal is to place the boxes one after > another, for this I > >> > keep a > >> > variable in Box object. > >> > It seems like the easiest way to accumulate > the sizes of > >> > boxes that > >> > are already placed. > >> > > >> > In the 'then' clause, I set the box location, > and update > >> > the X by > >> > adding the size of the currently placed box. > >> > > >> > 2009/8/8 Wolfgang Laun <[email protected]>: > >> > > Your goal and the presented code aren't > clear to me. > >> > The consequence (after > >> > > then) contains calls to static/class > methods > >> > (Box.setX()) which isn't going > >> > > to change anything in your fact object. > The call > >> > b.setX() might change your > >> > > object, but this depends on what the > class method > >> > Box.getX() returns. > >> > > > >> > > Assuming Drools 5, a typical consequence > would look > >> > like > >> > > b: Box(...) > >> > > then > >> > > modify( b ){ > >> > > setX( ... ) > >> > > } > >> > > end > >> > > > >> > > -W > >> > > > >> > > On Sat, Aug 8, 2009 at 1:48 AM, sonia > <[email protected]> > >> > wrote: > >> > >> > >> > >> Hello > >> > >> > >> > >> I want to achieve this: > >> > >> box1.setX(0) > >> > >> box2.setX(box1.size()); > >> > >> box2.setX(box1.size + box2.size) > >> > >> ... > >> > >> > >> > >> I want to do it with rules, and > would like to know > >> > what's the best > >> > >> method of initializing (or any other > operation > >> > with varying data) a > >> > >> group of objects > >> > >> > >> > >> rule "init box" > >> > >> when > >> > >> b : Box( x == -1) > >> > >> then > >> > >> b.setX(Box.getX()); > >> > >> Box.setX( Box.getX() + b.size); > >> > >> end > >> > >> > >> > >> This does not work. > >> > >> A single box object is matched > several times > >> > instead of different box > >> > >> objects. > >> > >> What is happening? how come a single > box object is > >> > matched several > >> > >> times? Why doesnt drools choose > other instances of > >> > box? > >> > >> > >> > >> What do I need to do to initialize > all boxes, once > >> > for every box? > >> > >> > >> > >> Thank you. > >> > >> > >> > >> -- > >> > >> robosonia > >> > >> > _______________________________________________ > >> > >> rules-users mailing list > >> > >> [email protected] > >> > >> https://lists.jboss.org/mailman/listinfo/rules-users > >> > > > >> > > > >> > > > _______________________________________________ > >> > > rules-users mailing list > >> > > [email protected] > >> > > https://lists.jboss.org/mailman/listinfo/rules-users > >> > > > >> > > > >> > > >> > > >> > > >> > -- > >> > robosonia > >> > > >> > > _______________________________________________ > >> > rules-users mailing list > >> > [email protected] > >> > https://lists.jboss.org/mailman/listinfo/rules-users > >> > > >> > >> > >> > >> _______________________________________________ > >> rules-users mailing list > >> [email protected] > >> https://lists.jboss.org/mailman/listinfo/rules-users > >> > > > > > > _______________________________________________ > > rules-users mailing list > > [email protected] > > https://lists.jboss.org/mailman/listinfo/rules-users > > > > > > > > -- > robosonia > > _______________________________________________ > rules-users mailing list > [email protected] > https://lists.jboss.org/mailman/listinfo/rules-users > _______________________________________________ rules-users mailing list [email protected] https://lists.jboss.org/mailman/listinfo/rules-users
