Good point Greg, thanks!
   Either that or move the actual update on the control fact to a rule with lower salience.

   []s
   Edson



2008/11/4 Greg Barton <greg_barton@yahoo.com>
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@post.com> wrote:

> From: Edson Tirelli <tirelli@post.com>
> Subject: Re: [rules-users] Newbie question on accessing predecessor and successor in a list
> To: "Rules Users List" <rules-users@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@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@sbb.ch> wrote:
> > >
> > >> From: CSchr
> <christian.schrinner@sbb.ch>
> > >> Subject: [rules-users] Newbie question on
> accessing predecessor and
> > >> successor in a list
> > >> To: rules-users@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@lists.jboss.org
> > >>
> https://lists.jboss.org/mailman/listinfo/rules-users
> > >
> > >
> > >
> > > _______________________________________________
> > > rules-users mailing list
> > > rules-users@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@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@lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users



_______________________________________________
rules-users mailing list
rules-users@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