Thanks Edson, will do that.<br><br><div class="gmail_quote">2010/7/16 Edson Tirelli <span dir="ltr"><<a href="mailto:tirelli@post.com">tirelli@post.com</a>></span><br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
Whatever you write inside an eval() passes through to the chosen dialect.<div><br></div><div> Although, I agree it might be a good idea to improve that and add support to null-safe accessors in DRL as well. It is just not there. Feel free to open a JIRA with a feature request.</div>
<div><div></div><div class="h5">
<div><br></div><div> Edson<br><br><div class="gmail_quote">2010/7/16 Meeraj Kunnumpurath <span dir="ltr"><<a href="mailto:mkunnumpurath@googlemail.com" target="_blank">mkunnumpurath@googlemail.com</a>></span><br>
<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
Hi Edson,<br><br>Just as a matter of interest ... How come the grammar recognizes the null-safe accessors below<br><br><span style="font-family: arial,sans-serif; font-size: 13px; border-collapse: collapse;"><div>CreditTransferTransactionInformation10(
eval( !( accountNumbers contains dbtrAcct.?id.?othr.?id ) ) )<br><br></div>and not <br><br></span><span style="font-family: arial,sans-serif; font-size: 13px; border-collapse: collapse;">CreditTransferTransactionInformation10(dbtrAcct.?id.?othr.?id not memberOf accountNumbers )</span><br>
<br>Kind regards<br><font color="#888888">Meeraj</font><div><div></div><div><br><br><div class="gmail_quote">On Fri, Jul 16, 2010 at 7:57 PM, Meeraj Kunnumpurath <span dir="ltr"><<a href="mailto:mkunnumpurath@googlemail.com" target="_blank">mkunnumpurath@googlemail.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;">Thanks Edson.<br><br>That worked like a treat <br><br><span style="font-family: arial,sans-serif; font-size: 13px; border-collapse: collapse;"><div>
CreditTransferTransactionInformation10(
eval( !( accountNumbers contains dbtrAcct.?id.?othr.?id ) ) )<br><br></div>Regards<br>Meeraj<br></span><br><div class="gmail_quote">2010/7/16 Edson Tirelli <span dir="ltr"><<a href="mailto:tirelli@post.com" target="_blank">tirelli@post.com</a>></span><div>
<div></div><div><br>
<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"> It does short circuit on "constraints". Not on patterns.<div><br></div><div> The problem is your assumption that rules are executed in order. They are not. Check the manual for "Conflict Resolution".</div>
<div><br></div><div> Also, the LHS of rules are executed at "insert"/"modify" time, so the LHS of both rules will be executed before any of them is fired. </div><div><br></div><div> The shortest syntax for your case is to use an mvel inline eval using the null-safe navigation:</div>
<div><br></div><div>rule X</div><div> dialect "mvel"</div><div>when</div><div> ...</div><div> <span style="font-family: arial,sans-serif; font-size: 13px; border-collapse: collapse;"> CreditTransferTransactionInformation10( eval( !( accountNumbers contains dbtrAcct.?id.?othr.?id ) ) )</span></div>
<div><font face="arial, sans-serif"><span style="border-collapse: collapse;"> ...</span></font></div><div><font face="arial, sans-serif"><span style="border-collapse: collapse;"><br>
</span></font></div><div><font face="arial, sans-serif"><span style="border-collapse: collapse;"> Of course, you can do all the null checks in the pattern itself, avoiding the need to use the mvel syntax. </span></font></div>
<div><font face="arial, sans-serif"><span style="border-collapse: collapse;"><br></span></font></div><div><font face="arial, sans-serif"><span style="border-collapse: collapse;"> Edson</span></font></div>
<div><br><div><div><div></div><div><br><div class="gmail_quote">2010/7/16 Meeraj Kunnumpurath <span dir="ltr"><<a href="mailto:mkunnumpurath@googlemail.com" target="_blank">mkunnumpurath@googlemail.com</a>></span><br>
<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
Thanks Dave.<br><br>I think the '||' on rule 1 is getting short-circuited. However, it is the '&&' on rule 2 that is not getting short circuited.<br><br>Kind regards<br>Meeraj<br><br><div class="gmail_quote">
2010/7/16 David Sinclair <span dir="ltr"><<a href="mailto:dsinclair@chariotsolutions.com" target="_blank">dsinclair@chariotsolutions.com</a>></span><div><div></div><div><br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
Drools doesn't use short circuit evaluation, so all of those ORs are going to be evaluated. You may want to consider re-writing your rules or you can use MVEL's null safe navigation for this. dbtrAcct.?id == null, dbtrAcct.?id.?othr == nulll, etc.<br>
<br>dave<br><br><br><br><div class="gmail_quote">2010/7/16 Meeraj Kunnumpurath <span dir="ltr"><<a href="mailto:mkunnumpurath@googlemail.com" target="_blank">mkunnumpurath@googlemail.com</a>></span><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div><div></div><div>
Hi,<br><br>I have the following rules,<br><br>global java.util.Set accountNumbers;<br><br>rule "rule 1"<br>when<br> $d : Document()<br> $c : CreditTransferTransactionInformation (dbtrAcct == null || dbtrAcct.id == null || dbtrAcct.id.othr == null || <a href="http://dbtrAcct.id.othr.id" target="_blank">dbtrAcct.id.othr.id</a> == null) from $d.cstmrCdtTrfInitn.cdtTrfTxInf<br>
$i : InternalInfo() from $c.internalInfo<br>then<br> $i.setStatus(PaymentStatus.INVALID);<br> $i.setErrorCode("PR002");<br> $i.setAdditionalInfo("Account number is null");<br>end<br><br>rule "rule 2"<br>
when<br> $d : Document()<br> $c : CreditTransferTransactionInformation(internalInfo.status != PaymentStatus.INVALID && <a href="http://dbtrAcct.id.othr.id" target="_blank">dbtrAcct.id.othr.id</a> not memberOf accountNumbers) from $d.cstmrCdtTrfInitn.cdtTrfTxInf<br>
$i : InternalInfo() from $c.internalInfo<br>then<br> $i.setStatus(PaymentStatus.INVALID);<br> $i.setErrorCode("PR002");<br> $i.setAdditionalInfo("Account number not available in the routing table");<br>
end<br><br>My assumption is rule 1 and rule 2 will be executed in the order they appear. Rule 1 checks all the nested attributes are not null and set the status as invalid if any of them is null. Rule 2 uses the and operator and checks the nested attribute is in the collection defined by the global, only if the object is valid. I assume the LHS of rule 2 will be short circuited if the object is invalid. However, if any of the nested property is null I get the following exception from MVEL.<br>
<br>Caused by: [Error: unable to access property (null parent): id]<br>[Near : {... Unknown ....}]<br> ^<br>[Line: 1, Column: 0]<br> at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.getMethod(ReflectiveAccessorOptimizer.java:861)<br>
<br>Regards<br><font color="#888888">Meeraj<br>
</font><br></div></div>_______________________________________________<br>
rules-users mailing list<br>
<a href="mailto:rules-users@lists.jboss.org" target="_blank">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>
<br></blockquote></div><br>
<br>_______________________________________________<br>
rules-users mailing list<br>
<a href="mailto:rules-users@lists.jboss.org" target="_blank">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>
<br></blockquote></div></div></div><br>
<br>_______________________________________________<br>
rules-users mailing list<br>
<a href="mailto:rules-users@lists.jboss.org" target="_blank">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>
<br></blockquote></div><br><br clear="all"><br></div></div>-- <br> Edson Tirelli<br> JBoss Drools Core Development<br> JBoss by Red Hat @ <a href="http://www.jboss.com" target="_blank">www.jboss.com</a><br>
</div></div>
<br>_______________________________________________<br>
rules-users mailing list<br>
<a href="mailto:rules-users@lists.jboss.org" target="_blank">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>
<br></blockquote></div></div></div><br>
</blockquote></div><br>
</div></div><br>_______________________________________________<br>
rules-users mailing list<br>
<a href="mailto:rules-users@lists.jboss.org" target="_blank">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>
<br></blockquote></div><br><br clear="all"><br>-- <br> Edson Tirelli<br> JBoss Drools Core Development<br> JBoss by Red Hat @ <a href="http://www.jboss.com" target="_blank">www.jboss.com</a><br>
</div>
</div></div><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>
<br></blockquote></div><br>