[rules-users] Nested properties and memberOf

Edson Tirelli tirelli at post.com
Fri Jul 16 16:33:00 EDT 2010


     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 <mkunnumpurath at googlemail.com>

> 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 <
> mkunnumpurath at googlemail.com> wrote:
>
>> Thanks Edson.
>>
>> That worked like a treat
>>
>> CreditTransferTransactionInformation10( eval( !( accountNumbers contains
>> dbtrAcct.?id.?othr.?id ) ) )
>>
>> Regards
>> Meeraj
>>
>> 2010/7/16 Edson Tirelli <tirelli at post.com>
>>
>>    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 <mkunnumpurath at googlemail.com>
>>>
>>>> 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 <dsinclair at chariotsolutions.com>
>>>>
>>>> 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 <mkunnumpurath at googlemail.com>
>>>>>
>>>>>>  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
>>>>>> rules-users at lists.jboss.org
>>>>>> https://lists.jboss.org/mailman/listinfo/rules-users
>>>>>>
>>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> rules-users mailing list
>>>>> rules-users at lists.jboss.org
>>>>> https://lists.jboss.org/mailman/listinfo/rules-users
>>>>>
>>>>>
>>>>
>>>> _______________________________________________
>>>> rules-users mailing list
>>>> rules-users at lists.jboss.org
>>>> 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
>>> rules-users at lists.jboss.org
>>> https://lists.jboss.org/mailman/listinfo/rules-users
>>>
>>>
>>
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
>


-- 
  Edson Tirelli
  JBoss Drools Core Development
  JBoss by Red Hat @ www.jboss.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20100716/c47bf260/attachment.html 


More information about the rules-users mailing list