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

Edson Tirelli tirelli at post.com
Tue Nov 4 11:01:48 EST 2008


   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 at 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 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
>



-- 
 Edson Tirelli
 JBoss Drools Core Development
 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/20081104/b9b8fc5b/attachment.html 


More information about the rules-users mailing list