[rules-users] Re: How check if all the values in a collection match a criteria

Alessandro Di Bella aldibella at gmail.com
Mon May 19 04:50:20 EDT 2008


Hi,

thanks for your help, I created the JIRA as requested 
(http://jira.jboss.org/jira/browse/JBRULES-1611).

The workaround you suggest works only partially, if any of the 
ExpenseDetails is of type ExpenseType.TAX it will fire the rule.

What I would like to do is to fire the rule only if all ExpenseDetails 
in the same report are of type ExpenseType.TAX.

Any help is more than welcome.

Thanks

Alessandro

Edson Tirelli wrote:
> 
>    Hmm, now that you mentioned, I see that our parser is limiting the 
> forall() CE, not allowing nested "from" CEs. This is something we should 
> fix, since the limitation is purely a parser limitation.
> 
>    Anyway, for your case, the workaround is simply to use the "raw" 
> forall-equivalence: not( A() and not( B() ) ). So try this:
> 
> rule "Do Not Process TAX"                        when
>                $report: ExpenseReport($expenseDetails: expenseDetails)
>                not ( $ed : ExpenseDetails() from $expenseDetails and
>                      not ( ExpenseDetails( this == $ed, expenseType == 
> ExpenseType.TAX ) from $expenseDetails )
>                )
>  then
>                System.out.println("################ It works 
> ##################");
>                insertLogical("Bypass Process");
> end
> 
>    This is just more verbose than the forall, but it is exactly the 
> same. Once the parser is fixed, you will be able to simply write:
> 
> rule "Do Not Process TAX"                        when
>                $report: ExpenseReport($expenseDetails: expenseDetails)
>                forall ( ExpenseDetails( expenseType == ExpenseType.TAX ) 
> from $expenseDetails )
>  then
>                System.out.println("################ It works 
> ##################");
>                insertLogical("Bypass Process");
> end
> 
>     BTW, may I ask you please to open a JIRA so we don't forget to fix 
> this for 5.0?
> 
>     Thanks,
>          Edson
> 
> 
> 
> 2008/5/18 Alessandro Di Bella <aldibella at gmail.com 
> <mailto:aldibella at gmail.com>>:
> 
>     Hi,
> 
>     I have these two classes:
> 
>     ExpenseReport{
>      Collection<ExpenseDetails> expenseDetails
>     }
>     ExpenseDetails{    ExpenseReport document
>      ExpenseType expenseType
>     }
> 
>     I am trying to create a rule that fires when all the ExpenseDetails in a
>     ExpenseReport  are of the same type:
> 
>     rule "Do Not Process TAX"                        when
>                    $report: ExpenseReport($expenseDetails: expenseDetails)
>                    forall (                        
>                            ExpenseDetails(document==$report, expenseType
>     == ExpenseType.TAX)
>                    )          then
>                    System.out.println("################ It works
>     ##################");
>                    insertLogical("Bypass Process");
>     end
> 
>     For some reasons, it fires regardless that value of
>     ExpenseDetails.expenseType.
> 
>     I just started with drools and any help i more than welcome.
> 
>     Thanks
> 
>     _______________________________________________
>     rules-users mailing list
>     rules-users at lists.jboss.org <mailto:rules-users at lists.jboss.org>
>     https://lists.jboss.org/mailman/listinfo/rules-users
> 
> 
> 
> 
> -- 
> Edson Tirelli
> JBoss Drools Core Development
> Office: +55 11 3529-6000
> Mobile: +55 11 9287-5646
> JBoss, a division of Red Hat @ www.jboss.com <http://www.jboss.com>
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users




More information about the rules-users mailing list