Recursion in rules execution
tarandeep.singh Feb 1, 2007 1:16 AMHi,
I've below rules in my rule file, when i execute this drl, it leads to recursion when rules are fired. It'll be really great if somebody can suggest what can be done to avoid recursion during execution of dynamic rules given below.
package com.globallogic.rules import com.thirdpillar.QuoteUpdater import java.lang.String import java.math.BigDecimal global BigDecimal TEMP global BigDecimal GL_SD_Amt rule "gst_rate_ol" no-loop true salience 50 when QuoteUpdater:QuoteUpdater() eval(QuoteUpdater.getCustomerTypeCountry().equals("New Zealand") && QuoteUpdater.isFinanceLease() == true || QuoteUpdater.isRental() == true || QuoteUpdater.isOperatingLease() == true || QuoteUpdater.isHirePurchase() == true) then System.out.println("1"); TEMP = BigDecimal . valueOf ( 0.125 ) ; QuoteUpdater . setQuoteLevelGSTRate ( BigDecimal . valueOf ( TEMP . doubleValue ( ) ) ) ; modify(QuoteUpdater); end rule "NZ_SD" no-loop true salience 45 when QuoteUpdater:QuoteUpdater() eval(QuoteUpdater . getCustomerTypeCountry ( ).equals("New Zealand")) then System.out.println("2"); QuoteUpdater . setQuoteLevelGSTStreamRate ( BigDecimal . valueOf ( 0 ) ) ; QuoteUpdater . setQuoteLevelStampDutyRate ( BigDecimal . valueOf ( 0 ) ) ; GL_SD_Amt = BigDecimal . valueOf ( 0 ) ; QuoteUpdater . setQuoteLevelStampDutyAmount ( BigDecimal . valueOf ( 0 ) ) ; modify(QuoteUpdater); end rule "gst_stream_rate_ol" salience 40 no-loop true when QuoteUpdater:QuoteUpdater() eval(QuoteUpdater.getCustomerTypeCountry().equals("New Zealand") && QuoteUpdater.isRental() == true || QuoteUpdater.isOperatingLease() == true) then System.out.println("3"); TEMP = BigDecimal . valueOf ( 0.125 ) ; QuoteUpdater . setQuoteLevelGSTStreamRate ( BigDecimal . valueOf ( TEMP . doubleValue ( ) ) ) ; modify(QuoteUpdater); end
code in my test class is given below.
/** * */ package com.thirdpillar; import java.io.InputStreamReader; import java.io.Reader; import org.drools.RuleBase; import org.drools.RuleBaseFactory; import org.drools.WorkingMemory; import org.drools.compiler.PackageBuilder; import org.drools.rule.Package; /** * @author tarun.singh * */ public class BasedOnDynamic { /** * @param args */ public static void main(String[] args) { try { QuoteUpdater quoteUpdater = new QuoteUpdater(); quoteUpdater.setCustomerTypeCountry("New Zealand"); quoteUpdater.setFinanceLease(true); quoteUpdater.setRental(true); quoteUpdater.setOperatingLease(true); quoteUpdater.setHirePurchase(true); final Reader source = new InputStreamReader( QuoteUpdater.class.getResourceAsStream( "BasedOnDynamic.drl" ) ); final PackageBuilder builder = new PackageBuilder(); builder.addPackageFromDrl( source ); final Package pkg = builder.getPackage(); final RuleBase ruleBase = RuleBaseFactory.newRuleBase(); ruleBase.addPackage( pkg ); final WorkingMemory workingMemory = ruleBase.newWorkingMemory(); workingMemory.assertObject( quoteUpdater ); workingMemory.fireAllRules(); } catch (Exception e) { e.printStackTrace(); } } }