<br> Alessandro,<br><br> I'm not sure what the problem in your case is, but the syntax I showed you is the correct syntax for forall, since a forall is nothing more than not( A() and not( B() ... ) ).<br> I created a JUnit 3 test case (since people was asking for junit examples) to reproduce the scenario and it works just fine:<br>
<br>================<br> public void testExpenses() throws Exception {<br> Reader source = new InputStreamReader( getClass().getResourceAsStream( "/expenses.drl" ) );<br> PackageBuilder builder = new PackageBuilder();<br>
builder.addPackageFromDrl( source );<br> <br> RuleBase ruleBase = RuleBaseFactory.newRuleBase();<br> ruleBase.addPackage( builder.getPackage() );<br> <br> StatefulSession session = ruleBase.newStatefulSession();<br>
ArrayList<ExpenseReport> results = new ArrayList<ExpenseReport>();<br> session.setGlobal( "results", results );<br> <br> // CASE 1: empty expense report, should fire<br> ExpenseReport report1 = new ExpenseReport(new ArrayList<ExpenseDetail>());<br>
session.insert( report1 );<br> session.fireAllRules();<br> <br> assertEquals( 1, results.size() );<br> assertEquals( report1, results.get( 0 ));<br> <br> // CASE 2: non-empty expense report, with mixed details, should NOT fire<br>
ExpenseDetail[] details2 = new ExpenseDetail[] { new ExpenseDetail(ExpenseType.TAX), new ExpenseDetail( ExpenseType.MEAL ) };<br> ExpenseReport report2 = new ExpenseReport(Arrays.asList( details2 ));<br> session.insert( report2 );<br>
session.fireAllRules();<br> <br> assertEquals( 1, results.size() );<br> <br> // CASE 3: non-empty expense report, with TAX-only details, should fire<br> ExpenseDetail[] details3 = new ExpenseDetail[] { new ExpenseDetail(ExpenseType.TAX), new ExpenseDetail( ExpenseType.TAX ) };<br>
ExpenseReport report3 = new ExpenseReport(Arrays.asList( details3 ));<br> session.insert( report3 );<br> session.fireAllRules();<br> <br> assertEquals( 2, results.size() );<br> assertEquals( report3, results.get( 1 ));<br>
}<br><br>==========<br>package com.sample<br><br>global java.util.List results;<br><br>rule "Check all expenses"<br>when<br> $report: ExpenseReport($expenseDetails: expenseDetails)<br> not ( $ed : ExpenseDetail() from $expenseDetails and<br>
not ( ExpenseDetail( this == $ed, type == ExpenseType.TAX ) from $expenseDetails )<br> )<br>then<br> results.add( $report );<br>end<br>===========<br><br> If you can make this test break showing your problem, I may be able to help you out.<br>
<br> Thanks for opening the JIRA.<br><br> []s<br> Edson<br><br><br><div class="gmail_quote">2008/5/19 Alessandro Di Bella <<a href="mailto:aldibella@gmail.com">aldibella@gmail.com</a>>:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Hi,<br>
<br>
thanks for your help, I created the JIRA as requested (<a href="http://jira.jboss.org/jira/browse/JBRULES-1611" target="_blank">http://jira.jboss.org/jira/browse/JBRULES-1611</a>).<br>
<br>
The workaround you suggest works only partially, if any of the ExpenseDetails is of type ExpenseType.TAX it will fire the rule.<br>
<br>
What I would like to do is to fire the rule only if all ExpenseDetails in the same report are of type ExpenseType.TAX.<br>
<br>
Any help is more than welcome.<br>
<br>
Thanks<br>
<br>
Alessandro<br>
<br>
Edson Tirelli wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div class="Ih2E3d">
<br>
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.<br>
<br>
Anyway, for your case, the workaround is simply to use the "raw" forall-equivalence: not( A() and not( B() ) ). So try this:<br>
<br>
rule "Do Not Process TAX" when<br>
$report: ExpenseReport($expenseDetails: expenseDetails)<br>
not ( $ed : ExpenseDetails() from $expenseDetails and<br>
not ( ExpenseDetails( this == $ed, expenseType == ExpenseType.TAX ) from $expenseDetails )<br>
)<br>
then<br>
System.out.println("################ It works ##################");<br>
insertLogical("Bypass Process");<br>
end<br>
<br>
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:<br>
<br>
rule "Do Not Process TAX" when<br>
$report: ExpenseReport($expenseDetails: expenseDetails)<br>
forall ( ExpenseDetails( expenseType == ExpenseType.TAX ) from $expenseDetails )<br>
then<br>
System.out.println("################ It works ##################");<br>
insertLogical("Bypass Process");<br>
end<br>
<br>
BTW, may I ask you please to open a JIRA so we don't forget to fix this for 5.0?<br>
<br>
Thanks,<br>
Edson<br>
<br>
<br>
<br></div>
2008/5/18 Alessandro Di Bella <<a href="mailto:aldibella@gmail.com" target="_blank">aldibella@gmail.com</a> <mailto:<a href="mailto:aldibella@gmail.com" target="_blank">aldibella@gmail.com</a>>>:<div class="Ih2E3d">
<br>
<br>
Hi,<br>
<br>
I have these two classes:<br>
<br>
ExpenseReport{<br>
Collection<ExpenseDetails> expenseDetails<br>
}<br>
ExpenseDetails{ ExpenseReport document<br>
ExpenseType expenseType<br>
}<br>
<br>
I am trying to create a rule that fires when all the ExpenseDetails in a<br>
ExpenseReport are of the same type:<br>
<br>
rule "Do Not Process TAX" when<br>
$report: ExpenseReport($expenseDetails: expenseDetails)<br>
forall ( ExpenseDetails(document==$report, expenseType<br>
== ExpenseType.TAX)<br>
) then<br>
System.out.println("################ It works<br>
##################");<br>
insertLogical("Bypass Process");<br>
end<br>
<br>
For some reasons, it fires regardless that value of<br>
ExpenseDetails.expenseType.<br>
<br>
I just started with drools and any help i more than welcome.<br>
<br>
Thanks<br>
<br>
_______________________________________________<br>
rules-users mailing list<br></div>
<a href="mailto:rules-users@lists.jboss.org" target="_blank">rules-users@lists.jboss.org</a> <mailto:<a href="mailto:rules-users@lists.jboss.org" target="_blank">rules-users@lists.jboss.org</a>><div class="Ih2E3d">
<br>
<a href="https://lists.jboss.org/mailman/listinfo/rules-users" target="_blank">https://lists.jboss.org/mailman/listinfo/rules-users</a><br>
<br>
<br>
<br>
<br>
-- <br>
Edson Tirelli<br>
JBoss Drools Core Development<br>
Office: +55 11 3529-6000<br>
Mobile: +55 11 9287-5646<br></div>
JBoss, a division of Red Hat @ <a href="http://www.jboss.com" target="_blank">www.jboss.com</a> <<a href="http://www.jboss.com" target="_blank">http://www.jboss.com</a>><br>
<br>
<br>
------------------------------------------------------------------------<div class="Ih2E3d"><br>
<br>
_______________________________________________<br>
rules-users mailing list<br>
<a href="mailto:rules-users@lists.jboss.org" target="_blank">rules-users@lists.jboss.org</a><br>
<a href="https://lists.jboss.org/mailman/listinfo/rules-users" target="_blank">https://lists.jboss.org/mailman/listinfo/rules-users</a><br>
</div></blockquote><div><div></div><div class="Wj3C7c">
<br>
_______________________________________________<br>
rules-users mailing list<br>
<a href="mailto:rules-users@lists.jboss.org" target="_blank">rules-users@lists.jboss.org</a><br>
<a href="https://lists.jboss.org/mailman/listinfo/rules-users" target="_blank">https://lists.jboss.org/mailman/listinfo/rules-users</a><br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br> Edson Tirelli<br> JBoss Drools Core Development<br> Office: +55 11 3529-6000<br> Mobile: +55 11 9287-5646<br> JBoss, a division of Red Hat @ <a href="http://www.jboss.com">www.jboss.com</a>