<div dir="ltr">Rule extension is an extremely useful feature for authoring technical rules, and it deserves a high level of attention, which it hasn&#39;t really been given up to now.<br><div><div class="gmail_extra"><br></div>
<div class="gmail_extra">But, for the scenario that&#39;s been presented here, I&#39;m inclined to think that an approach without extends would be much better:<br><ul><li>The RuleConstant object doesn&#39;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.</li>
<li>Keeping objects in a single container fact (&quot;Vehicles&quot;) and extracting them by using &quot;from&quot; in each rule is not good for performance. Simply inserting all individual Vehicle facts is better, and it avoids the inevitable loops.</li>
</ul></div><div class="gmail_extra"><br>rule &quot;Custom|2&quot;<br>
enabled true<br>
when<br>
    $vehicle:Vehicle(modelYear &gt; 2000, type = RuleConstant.COUPE)<br>
then<br>
        modify( $vehicle ){<br>             setValue(100)<br>
        }<br>
end</div><div class="gmail_extra"><br></div><div class="gmail_extra">-W<br></div><div class="gmail_extra"><br><div class="gmail_quote">On 5 April 2013 19:21, Arul Prashanth <span dir="ltr">&lt;<a href="mailto:arul.prashanth@gmail.com" target="_blank">arul.prashanth@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">I have a Rule implementation as below which works as expected, here<br>
Vehicles() and RuleConstant are facts.<br>
<br>
/rule &quot;Rule|1&quot;<br>
no-loop true<br>
when<br>
        $CONSTANT : RuleConstant();<br>
        $vehicles : Vehicles();<br>
        $vehicle:Vehicle(modelYear &gt; 2000, type = $CONSTANT.SEDAN) from<br>
$vehicles.Vehicle;<br>
then<br>
        $vehicle.setValue(100);<br>
        update($vehicles);<br>
end     /<br>
<br>
But am planning to abstract the rules in the below fashion so that we can<br>
reuse the LHS conditions which doesn&#39;t work and throws the below said Null<br>
Pointer Exception<br>
<br>
*BaseRule.drl*<br>
<br>
/package com.xyz.base<br>
<br>
rule &quot;Base|1&quot;<br>
no-loop true<br>
enabled false<br>
when<br>
        $CONSTANT : RuleConstant();<br>
        $vehicles : Vehicles();<br>
then<br>
<br>
end     /<br>
<br>
*CustomRule.drl*<br>
<br>
/package com.xyz.custom<br>
<br>
rule &quot;Custom|1&quot; extends &quot;Base|1&quot;<br>
no-loop true<br>
enabled true<br>
when<br>
    $vehicle:Vehicle(modelYear &gt; 2000, type = $CONSTANT.SEDAN) from<br>
$vehicles.Vehicle;<br>
then<br>
        $vehicle.setValue(100);<br>
        update($vehicles);<br>
end<br>
<br>
rule &quot;Custom|2&quot; extends &quot;Base|1&quot;<br>
no-loop true<br>
enabled true<br>
when<br>
    $vehicle:Vehicle(modelYear &gt; 2000, type = $CONSTANT.COUPE) from<br>
$vehicles.Vehicle;<br>
then<br>
        $vehicle.setValue(100);<br>
        update($vehicles);<br>
end/<br>
<br>
*Exception:*<br>
<br>
Caused by: [Error: drools.update($vehicles): null]<br>
[Line: 1, Column: 1]<br>
        at<br>
org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.compileGetChain(ReflectiveAccessorOptimizer.java:416)<br>
        at<br>
org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.optimizeAccessor(ReflectiveAccessorOptimizer.java:143)<br>
        at org.mvel2.ast.ASTNode.optimize(ASTNode.java:159)<br>
        at org.mvel2.ast.ASTNode.getReducedValueAccelerated(ASTNode.java:115)<br>
        at org.mvel2.MVELRuntime.execute(MVELRuntime.java:85)<br>
        at<br>
org.mvel2.compiler.CompiledExpression.getValue(CompiledExpression.java:123)<br>
        at<br>
org.mvel2.compiler.CompiledExpression.getValue(CompiledExpression.java:116)<br>
        at org.mvel2.MVEL.executeExpression(MVEL.java:930)<br>
        at org.drools.base.mvel.MVELConsequence.evaluate(MVELConsequence.java:101)<br>
        at org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:1273)<br>
        ... 33 more<br>
Caused by: java.lang.reflect.InvocationTargetException<br>
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)<br>
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)<br>
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)<br>
        at java.lang.reflect.Method.invoke(Unknown Source)<br>
        at<br>
org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.getMethod(ReflectiveAccessorOptimizer.java:1105)<br>
        at<br>
org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.getMethod(ReflectiveAccessorOptimizer.java:987)<br>
        at<br>
org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.compileGetChain(ReflectiveAccessorOptimizer.java:377)<br>
        ... 42 more<br>
Caused by: java.lang.NullPointerException<br>
        at org.drools.common.DefaultAgenda.createActivation(DefaultAgenda.java:569)<br>
        at<br>
org.drools.reteoo.RuleTerminalNode.modifyLeftTuple(RuleTerminalNode.java:297)<br>
        at<br>
org.drools.reteoo.SingleLeftTupleSinkAdapter.propagateModifyChildLeftTuple(SingleLeftTupleSinkAdapter.java:246)<br>
        at org.drools.reteoo.JoinNode.modifyLeftTuple(JoinNode.java:363)<br>
        at<br>
org.drools.reteoo.SingleLeftTupleSinkAdapter.propagateModifyChildLeftTuple(SingleLeftTupleSinkAdapter.java:272)<br>
        at<br>
org.drools.reteoo.EvalConditionNode.modifyLeftTuple(EvalConditionNode.java:213)<br>
        at<br>
org.drools.reteoo.SingleLeftTupleSinkAdapter.propagateModifyChildLeftTuple(SingleLeftTupleSinkAdapter.java:259)<br>
        at<br>
org.drools.reteoo.FromNode.checkConstraintsAndPropagate(FromNode.java:337)<br>
        at org.drools.reteoo.FromNode.modifyLeftTuple(FromNode.java:281)<br>
        at<br>
org.drools.reteoo.CompositeLeftTupleSinkAdapter.propagateModifyChildLeftTuple(CompositeLeftTupleSinkAdapter.java:316)<br>
        at org.drools.reteoo.JoinNode.modifyRightTuple(JoinNode.java:273)<br>
        at org.drools.reteoo.BetaNode.modifyObject(BetaNode.java:531)<br>
        at org.drools.reteoo.JoinNode.modifyObject(JoinNode.java:446)<br>
        at<br>
org.drools.reteoo.CompositeObjectSinkAdapter.doPropagateModifyObject(CompositeObjectSinkAdapter.java:507)<br>
        at<br>
org.drools.reteoo.CompositeObjectSinkAdapter.propagateModifyObject(CompositeObjectSinkAdapter.java:432)<br>
        at org.drools.reteoo.ObjectTypeNode.modifyObject(ObjectTypeNode.java:314)<br>
        at org.drools.reteoo.EntryPointNode.modifyObject(EntryPointNode.java:265)<br>
        at org.drools.common.NamedEntryPoint.update(NamedEntryPoint.java:470)<br>
        at org.drools.common.NamedEntryPoint.update(NamedEntryPoint.java:370)<br>
        at<br>
org.drools.base.DefaultKnowledgeHelper.update(DefaultKnowledgeHelper.java:317)<br>
        at<br>
org.drools.base.DefaultKnowledgeHelper.update(DefaultKnowledgeHelper.java:329)<br>
        at<br>
org.drools.base.DefaultKnowledgeHelper.update(DefaultKnowledgeHelper.java:325)<br>
        ... 49 more<br>
<br>
<br>
<br>
<br>
-----<br>
- Prashanth<br>
--<br>
View this message in context: <a href="http://drools.46999.n3.nabble.com/Abstracting-Rules-using-extends-tp4023217.html" target="_blank">http://drools.46999.n3.nabble.com/Abstracting-Rules-using-extends-tp4023217.html</a><br>

Sent from the Drools: User forum mailing list archive at Nabble.com.<br>
_______________________________________________<br>
rules-users mailing list<br>
<a href="mailto:rules-users@lists.jboss.org">rules-users@lists.jboss.org</a><br>
<a href="https://lists.jboss.org/mailman/listinfo/rules-users" target="_blank">https://lists.jboss.org/mailman/listinfo/rules-users</a><br>
</blockquote></div><br></div></div></div>