I have been reading through the documentation and trying some of the tutorials and have a question about the no-loop attribute. <br><br>Not really relevant to the post, but I figured I would mention it, I have been following this post and updating it to use the current version of Drools. <a href="http://www.onjava.com/pub/a/onjava/2005/08/03/drools.html?page=7">http://www.onjava.com/pub/a/onjava/2005/08/03/drools.html?page=7</a> <br>
<br>I have written my rules as such:<br><br>package org.drools.examples<br><br>import org.drools.examples.StockOffer;<br><br>rule PriceBelow100<br> dialect "java" <br> when<br> s: StockOffer( stockPrice < 100 && recommendPurchase == null )<br>
then<br> modify( s ) {<br> setRecommendPurchase(StockOffer.YES)<br> }<br>end<br><br>rule NegativeStockPrice<br> dialect "java" <br> no-loop true<br> when<br> s: StockOffer( stockPrice < 0 )<br>
then<br> modify( s ) {<br> setRecommendPurchase(StockOffer.NO)<br> }<br>end <br><br>rule DontBuyXYZStock<br> dialect "java" <br> no-loop true<br> when<br> s: StockOffer(stockName == "XYZ" && stockPrice < 10 )<br>
then<br> modify( s ) {<br> setRecommendPurchase(StockOffer.YES)<br> }<br>end <br><br>rule BuyXYZStock<br> dialect "java" <br> no-loop true<br> when<br> s: StockOffer(stockName == "XYZ" && stockPrice > 10 )<br>
then<br> modify( s ) {<br> setRecommendPurchase(StockOffer.NO)<br> }<br>end <br><br><br><br>My question is, why do I have to put no-loop on every rule (except for the first). After the first time through the rules, it shouldn't be modifying to where the rules would fire it again. Am I doing something wrong with how my rules are written? My sample data is this:<br>
<br>package org.drools.examples;<br><br>import org.drools.examples.BusinessLayer;<br>import org.drools.examples.StockOffer;<br><br>import junit.framework.TestCase;<br><br>/*<br> * JUnit test for the business rules in the <br>
* application.<br> * <br> * This also acts a 'simulator' for the business <br> * rules - allowing us to specify the inputs,<br> * examine the outputs and see if they match our <br> * expectations before letting the code loose in <br>
* the real world.<br> */<br>public class BusinessRuleTest extends TestCase {<br> /**<br> * Tests the purchase of a stock<br> */<br> public void testStockBuy() throws Exception {<br><br> // Create a Stock with simulated values<br>
StockOffer testOffer = new StockOffer();<br> testOffer.setStockName("MEGACORP");<br> testOffer.setStockPrice(22);<br> testOffer.setStockQuantity(1000);<br><br> // Run the rules on it<br>
BusinessLayer.evaluateStockPurchase(testOffer);<br><br> // Is it what we expected?<br> assertTrue(testOffer.getRecommendPurchase() != null);<br><br> assertTrue("YES".equals(testOffer.getRecommendPurchase()));<br>
}<br><br> /**<br> * Tests the purchase of a stock makes sure the system will not accept<br> * negative numbers.<br> */<br> public void testNegativeStockBuy() throws Exception {<br><br> // Create a Stock with our simulated values<br>
StockOffer testOffer = new StockOffer();<br> testOffer.setStockName("MEGACORP");<br> testOffer.setStockPrice(-22);<br> testOffer.setStockQuantity(1000);<br><br> // Run the rules on it<br>
BusinessLayer.evaluateStockPurchase(testOffer);<br><br> // Is it what we expected?<br> assertTrue("NO".equals(testOffer.getRecommendPurchase()));<br> }<br><br> /**<br> * Makes sure the system will buy stocks of XYZ corp only if it really cheap<br>
*/<br> public void testXYZStockBuy() throws Exception {<br><br> // Create a Stock with our simulated values<br> StockOffer testOfferLow = new StockOffer();<br> StockOffer testOfferHigh = new StockOffer();<br>
<br> testOfferLow.setStockName("XYZ");<br> testOfferLow.setStockPrice(9);<br> testOfferLow.setStockQuantity(1000);<br><br> testOfferHigh.setStockName("XYZ");<br> testOfferHigh.setStockPrice(11);<br>
testOfferHigh.setStockQuantity(1000);<br><br> // Run the rules on it and test<br> BusinessLayer.evaluateStockPurchase(testOfferLow);<br> assertTrue("YES".equals(testOfferLow.getRecommendPurchase()));<br>
<br> BusinessLayer.evaluateStockPurchase(testOfferHigh);<br> assertTrue("NO".equals(testOfferHigh.getRecommendPurchase()));<br> }<br>}<br><br><br>I can post up all the code if this isn't enough to answer the question.<br>
<br>Thanks!<br>