决策表使用方式
在Drools中,决策表通常是以Excel(.xls或.xlsx)或者CSV格式存储的,这些格式的决策表并不能直接被Drools执行。它们需要被转换成Drools规则语言(DRL)的文本格式,之后才能被编译和执行。Drools提供了工具来帮助完成这一转换,主要使用org.drools.decisiontable.SpreadsheetCompiler类,以下是一个基本的转换过程
这是我的决策表:表一( Pricing bracket)
表二(Discounts)
文件名称:ExamplePolicyPricing.xls,的结构目录:
// 加载决策表文件InputStream is = DecisionTableToDRL.class.getResourceAsStream("/path/to/decisiontable.xls");// 创建SpreadsheetCompiler实例SpreadsheetCompiler compiler = SpreadsheetCompilerFactory.newCompiler();// 转换决策表为DRLString drl = compiler.compile(is, "UTF-8", "decisiontable");// 打印DRL规则System.out.println(drl);
xls转为drl结果为:
package com.mk.examples.decisiontable; //generated from Decision Table import com.mking.drools.bean.decisiontable.*; // rule values at B9, header at B4 rule "Pricing bracket_9" whenDriver(age >= 18, age <= 24, locationRiskProfile == "LOW", priorClaims == "1")policy: Policy(type == "COMPREHENSIVE") thenpolicy.setBasePrice(450); end// rule values at B10, header at B4 rule "Pricing bracket_10" whenDriver(age >= 18, age <= 24, locationRiskProfile == "MED")policy: Policy(type == "FIRE_THEFT") thenpolicy.setBasePrice(200);System.out.println("Priors not relevant"); end// rule values at B11, header at B4 rule "Pricing bracket_11" whenDriver(age >= 18, age <= 24, locationRiskProfile == "MED", priorClaims == "0")policy: Policy(type == "COMPREHENSIVE") thenpolicy.setBasePrice(300); end// rule values at B12, header at B4 rule "Pricing bracket_12" whenDriver(age >= 18, age <= 24, locationRiskProfile == "LOW")policy: Policy(type == "FIRE_THEFT") thenpolicy.setBasePrice(150); end// rule values at B13, header at B4 rule "Pricing bracket_13" whenDriver(age >= 18, age <= 24, locationRiskProfile == "LOW", priorClaims == "0")policy: Policy(type == "COMPREHENSIVE") thenpolicy.setBasePrice(150);System.out.println("Safe driver discount"); end// rule values at B14, header at B4 rule "Pricing bracket_14" whenDriver(age >= 18, age <= 24, locationRiskProfile == "MED", priorClaims == "1")policy: Policy(type == "COMPREHENSIVE") thenpolicy.setBasePrice(700); end// rule values at B15, header at B4 rule "Pricing bracket_15" whenDriver(age >= 18, age <= 24, locationRiskProfile == "HIGH", priorClaims == "0")policy: Policy(type == "COMPREHENSIVE") thenpolicy.setBasePrice(700);System.out.println("Location risk"); end// rule values at B16, header at B4 rule "Pricing bracket_16" whenDriver(age >= 18, age <= 24, locationRiskProfile == "HIGH")policy: Policy(type == "FIRE_THEFT") thenpolicy.setBasePrice(550);System.out.println("Location risk"); end// rule values at B17, header at B4 rule "Pricing bracket_17" whenDriver(age >= 25, age <= 30, priorClaims == "0")policy: Policy(type == "COMPREHENSIVE") thenpolicy.setBasePrice(120);System.out.println("Cheapest possible"); end// rule values at B18, header at B4 rule "Pricing bracket_18" whenDriver(age >= 25, age <= 30, priorClaims == "1")policy: Policy(type == "COMPREHENSIVE") thenpolicy.setBasePrice(300); end// rule values at B19, header at B4 rule "Pricing bracket_19" whenDriver(age >= 25, age <= 30, priorClaims == "2")policy: Policy(type == "COMPREHENSIVE") thenpolicy.setBasePrice(590); end// rule values at B20, header at B4 rule "Pricing bracket_20" whenDriver(age >= 25, age <= 35, priorClaims == "3")policy: Policy(type == "THIRD_PARTY") thenpolicy.setBasePrice(800);System.out.println("High risk"); end// rule values at B27, header at B22 rule "Discounts_27" whenDriver(age >= 20, age <= 24, priorClaims == "0")policy: Policy(type == "COMPREHENSIVE") thenpolicy.applyDiscount(1); end// rule values at B28, header at B22 rule "Discounts_28" whenDriver(age >= 18, age <= 24, priorClaims == "0")policy: Policy(type == "FIRE_THEFT") thenpolicy.applyDiscount(2); end// rule values at B29, header at B22 rule "Discounts_29" whenDriver(age >= 25, age <= 30, priorClaims == "1")policy: Policy(type == "COMPREHENSIVE") thenpolicy.applyDiscount(5); end// rule values at B30, header at B22 rule "Discounts_30" whenDriver(age >= 25, age <= 30, priorClaims == "2")policy: Policy(type == "COMPREHENSIVE") thenpolicy.applyDiscount(1); end// rule values at B31, header at B22 rule "Discounts_31" whenDriver(age >= 25, age <= 30, priorClaims == "0")policy: Policy(type == "COMPREHENSIVE") thenpolicy.applyDiscount(20); end
执行drl代码及结果
动态加载drl可以参考该文:Drools实践与动态加载
以下是drl解析过程:
KieHelper kieHelper = new KieHelper(); kieHelper.addContent(drl, ResourceType.DRL);KieSession ksession = kieHelper.build().newKieSession(); Driver def = new Driver(); Policy policy = new Policy(); ksession.insert(def); ksession.insert(policy); int count = ksession.fireAllRules(); ksession.dispose();
总结:决策表其实就是Excel转化为DRL文件的过程