drools引擎使用决策表

标签: drools 引擎 决策 | 发表时间:2015-02-05 19:33 | 作者:wangmengbk
出处:http://www.iteye.com

前提准备:java 虚拟机 
                 Drools核心库
                 Junit4.0以上版本
                 规则Excel模板表(将下面的图片的内容新建到Excel中)
典型的用法就是根据excel创建KnowledgeBase,然后将它丢给session执行,执行的参数和结果都在params里面

package com.xxx.yyyy;
  2 
  3 import java.io.File;
  4 import java.io.FileInputStream;
  5 import java.io.InputStream;
  6 import java.util.Arrays;
  7 import java.util.Collection;
  8 import java.util.HashMap;
  9 import java.util.Map;
 10 import junit.framework.Assert;
 11 import org.drools.KnowledgeBase;
 12 import org.drools.KnowledgeBaseFactory;
 13 import org.drools.builder.DecisionTableConfiguration;
 14 import org.drools.builder.DecisionTableInputType;
 15 import org.drools.builder.KnowledgeBuilder;
 16 import org.drools.builder.KnowledgeBuilderFactory;
 17 import org.drools.builder.ResourceType;
 18 import org.drools.definition.KnowledgePackage;
 19 import org.drools.io.ResourceFactory;
 20 import org.drools.runtime.StatelessKnowledgeSession;
 21 import org.junit.Test;
 22 import org.junit.runner.RunWith;
 23 import org.junit.runners.Parameterized;
 24 import org.junit.runners.Parameterized.Parameters;
 25 
 26 @RunWith(Parameterized.class)
 27 public class IsP4PTest
 28 {
 29     private IsP4P param;
 30 
 31     private String extected;
 32 
 33     public IsP4PTest(IsP4P param, String extected)
 34     {
 35         this.param = param;
 36         this.extected = extected;
 37     }
 38 public Map<String, Object> getParams()
 39         {
 40             Map<String, Object> params = new HashMap<String, Object>();
 41 
 42             params.put("productLine", productLine);
 43             params.put("productType", productType);
 44             params.put("playType", playType);
 45 
 46             return params;
 47         }
 48 public void testExcel(String fileName, Map<String, Object> params)
 49             throws Exception
 50     {
 51         System.out.println("---------------begin------------------------");
 52 
 53         DecisionTableConfiguration dtableconfiguration = KnowledgeBuilderFactory
 54                 .newDecisionTableConfiguration();
 55 dtableconfiguration.setInputType(DecisionTableInputType.XLS);
 56         final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory
 57                 .newKnowledgeBuilder();
 58 File file = new File(
 59                 "F:\\juny.qu\\rule_workspace\\com.deppon.rules\\src\\main\\java\\com\\xxx\\yyyy\\"
 60                         + fileName);
 61         InputStream is = new FileInputStream(file);
 62 kbuilder.add(ResourceFactory.newInputStreamResource(is, "UTF-8"),
 63                 ResourceType.DTABLE);
 64         if (kbuilder.hasErrors())
 65         {
 66             System.out.println(kbuilder.getErrors().toString());
 67         }
 68 Collection<KnowledgePackage> pkgs = kbuilder.getKnowledgePackages();
 69         KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
 70         kbase.addKnowledgePackages(pkgs);
 71 
 72 StatelessKnowledgeSession ksession = kbase
 73                 .newStatelessKnowledgeSession();
 74         ksession.execute(Arrays.asList(new Object[] { params }));
 75 
 76 System.out.println("---------------end------------------------");
 77 }
 78 
 79 
 80 @Parameters
 81     public static Collection<?> contructData()
 82     {
 83 return Arrays.asList(new Object[][] {
 84                 { new IsP4P("搜索推广", "true", "null"), "true" },
 85                 { new IsP4P("网盟推广", "true", "null"), "true" },
 86                 { new IsP4P("掘金推广", "true", "非轮播"), "false" },
 87                 { new IsP4P("其他", "false", "其他"), "other" } });
 88 }
 89 
 90 @Test
 91     public void testP4P() throws Exception
 92     {
 93         Map<String, Object> params = new HashMap<String, Object>();
 94         params.putAll(param.getParams());
 95         testExcel("ka/isP4P.xls", params);
 96         Assert.assertEquals(extected, params.get("isP4P"));
 97     }
 98 }
 99 
100 

 


  
 1 package com.xxx.yyyy;
 2 
 3 import java.io.File;
 4 import java.io.FileInputStream;
 5 import java.io.FileNotFoundException;
 6 import java.io.InputStream;
 7 
 8 import org.drools.decisiontable.InputType;
 9 import org.drools.decisiontable.SpreadsheetCompiler;
10 import org.junit.Test;
11 
12 public class SpreadsheetCompilerTest {
13 
14 @Test
15     public void compile() throws FileNotFoundException{
16         //File file = new File("F:\\juny.qu\\rule_workspace\\com.deppon.rules\\src\\main\\java\\com\\xxx\\yyyy\\ka\\isP4P.xls");
17         //File file = new File("F:\\collections_study\\规则引擎系统开发小组\\规则引擎doc\\02开发\\06-详细设计\\增值服务折扣测试1.xls");
18         File file = new File("F:\\rules.xlsx");
19         
20         InputStream is = new FileInputStream(file);
21         
22         SpreadsheetCompiler converter = new SpreadsheetCompiler();
23         String drl = converter.compile(is, InputType.XLS); //--------exception here-------- 
24         System.out.println("\n\n" + drl);
25         
26     }
27 
28 }
运行结果如下:package rule_table;
//generated from Decision Table
import java.util.*;
// rule values at B22, header at B17
rule "ContractP4P_22"
when
$constract:java.util.HashMap($constract.get("productLine")=="搜索推广")
$constract.get("productType")=="true"
$constract.get("playType")=="null"
then
$constract.put("isP4P","true");
end
// rule values at B23, header at B17
rule "ContractP4P_23"
when
$constract.get("playType")=="null"
then
$constract.put("isP4P","true");
end
// rule values at B24, header at B17
rule "ContractP4P_24"
when
$constract:java.util.HashMap($constract.get("productLine")=="掘金推广")
$constract.get("productType")=="true"
$constract.get("playType")=="非轮播"
then
$constract.put("isP4P","false");
end
// rule values at B25, header at B17
rule "ContractP4P_25"
when
$constract:java.util.HashMap($constract.get("productLine")=="其他")
$constract.get("productType")=="false"
$constract.get("playType")=="其他"
then
$constract.put("isP4P","other");
end 
 
  • 什么时候考虑使用规则表
  如果规则可以表示成 templates+data(模板+数据),可以考虑使用 decision tables。在决策表的每一行,采集数据和模板一起生成规则。使用基于决策表的Spreadsheet的API在Drools-decisiontables模块中。只有一个类:SpreadsheetCompiler. 这个类可以操作各种格式的Spreadsheet,并生成DRL规则(然后就可以常规的方式使用)。
一个典型的规则表的格式

    
 
决策表中的关键字说明:

    
 
    
 


已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [drools 引擎 决策] 推荐:

drools引擎使用决策表

- - 行业应用 - ITeye博客
前提准备:java 虚拟机 .                  Drools核心库.                  Junit4.0以上版本.                  规则Excel模板表(将下面的图片的内容新建到Excel中). 典型的用法就是根据excel创建KnowledgeBase,然后将它丢给session执行,执行的参数和结果都在params里面.

Spring + Activiti + Drools整合的请假例子

- - CSDN博客推荐文章
业务规则是这样的(没有实际意义,只是做demo演示). 如果请假总天数大于等于3天,则需要总经理审批,否则不需要总经理审批. 如果当次请假小于3天,则请假总天数等于当次请假天数+2. 否则,请假总天数等于当次请假次数+5. 其中,总的请假次数的计算逻辑交给drools处理. 新建maven项目,目录结构如下:.

JS游戏引擎

- 米随随 - HTML5研究小组
If you don’t have anything better to do and want to help fellow redditors interested in JS game dev out, feel free to fork the list and modify it as you like.

mysql 引擎优化

- - CSDN博客推荐文章
MySQL数 据库引擎取决于MySQL在安装的时候是如何被编译的. 要添加一个新的引擎,就必须重新编译MYSQL. 在缺省情况下,MYSQL支持三个引擎:ISAM、MYISAM和HEAP. 另外两种类型INNODB和BERKLEY(BDB),也常常可以使用. 如果技术高超,还可以使用MySQL++ API自己做一个引擎.

谈流程引擎

- - 人月神话的BLOG
在分布式的架构中,流程引擎和权限引擎也不适合分离构建,两者之间的耦合度相当高,一个好的流程引擎首先要依赖于一个完善的权限模型和架构,其中包括了细粒度的数据权限控制等. 流程引擎中会产生动态权限控制,动态权限和静态权限的区别是静态权限是固定的,而动态权限是跟随流程节点的执行动态变化的,如当你处理到某个流程节点的时候,你对某个工单有查看权限,但是一旦审核或处理完成后,即权限自动回收.

Mysql Innodb 引擎优化

- 彦强 - 阿辉的空间
作/译者:吴炳锡,来源:http://imysql.cn/ & http://www.mysqlsupport.cn 转载请注明作/译者和出处,并且不能用于商业用途,违者必究. InnoDB给MySQL提供了具有提交,回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎. InnoDB锁定在行级并且也在SELECT语句提供 一个Oracle风格一致的非锁定读.

Zend引擎的优化

- Angus - 风雪之隅
作者: Laruence(. 本文地址: http://www.laruence.com/2011/07/14/2115.html. 在PHP 5.4的更新list上, 有一句: 提升了Zend引擎的性能, 减少了内存占用.. 那么, 到底是怎么提升的呢?. 避免不必要的Hashtable. 我们知道在PHP中, 类的属性/静态属性/常量, 都是保存在Hashtable中的, 而在以前, 即使一个类没有申明属性/静态属性/常量, Zend引擎也会为他们分配Hashtable..

JS游戏引擎列表

- sku - 酷壳 - CoolShell.cn
这里有一个网址收集了关于JS游戏引擎开发库的一个列表,转过来. 关于使用JS和HTML5做的一些小游戏,可参见《HTML5 小游戏展示》. Name Latest Release License Type Notes The Render Engine 1.5.3 MIT 跨浏览器; 大规模 API; 开源. 2 gameQuery 0.5.1 CC BY-SA 2.5 和 jQuery 一起使用 gTile 0.0.1 Tile based.

uSniff:BT种子搜索引擎

- leqoqo - 软件志
一、uSniff相关信息: 1、官方主页:http://www.usniff.com/ 2、简介:uSniff是一个BT种子搜索引擎,简单、易用、实时是其最大的优点,其搜索引擎数据库包含了17个知名种子站点的种子信息,目的是想发展成为世界上最大的BT种子搜索引擎,而且对于每个种子,该搜索引擎都会进行安全认证,以保证用户的正常使用.

Android游戏引擎 Lib9

- Bin - 开源中国社区最新软件