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

Greg Barton greg_barton at yahoo.com
Tue Nov 4 10:37:21 EST 2008


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


      



More information about the rules-users mailing list