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

Reply via email to