Jboos Drools支持利用电子表格生产的决策表的形式描述规则。droos根据相应的语法和格式要求,会将其装换成相应的drl文件形式的代码。
Decision Tables语法
关于决策表的语法,具体可参考官方文档,这里不一一详述:
https://docs.jboss.org/drools/release/7.3.0.Final/drools-docs/html_single/index.html#_rule_set_entries
Rule Set Entries
Rule attribute entries in the Rule Set area
Column Headers in the Rule Table
决策表使用
决策表的使用非常简单,Drools的sample项目中自带了一个简单的利用电子表格表达决策的样例。这里不再赘述,为了展示Decision Tables的用法,这里给出了一个简单的Demo。
假设我们有一个关于用户评分的需求,根据不同的用户属性,会给出相应的得分,详情见上图。
代码如下:
package com.sample;
import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
/**
* This is a sample class to launch a rule.
*/
public class DecisionTableTest2 {
public static final void main(String[] args) {
try {
// load up the knowledge base
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
KieSession kSession = kContainer.newKieSession("ksession-dtables-test");
Person person = new Person();
// person.setAge(17);
// person.setGender(0);
// person.setZmScore(710);
//
// person.setAge(18);
// person.setGender(0);
// person.setZmScore(650);
//
// person.setAge(18);
// person.setGender(1);
// person.setZmScore(650);
//
// person.setAge(24);
// person.setGender(1);
// person.setZmScore(650);
//
person.setAge(24);
person.setGender(0);
person.setZmScore(652);
//
// person.setAge(24);
// person.setGender(1);
// person.setZmScore(710);
//
// person.setAge(24);
// person.setGender(0);
// person.setZmScore(710);
//
kSession.insert(person);
kSession.fireAllRules();
// kSession.getKieBase().getKiePackages().forEach(pkg->{
// pkg.getRules().forEach(rule->{
// System.out.println(rule.getName());
// });
// });
} catch (Throwable t) {
t.printStackTrace();
}
}
public static class Person {
private int age;
private int gender;
private int zmScore;
private int score = 0;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getGender() {
return gender;
}
public void setGender(int gender) {
this.gender = gender;
}
public int getZmScore() {
return zmScore;
}
public void setZmScore(int zmScore) {
this.zmScore = zmScore;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
}
}
代码的运行结果如下: