[rules-users] Abstracting Rules using extends

Wolfgang Laun wolfgang.laun at gmail.com
Fri Apr 5 13:58:34 EDT 2013


Rule extension is an extremely useful feature for authoring technical
rules, and it deserves a high level of attention, which it hasn't really
been given up to now.

But, for the scenario that's been presented here, I'm inclined to think
that an approach without extends would be much better:

   - The RuleConstant object doesn't have to be bound to $CONSTANT -
   apparently fields such as SEDAN and COUPE are static fields and could be
   used simply as RuleConstant.SEDAN, etc.
   - Keeping objects in a single container fact ("Vehicles") and extracting
   them by using "from" in each rule is not good for performance. Simply
   inserting all individual Vehicle facts is better, and it avoids the
   inevitable loops.


rule "Custom|2"
enabled true
when
    $vehicle:Vehicle(modelYear > 2000, type = RuleConstant.COUPE)
then
        modify( $vehicle ){
             setValue(100)
        }
end

-W

On 5 April 2013 19:21, Arul Prashanth <arul.prashanth at gmail.com> wrote:

> I have a Rule implementation as below which works as expected, here
> Vehicles() and RuleConstant are facts.
>
> /rule "Rule|1"
> no-loop true
> when
>         $CONSTANT : RuleConstant();
>         $vehicles : Vehicles();
>         $vehicle:Vehicle(modelYear > 2000, type = $CONSTANT.SEDAN) from
> $vehicles.Vehicle;
> then
>         $vehicle.setValue(100);
>         update($vehicles);
> end     /
>
> But am planning to abstract the rules in the below fashion so that we can
> reuse the LHS conditions which doesn't work and throws the below said Null
> Pointer Exception
>
> *BaseRule.drl*
>
> /package com.xyz.base
>
> rule "Base|1"
> no-loop true
> enabled false
> when
>         $CONSTANT : RuleConstant();
>         $vehicles : Vehicles();
> then
>
> end     /
>
> *CustomRule.drl*
>
> /package com.xyz.custom
>
> rule "Custom|1" extends "Base|1"
> no-loop true
> enabled true
> when
>     $vehicle:Vehicle(modelYear > 2000, type = $CONSTANT.SEDAN) from
> $vehicles.Vehicle;
> then
>         $vehicle.setValue(100);
>         update($vehicles);
> end
>
> rule "Custom|2" extends "Base|1"
> no-loop true
> enabled true
> when
>     $vehicle:Vehicle(modelYear > 2000, type = $CONSTANT.COUPE) from
> $vehicles.Vehicle;
> then
>         $vehicle.setValue(100);
>         update($vehicles);
> end/
>
> *Exception:*
>
> Caused by: [Error: drools.update($vehicles): null]
> [Line: 1, Column: 1]
>         at
>
> org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.compileGetChain(ReflectiveAccessorOptimizer.java:416)
>         at
>
> org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.optimizeAccessor(ReflectiveAccessorOptimizer.java:143)
>         at org.mvel2.ast.ASTNode.optimize(ASTNode.java:159)
>         at
> org.mvel2.ast.ASTNode.getReducedValueAccelerated(ASTNode.java:115)
>         at org.mvel2.MVELRuntime.execute(MVELRuntime.java:85)
>         at
> org.mvel2.compiler.CompiledExpression.getValue(CompiledExpression.java:123)
>         at
> org.mvel2.compiler.CompiledExpression.getValue(CompiledExpression.java:116)
>         at org.mvel2.MVEL.executeExpression(MVEL.java:930)
>         at
> org.drools.base.mvel.MVELConsequence.evaluate(MVELConsequence.java:101)
>         at
> org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:1273)
>         ... 33 more
> Caused by: java.lang.reflect.InvocationTargetException
>         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>         at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
>         at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
>         at java.lang.reflect.Method.invoke(Unknown Source)
>         at
>
> org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.getMethod(ReflectiveAccessorOptimizer.java:1105)
>         at
>
> org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.getMethod(ReflectiveAccessorOptimizer.java:987)
>         at
>
> org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.compileGetChain(ReflectiveAccessorOptimizer.java:377)
>         ... 42 more
> Caused by: java.lang.NullPointerException
>         at
> org.drools.common.DefaultAgenda.createActivation(DefaultAgenda.java:569)
>         at
>
> org.drools.reteoo.RuleTerminalNode.modifyLeftTuple(RuleTerminalNode.java:297)
>         at
>
> org.drools.reteoo.SingleLeftTupleSinkAdapter.propagateModifyChildLeftTuple(SingleLeftTupleSinkAdapter.java:246)
>         at org.drools.reteoo.JoinNode.modifyLeftTuple(JoinNode.java:363)
>         at
>
> org.drools.reteoo.SingleLeftTupleSinkAdapter.propagateModifyChildLeftTuple(SingleLeftTupleSinkAdapter.java:272)
>         at
>
> org.drools.reteoo.EvalConditionNode.modifyLeftTuple(EvalConditionNode.java:213)
>         at
>
> org.drools.reteoo.SingleLeftTupleSinkAdapter.propagateModifyChildLeftTuple(SingleLeftTupleSinkAdapter.java:259)
>         at
> org.drools.reteoo.FromNode.checkConstraintsAndPropagate(FromNode.java:337)
>         at org.drools.reteoo.FromNode.modifyLeftTuple(FromNode.java:281)
>         at
>
> org.drools.reteoo.CompositeLeftTupleSinkAdapter.propagateModifyChildLeftTuple(CompositeLeftTupleSinkAdapter.java:316)
>         at org.drools.reteoo.JoinNode.modifyRightTuple(JoinNode.java:273)
>         at org.drools.reteoo.BetaNode.modifyObject(BetaNode.java:531)
>         at org.drools.reteoo.JoinNode.modifyObject(JoinNode.java:446)
>         at
>
> org.drools.reteoo.CompositeObjectSinkAdapter.doPropagateModifyObject(CompositeObjectSinkAdapter.java:507)
>         at
>
> org.drools.reteoo.CompositeObjectSinkAdapter.propagateModifyObject(CompositeObjectSinkAdapter.java:432)
>         at
> org.drools.reteoo.ObjectTypeNode.modifyObject(ObjectTypeNode.java:314)
>         at
> org.drools.reteoo.EntryPointNode.modifyObject(EntryPointNode.java:265)
>         at
> org.drools.common.NamedEntryPoint.update(NamedEntryPoint.java:470)
>         at
> org.drools.common.NamedEntryPoint.update(NamedEntryPoint.java:370)
>         at
>
> org.drools.base.DefaultKnowledgeHelper.update(DefaultKnowledgeHelper.java:317)
>         at
>
> org.drools.base.DefaultKnowledgeHelper.update(DefaultKnowledgeHelper.java:329)
>         at
>
> org.drools.base.DefaultKnowledgeHelper.update(DefaultKnowledgeHelper.java:325)
>         ... 49 more
>
>
>
>
> -----
> - Prashanth
> --
> View this message in context:
> http://drools.46999.n3.nabble.com/Abstracting-Rules-using-extends-tp4023217.html
> Sent from the Drools: User forum 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/20130405/5345b268/attachment.html 


More information about the rules-users mailing list