[rules-users] Newbie question on accessing predecessor and successor in a list

Greg Barton greg_barton at yahoo.com
Tue Nov 4 12:31:45 EST 2008


I agree.  Control objects are often necessary, or at least an easier way to solve a problem than the alternatives.  However, being forced to clone your business model for rule execution is highly undesirable.  That's one reason I like drools.  Rule systems that force you to recreate clone your business model just to use rules introduce an undue burden, both in processing efficiency and maintainability.

--- On Tue, 11/4/08, CSchr <christian.schrinner at sbb.ch> wrote:

> From: CSchr <christian.schrinner at sbb.ch>
> Subject: Re: [rules-users] Newbie question on accessing predecessor and successor in a list
> To: rules-users at lists.jboss.org
> Date: Tuesday, November 4, 2008, 10:58 AM
> Yes that's correct. No way to change the model yet. But
> I think I could
> introduce additional objects and could even
> "clone" the business objects
> into more convenient objects just for rule evaluation. But
> this would be my
> least prefered solution as it would introduce a layer of
> transformation and
> a parallel (mirror) model that needs to be updated whenever
> the business
> model changes in future releases.
> 
> Regards,
> 
> Chris
> 
> 
> Greg Barton wrote:
> > 
> > I think you'd have to toss in ControlFact
> instances with positions from 1
> > to journey.segmentList.size-1 for this to work. 
> Otherwise the evaluation
> > of the journey.segmentList would halt on the first
> failure of the rule to
> > match.  Then the modify block wouldn't be needed
> in the action.
> > 
> > Also, CSchr, you mentioned that the business model
> could not be altered. 
> > Does that mean you can't use additional objects
> like control facts?  
> > 
> > --- On Tue, 11/4/08, Edson Tirelli
> <tirelli at post.com> wrote:
> > 
> >> From: Edson Tirelli <tirelli at post.com>
> >> Subject: Re: [rules-users] Newbie question on
> accessing predecessor and
> >> successor in a list
> >> To: "Rules Users List"
> <rules-users at lists.jboss.org>
> >> Date: Tuesday, November 4, 2008, 8:56 AM
> >> Christian,
> >> 
> >>    My guess is that there are better approaches to
> do what
> >> you want (i.e.,
> >> write your business rules) without using specific
> indexes
> >> in a list, since
> >> that is usually a sign of trying to use a
> imperative
> >> algorithm in a
> >> declarative engine.
> >>    If you can share a mock of what your business
> rule is,
> >> maybe we can help
> >> more.
> >> 
> >>    Having said that, about your questions:
> >> 
> >> * You can use eval inside patterns. Just remember
> that
> >> eval() uses a code
> >> block in the same dialect you are using to write
> your rules
> >> (default is
> >> java). So, $journey.segmentList is probably not
> valid in
> >> java (since
> >> segmentList is probably private attribute), but is
> valid in
> >> MVEL that
> >> transparently call getSegmentList(). So, either
> change your
> >> expression to a
> >> correct java expression or change the rule dialect
> to MVEL.
> >> 
> >> * DISCLAIMER: THIS IS REALLY BAD PRACTICE: if you
> really
> >> want to emulate
> >> "imperative programming" for this rule,
> you need
> >> a control fact to keep
> >> track of the index you are testing:
> >> 
> >> rule "Children: do not do this at home,
> unless your
> >> parents says it is ok"
> >> when
> >>     $cf : ControlFact( $pos : position <
> >> $journey.segmentList.size )
> >>     $s : Segment( countries contains
> Country.Switzerland,
> >> ... ) from
> >> $journey.segmentList[$pos]
> >>     $ps : Segment( countries not contains
> >> Country.Switzerland, ... ) from
> >> $journey.segmentList[$pos-1]
> >> then
> >>     // do something
> >>     // and also update control fact
> >>     modify( $cf ) { setPosition( $pos + 1 ) }
> >> end
> >> 
> >> Initialize control fact with position number 1 and
> it
> >> should be fine, but I
> >> did not tested the above rule.
> >> 
> >>    []s
> >>    Edson
> >> 
> >> 
> >> 2008/11/4 CSchr <christian.schrinner at sbb.ch>
> >> 
> >> >
> >> > Thanks Greg for your fast reply.
> Unfortunately I do
> >> not get this to work:
> >> >
> >> > $preSegment : Segment (
> >> >                      
> >> $journey.segmentList.indexOf(this) ==
> >> > ($journey.segmentList.indexOf($segment) - 1),
> >> >                        countries not contains
> >> Country.Switzerland && ...
> >> >                     ) from
> $journey.segmentList
> >> >
> >> > Compiler throws:
> >> >
> >> > [36,48]: unknown:36:48 Unexpected token
> >> 'this'[36,98]: unknown:36:98
> >> > Unexpected token '$segment'
> >> >
> >> > Is it possible to use eval() inside Segment
> ()?
> >> >
> >> > With eval the compiler throws something like
> this:
> >> >
> >> > $journey.segmentList cannot be resolved to a
> type
> >> > Cannot use this in a static context
> >> >
> >> > I don't know how matching works in
> drools, but
> >> wouldn't this also be very
> >> > expensive? As for every match of Segment ( )
> the
> >> segmentList has to be
> >> > iterated two times. These lists can get very
> long. A
> >> cheap approach would
> >> > be
> >> > if the from statement would "know"
> the index
> >> of the Segment () matched. I
> >> > was hoping this would be possible.
> >> >
> >> >
> >> > Regards,
> >> >
> >> > Chris
> >> >
> >> >
> >> > Greg Barton wrote:
> >> > >
> >> > > You can't do
> >> $journey.segmentList.indexOf(this) and
> >> > > $journey.segmentList.indexOf($segment),
> even in
> >> an eval?
> >> > >
> >> > > --- On Mon, 11/3/08, CSchr
> >> <christian.schrinner at sbb.ch> wrote:
> >> > >
> >> > >> From: CSchr
> >> <christian.schrinner at sbb.ch>
> >> > >> Subject: [rules-users] Newbie
> question on
> >> accessing predecessor and
> >> > >> successor in a list
> >> > >> To: rules-users at lists.jboss.org
> >> > >> Date: Monday, November 3, 2008, 9:56
> AM
> >> > >> Hi everyone!
> >> > >>
> >> > >> I'm relatively new to Drools and
> rule
> >> languages.
> >> > >>
> >> > >> I'm wondering if it is possible
> to access
> >> the
> >> > >> predecessor and successor in a
> >> > >> match using from operator on an
> (Array)List.
> >> I have
> >> > >> something like this
> >> > >> (simplified):
> >> > >>
> >> > >> ...
> >> > >> $segment : Segment( countries
> contains
> >> Country.Switzerland
> >> > >> && ... ) from
> >> > >> $journey.segmentList
> >> > >>
> >> > >> $preSegment : Segment (
> indexOf(this) ==
> >> indexOf($segment)
> >> > >> - 1,
> >> > >>                                
> countries not
> >> contains
> >> > Country.Switzerland
> >> > >> && ...
> >> > >>                  ) from
> $journey.segmentList
> >> > >>
> >> > >> I need something like indexOf() for
> the exact
> >> predecessor
> >> > >> of the matched
> >> > >> segment.
> >> > >>
> >> > >> If the matched business object was
> an element
> >> of a double
> >> > >> linked list it
> >> > >> would be easy. Unfortunately I
> don't have
> >> the luxury to
> >> > >> change the business
> >> > >> object into knowing it's
> predecessor or
> >> successor. I
> >> > >> have to prove that we
> >> > >> could write our java coded business
> rules in
> >> Drools rule
> >> > >> language without
> >> > >> changing the business object model.
> >> > >>
> >> > >> Thanks in advance,
> >> > >>
> >> > >> Chris
> >> > >>
> >> > >>
> >> > >> --
> >> > >> View this message in context:
> >> > >>
> >> >
> >>
> http://www.nabble.com/Newbie-question-on-accessing-predecessor-and-successor-in-a-list-tp20302694p20302694.html
> >> > >> Sent from the drools - user mailing
> list
> >> archive at
> >> > >> Nabble.com.
> >> > >>
> >> > >>
> >> _______________________________________________
> >> > >> 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
> >> > >
> >> > >
> >> >
> >> > --
> >> > View this message in context:
> >> >
> >>
> http://www.nabble.com/Newbie-question-on-accessing-predecessor-and-successor-in-a-list-tp20302694p20317549.html
> >> > Sent from the drools - user mailing list
> archive at
> >> Nabble.com.
> >> >
> >> >
> _______________________________________________
> >> > rules-users mailing list
> >> > rules-users at lists.jboss.org
> >> >
> https://lists.jboss.org/mailman/listinfo/rules-users
> >> >
> >> 
> >> 
> >> 
> >> -- 
> >>  Edson Tirelli
> >>  JBoss Drools Core Development
> >>  JBoss, a division of Red Hat @ www.jboss.com
> >> _______________________________________________
> >> 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
> > 
> > 
> 
> -- 
> View this message in context:
> http://www.nabble.com/Newbie-question-on-accessing-predecessor-and-successor-in-a-list-tp20302694p20326448.html
> Sent from the drools - user mailing list archive at
> Nabble.com.
> 
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users


      



More information about the rules-users mailing list