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(a)sbb.ch> wrote:
From: CSchr <christian.schrinner(a)sbb.ch>
Subject: Re: [rules-users] Newbie question on accessing predecessor and successor in a
list
To: rules-users(a)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(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
>
>
>
> _______________________________________________
> 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