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