<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't really been given up to now.<br><div><div class="gmail_extra"><br></div>
<div class="gmail_extra">But, for the scenario that's been presented here, I'm inclined to think that an approach without extends would be much better:<br><ul><li>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.</li>
<li>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.</li>
</ul></div><div class="gmail_extra"><br>rule "Custom|2"<br>
enabled true<br>
when<br>
$vehicle:Vehicle(modelYear > 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"><<a href="mailto:arul.prashanth@gmail.com" target="_blank">arul.prashanth@gmail.com</a>></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 "Rule|1"<br>
no-loop true<br>
when<br>
$CONSTANT : RuleConstant();<br>
$vehicles : Vehicles();<br>
$vehicle:Vehicle(modelYear > 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't work and throws the below said Null<br>
Pointer Exception<br>
<br>
*BaseRule.drl*<br>
<br>
/package com.xyz.base<br>
<br>
rule "Base|1"<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 "Custom|1" extends "Base|1"<br>
no-loop true<br>
enabled true<br>
when<br>
$vehicle:Vehicle(modelYear > 2000, type = $CONSTANT.SEDAN) from<br>
$vehicles.Vehicle;<br>
then<br>
$vehicle.setValue(100);<br>
update($vehicles);<br>
end<br>
<br>
rule "Custom|2" extends "Base|1"<br>
no-loop true<br>
enabled true<br>
when<br>
$vehicle:Vehicle(modelYear > 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>