[rules-users] optimization on a lot of simple rules

Wolfgang Laun wolfgang.laun at gmail.com
Mon Jul 20 02:34:12 EDT 2009


Well, what is the realtion between id, usage and the result that's to be
stored in a Decision or a global?

Typically, such rules could be written as

rule x
no-loop true
when
    $d : Decision()
    $p :Product( id == 1, $usage : usage )
then
    compute/store value, depending on the formula for id == 1 (using usage)
end
// similar rule for id == 2,3,...

If value is a straightforward function of id (and usage), then implement a
function compValue and use a single rule, e.g.:

rule x
no-loop true
when
    $d : Decision()
    Product( $id : id, $usage : usage)
then
   modify $d value to compValue( $id, $usage )

Distinguishing all individual combinations of id and usage on the LHS seems
excessive.

The ordering of CEs also affects execution times.

-W

On 7/20/09, nesta <nesta.fdb at 163.com> wrote:
>
>
> In this scenario, there are 1000 products, different product has different
> price, besides this, the price is affected by usage. I want to use
> Product.id to match the rules.
>
> As you mentioned "The crude duplication of rules where only the constant to
> be matched with
> Product.id varies can, most likely, be avoided."
>
> How to avoid it in this scenario?
>
>
> Wolfgang Laun-2 wrote:
> >
> > It's difficult to suggest an optimized form for your rules 1-infinity,
> > since
> > we do not know what you want to achieve.
> >
> > The crude duplication of rules where only the constant to be matched with
> > Product.id varies can, most likely, be avoided.
> >
> > -W
> >
> >
> >
> > On Sun, Jul 19, 2009 at 3:15 PM, nesta <nesta.fdb at 163.com> wrote:
> >
> >>
> >> Hi,
> >>
> >> I am a newbie in drools. There are a lot of simple rules in a scenario.
> >> For example
> >> rule 1
> >>    when
> >>        Product( id ==1, usage == 1)
> >>        $decision : Decision()
> >>    then
> >>         $decision.setValue(1);
> >> end
> >>
> >> rule 2
> >> when Product( id ==2, usage == 1)
> >>  $decision : Decision()
> >> rule 3
> >> when Product( id ==3, usage == 1)
> >>  $decision : Decision()
> >> rule 4
> >> when Product( id ==4, usage == 1)
> >>  $decision : Decision()
> >> rule 5
> >> when Product( id ==5, usage == 1)
> >>  $decision : Decision()
> >> ......
> >>
> >> I have a Product fact whose id = 5 and usage = 1, in my first thinking,
> >> only
> >> rule 5 is matched, there should be not much more different between 1
> rule
> >> and a lot of rules in runtime.
> >>
> >> But the result shows that they are different. More rules will cost more
> >> time. If there are 1 thousand rules, some Node and Sink will execute 1
> >> thousand times.
> >>
> >> My question is how to optimize this scenario?
> >> --
> >> View this message in context:
> >>
> http://www.nabble.com/optimization-on-a-lot-of-simple-rules-tp24556724p24556724.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/optimization-on-a-lot-of-simple-rules-tp24556724p24563725.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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20090720/877f5234/attachment.html 


More information about the rules-users mailing list