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(a)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(a)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(a)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(a)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(a)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(a)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(a)lists.jboss.org
>>>>>>
https://lists.jboss.org/mailman/listinfo/rules-users
>>>>>>
>>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> rules-users mailing list
>>>>> rules-users(a)lists.jboss.org
>>>>>
https://lists.jboss.org/mailman/listinfo/rules-users
>>>>>
>>>>>
>>>>
>>>> _______________________________________________
>>>> rules-users mailing list
>>>> rules-users(a)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(a)lists.jboss.org
>>>
https://lists.jboss.org/mailman/listinfo/rules-users
>>>
>>>
>>
>
> _______________________________________________
> rules-users mailing list
> rules-users(a)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(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users