Thanks Edson, will do that. 2010/7/16 Edson Tirelli <[email protected]>
> Whatever you write inside an eval() passes through to the chosen > dialect. > > 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. > > Edson > > 2010/7/16 Meeraj Kunnumpurath <[email protected]> > >> Hi Edson, >> >> Just as a matter of interest ... How come the grammar recognizes the >> null-safe accessors below >> >> CreditTransferTransactionInformation10( eval( !( accountNumbers contains >> dbtrAcct.?id.?othr.?id ) ) ) >> >> and not >> >> CreditTransferTransactionInformation10(dbtrAcct.?id.?othr.?id not memberOf >> accountNumbers ) >> >> Kind regards >> Meeraj >> >> >> On Fri, Jul 16, 2010 at 7:57 PM, Meeraj Kunnumpurath < >> [email protected]> wrote: >> >>> Thanks Edson. >>> >>> That worked like a treat >>> >>> CreditTransferTransactionInformation10( eval( !( accountNumbers contains >>> dbtrAcct.?id.?othr.?id ) ) ) >>> >>> Regards >>> Meeraj >>> >>> 2010/7/16 Edson Tirelli <[email protected]> >>> >>> It does short circuit on "constraints". Not on patterns. >>>> >>>> The problem is your assumption that rules are executed in order. They >>>> are not. Check the manual for "Conflict Resolution". >>>> >>>> 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. >>>> >>>> The shortest syntax for your case is to use an mvel inline eval using >>>> the null-safe navigation: >>>> >>>> rule X >>>> dialect "mvel" >>>> when >>>> ... >>>> CreditTransferTransactionInformation10( eval( !( accountNumbers >>>> contains dbtrAcct.?id.?othr.?id ) ) ) >>>> ... >>>> >>>> Of course, you can do all the null checks in the pattern itself, >>>> avoiding the need to use the mvel syntax. >>>> >>>> Edson >>>> >>>> >>>> 2010/7/16 Meeraj Kunnumpurath <[email protected]> >>>> >>>>> Thanks Dave. >>>>> >>>>> I think the '||' on rule 1 is getting short-circuited. However, it is >>>>> the '&&' on rule 2 that is not getting short circuited. >>>>> >>>>> Kind regards >>>>> Meeraj >>>>> >>>>> 2010/7/16 David Sinclair <[email protected]> >>>>> >>>>> 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. >>>>>> >>>>>> dave >>>>>> >>>>>> >>>>>> >>>>>> 2010/7/16 Meeraj Kunnumpurath <[email protected]> >>>>>> >>>>>>> Hi, >>>>>>> >>>>>>> I have the following rules, >>>>>>> >>>>>>> global java.util.Set accountNumbers; >>>>>>> >>>>>>> rule "rule 1" >>>>>>> when >>>>>>> $d : Document() >>>>>>> $c : CreditTransferTransactionInformation (dbtrAcct == null || >>>>>>> dbtrAcct.id == null || dbtrAcct.id.othr == null || >>>>>>> dbtrAcct.id.othr.id == null) from $d.cstmrCdtTrfInitn.cdtTrfTxInf >>>>>>> $i : InternalInfo() from $c.internalInfo >>>>>>> then >>>>>>> $i.setStatus(PaymentStatus.INVALID); >>>>>>> $i.setErrorCode("PR002"); >>>>>>> $i.setAdditionalInfo("Account number is null"); >>>>>>> end >>>>>>> >>>>>>> rule "rule 2" >>>>>>> when >>>>>>> $d : Document() >>>>>>> $c : CreditTransferTransactionInformation(internalInfo.status != >>>>>>> PaymentStatus.INVALID && dbtrAcct.id.othr.id not memberOf >>>>>>> accountNumbers) from $d.cstmrCdtTrfInitn.cdtTrfTxInf >>>>>>> $i : InternalInfo() from $c.internalInfo >>>>>>> then >>>>>>> $i.setStatus(PaymentStatus.INVALID); >>>>>>> $i.setErrorCode("PR002"); >>>>>>> $i.setAdditionalInfo("Account number not available in the routing >>>>>>> table"); >>>>>>> end >>>>>>> >>>>>>> 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. >>>>>>> >>>>>>> Caused by: [Error: unable to access property (null parent): id] >>>>>>> [Near : {... Unknown ....}] >>>>>>> ^ >>>>>>> [Line: 1, Column: 0] >>>>>>> at >>>>>>> org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.getMethod(ReflectiveAccessorOptimizer.java:861) >>>>>>> >>>>>>> Regards >>>>>>> Meeraj >>>>>>> >>>>>>> _______________________________________________ >>>>>>> rules-users mailing list >>>>>>> [email protected] >>>>>>> https://lists.jboss.org/mailman/listinfo/rules-users >>>>>>> >>>>>>> >>>>>> >>>>>> _______________________________________________ >>>>>> rules-users mailing list >>>>>> [email protected] >>>>>> https://lists.jboss.org/mailman/listinfo/rules-users >>>>>> >>>>>> >>>>> >>>>> _______________________________________________ >>>>> rules-users mailing list >>>>> [email protected] >>>>> https://lists.jboss.org/mailman/listinfo/rules-users >>>>> >>>>> >>>> >>>> >>>> -- >>>> Edson Tirelli >>>> JBoss Drools Core Development >>>> JBoss by Red Hat @ www.jboss.com >>>> >>>> _______________________________________________ >>>> rules-users mailing list >>>> [email protected] >>>> https://lists.jboss.org/mailman/listinfo/rules-users >>>> >>>> >>> >> >> _______________________________________________ >> rules-users mailing list >> [email protected] >> https://lists.jboss.org/mailman/listinfo/rules-users >> >> > > > -- > Edson Tirelli > JBoss Drools Core Development > JBoss by Red Hat @ www.jboss.com > > _______________________________________________ > rules-users mailing list > [email protected] > https://lists.jboss.org/mailman/listinfo/rules-users > >
_______________________________________________ rules-users mailing list [email protected] https://lists.jboss.org/mailman/listinfo/rules-users
