Your rule exhibits procedural thinking. (For an aspiring rule programmer his is typical teething troubles.) <br><br>There&#39;s no need to collect all A&#39;s and B&#39;s in order to determine their number being greater than one or two - this is achieved automatically by a simple triple match rule. Consider<br>
<br>rule &quot;2A - 1B&quot;<br>when<br>   $a1: CartItem( productId == &quot;A&quot;, processed == false )<br>   $a2: CartItem( this != $a1, productId == &quot;A&quot;, processed == false )<br>   $b: CartItem( productId == &quot;B&quot;, processed == false )<br>
then<br>   modify( $a1 ){...}<br>   modify( $a2 ){...}<br>   modify( $b ){...}<br>end<br><br>Note:<br><ul><li>The modify is essential. (When you say &quot;doesn&#39;t work&quot;, always provide details.)</li><li>Use the field name rather than the getter call - it improves readability.</li>
<li>I&#39;m not sure whether 5.2.0 final handles boolean fields correctly - IIRC, there were some issues. It&#39;s possible that CartItem(..., !processed) works. <br></li></ul>-W<br><br><div class="gmail_quote">2011/9/8 Sandeep Bandela <span dir="ltr">&lt;<a href="mailto:gibsosmat@gmail.com">gibsosmat@gmail.com</a>&gt;</span><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>I am new to rules engine, after going through the examples shipped (shopping.drl, petstore.drl)<br>
I am trying to implement promotional discounting using drools 5.2.0 final, stateful session. assume cart has all the items that customer wants to buy,<br>

I am trying to bundle them together with the existing offers<br><br>rule &quot;Buy X units of Product A and Get Y units of Product B Free&quot;<br>    dialect &quot;java&quot;<br>
when<br>    $itemsA : ArrayList( size &gt;= 2) from collect( CartItem( getProductId() == &quot;A&quot;, !isProcessed()))<br>    $itemsB : ArrayList( size &gt;= 1) from collect( CartItem( getProductId() == &quot;B&quot;, !isProcessed()))<br>


then<br>    // current scenario buy 2*A and get 1*B <br>    int x = 2;<br>    int y = 1;<br>    for(int i=0 ; i &lt; x ; i++){<br>        CartItem $ci = (CartItem) $itemsA.get(i);<br>        // modify($ci){setProcessed(true) ... } dosent work<br>


        $ci.setProcessed(true);<br>        $ci.setItemDiscount(0.0);<br>        $ci.setBundleId(bundler.getId());<br>    }<br>    <br>    for(int i=0 ; i &lt; y  ; i++){<br>        CartItem $ci = (CartItem) $itemsB.get(i);<br>


        $ci.setProcessed(true);<br>        $ci.setItemDiscount($ci.getPrice());<br>        $ci.setBundleId(bundler.getId());<br>    }<br>    // global counter to identify bundled items<br>    bundler.increment();<br>end<br>


<br>the above rule calculates only for 1 set of offer i.e first 2*A &amp; 1*B are considered, rest in the cart are not bundled.<br>if customer buys 4*A + 2*B it dosent consider it. am I missing anything? is this the right way to do it?<br>


any feedback is appreciated.<br><br><br><br clear="all"><br>-- <br>Regards,<br><font color="#888888">Sandeep Bandela.<br><br>
</font><br>_______________________________________________<br>
rules-users mailing list<br>
<a href="mailto:rules-users@lists.jboss.org">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>
<br></blockquote></div><br>