drools engine use decision table

Prerequisite preparation: Java virtual machine 
                 Drools core library
                 Junit4.0 or above
                 rules Excel template table (create the content of the following picture into Excel)
The typical usage is to create KnowledgeBase based on excel, and then throw it to session execution, the parameters of execution and the results are inside 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" },




 

       



         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 
 
  • When to Consider Using a Rule Sheet
  如果规则可以表示成 templates+data(模板+数据),可以考虑使用 decision tables。在决策表的每一行,采集数据和模板一起生成规则。使用基于决策表的SpreadsheetAPIDrools-decisiontables模块中。只有一个类:SpreadsheetCompiler. 这个类可以操作各种格式的Spreadsheet,并生成DRL规则(然后就可以常规的方式使用)。

一个典型的规则表的格式


 
决策表中的关键字说明:


 

 

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=327036898&siteId=291194637