基于drools创建自己的关系操作符
我们知道drools提供了12种关系操作符
 
frFfpTravelDetail的票价级别etFareBasis属性做比配(逻辑:票价级别
去除非英文和数字字符后,第二位开始包含“ID**”或“DG**”或“AD**”(**为数字)),这个逻辑太复杂,用以上12种关系操作符都不能满足,为此要进行扩展。
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import org.drools.base.ValueType;
import org.drools.base.evaluators.EvaluatorDefinition;
import org.drools.base.evaluators.Operator;
import org.drools.spi.Evaluator;
public class CsairEvaluatorDefinition implements EvaluatorDefinition {
public static final Operator STR_COMPARE = Operator.addOperatorToRegistry(
  
 
  "csair", false);
  
 
  public static final Operator NOT_STR_COMPARE = Operator
  
 
  .addOperatorToRegistry("csair", true);
  
 
  private static final String[] SUPPORTED_IDS = { STR_COMPARE
  
 
  .getOperatorString() };
public enum Operations {
  
 
  FbInculde
  
 
  }
private Evaluator[] evaluator;
public Evaluator getEvaluator(ValueType type, Operator operator) {
  
 
  return this.getEvaluator(type, operator.getOperatorString(), operator
  
 
  .isNegated(), null);
  
 
  }
public Evaluator getEvaluator(ValueType type, Operator operator,
  
 
  String parameterText) {
  
 
  return this.getEvaluator(type, operator.getOperatorString(), operator
  
 
  .isNegated(), parameterText);
  
 
  }
public Evaluator getEvaluator(ValueType type, String operatorId,
  
 
  boolean isNegated, String parameterText) {
  
 
  return getEvaluator(type, operatorId, isNegated, parameterText,
  
 
  Target.FACT, Target.FACT);
  
 
  }
public Evaluator getEvaluator(ValueType type, String operatorId,
  
 
  boolean isNegated, String parameterText, Target leftTarget,
  
 
  Target rightTarget) {
  
 
  CsairEvaluator evaluator = new CsairEvaluator(type, isNegated);
  
 
  evaluator.setParameterText(parameterText);
  
 
  return evaluator;
  
 
  }
public String[] getEvaluatorIds() {
  
 
  return SUPPORTED_IDS;
  
 
  }
public Target getTarget() {
  
 
  return Target.FACT;
  
 
  }
public boolean isNegatable() {
  
 
  return true;
  
 
  }
public boolean supportsType(ValueType arg0) {
  
 
  return true;
  
 
  }
public void readExternal(ObjectInput in) throws IOException,
  
 
  ClassNotFoundException {
  
 
  evaluator = (Evaluator[]) in.readObject();
}
public void writeExternal(ObjectOutput out) throws IOException {
  
 
  out.writeObject(evaluator);
  
 
  }
}
  
 
 
import org.drools.base.BaseEvaluator;
  
 import org.drools.base.ValueType;
  
 import org.drools.common.InternalWorkingMemory;
  
 import org.drools.rule.VariableRestriction.VariableContextEntry;
  
 import org.drools.spi.FieldValue;
  
 import org.drools.spi.InternalReadAccessor;
import com.csair.cbd.rules.drools.services.impl.CsairEvaluatorDefinition.Operations;
public class CsairEvaluator extends BaseEvaluator {
private Operations parameter;
public void setParameterText(String parameterText) {
  
 
  this.parameter = Operations.valueOf(parameterText);
  
 
  }
public Operations getParameter() {
  
 
  return parameter;
  
 
  }
public CsairEvaluator(final ValueType type, final boolean isNegated) {
  
 
    super(type, isNegated ?  CsairEvaluatorDefinition.NOT_STR_COMPARE: CsairEvaluatorDefinition.STR_COMPARE);
  
 
  }
public boolean evaluate(InternalWorkingMemory workingMemory,
  
 
  InternalReadAccessor extractor, Object object, FieldValue value) {
  
 
  final Object objectValue = extractor.getValue(workingMemory, object);
  
 
  switch (parameter) {
  
 
  case FbInculde:
  
 
  String sObjectValue = String.valueOf(objectValue);
  
 
  String sObjectValueTrim = sObjectValue.replaceAll("[^a-zA-Z0-9]","");
  
 
  String sFieldvalue  = String.valueOf(value.getValue());
  
 
  boolean ret =sObjectValueTrim.substring(1).matches("^.*["+sFieldvalue+"][0-9]+.*$");
  
 
  return  ret;
  
 
  default:
  
 
  throw new IllegalAccessError("Illegal str comparison parameter");
  
 
  }
  
 
  }
public boolean evaluate(InternalWorkingMemory arg0,
  
 
  InternalReadAccessor arg1, Object arg2, InternalReadAccessor arg3,
  
 
  Object arg4) {
  
 
  return false;
  
 
  }
public boolean evaluateCachedLeft(InternalWorkingMemory arg0,
  
 
  VariableContextEntry arg1, Object arg2) {
  
 
  return false;
  
 
  }
public boolean evaluateCachedRight(InternalWorkingMemory arg0,
  
 
  VariableContextEntry arg1, Object arg2) {
  
 
  return false;
  
 
  }
}
  
 
 
System.setProperty("drools.dialect.java.compiler", "JANINO");
//修改默认Java Dialect编译器
Properties props = new Properties();
//set default java compiler
//TODO use a file property to allow configuration
props.setProperty("drools.dialect.java.compiler", "JANINO");
PackageBuilderConfiguration pkgBuilderCfg = new PackageBuilderConfiguration(props);
  
 
  //扩展csair条件比配操作符,caozhiping
 pkgBuilderCfg.setOption(EvaluatorOption.get("csair",new CsairEvaluatorDefinition()));
// 声明新的KnowledgeBuilder对象
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory
.newKnowledgeBuilder(pkgBuilderCfg);
  
 
 
salience 1
no-loop false
activation-group "1"
ruleflow-group "1"
when
mileages : ArrayList()
mileageRuleMiddleValue : MileageRuleMiddleValue()
and frFfpTravelDetail : FrFfpTravelDetail(cumulateCabin == "E")
and FrFfpTravelDetail(this == frFfpTravelDetail &&
etFareBasis csair[FbInculde] "(ID)|(DG)|(AD)"
)
then
Date[] dates = ruleGlobalUtil.getMileageRuleCalculate().getValidBeginEndDatesFromTheDate(55,mileageRuleMiddleValue.getBeginValidDate());
Mileage mileage = new Mileage("000001", "000001", mileageRuleMiddleValue.getBaseMileage()*44*0.01, mileageRuleMiddleValue.getRemark(),"ruleId", dates[0], dates[1], "travel-basic-award-1");
mileages.add(mileage);
end
基于drools创建自己的关系操作符的更多相关文章
- 用C#基于WCF创建TCP的Service供Client端调用
		本文将详细讲解用C#基于WCF创建TCP的Service供Client端调用的详细过程 1):首先创建一个Windows Service的工程 2):生成的代码工程结构如下所示 3):我们将Servi ... 
- 对于python,一切事物都是对象,对象基于类创建
		新建列表.新建string字符串 li1 = [1, 2, 3, 4] li2 = list([1, 2, 3]) s1 = "abc" s2 = str("abc&qu ... 
- 基于catalog 创建RMAN存储脚本
		--============================== -- 基于catalog 创建RMAN存储脚本 --============================== 简言之,将rman的 ... 
- 基于eclipse创建android的helloworld工程
		基于eclipse创建android的helloworld工程 之前用过Android studio感觉很慢,决定采用eclipse来学习Android开发.下面来看是怎么创建的. 选择File--- ... 
- asp.net core 系列 20 EF基于数据模型创建数据库
		一.概述 本章使用 Entity Framework Core 构建执行基本数据访问的 ASP.NET Core MVC 应用程序.使用迁移(migrations)基于数据模型创建数据库,是一种cod ... 
- C#/.NET基于Topshelf创建Windows服务程序及服务的安装和卸载(极速,简洁)
		本文首发于:码友网--一个专注.NET/.NET Core开发的编程爱好者社区. 文章目录 C#/.NET基于Topshelf创建Windows服务的系列文章目录: C#/.NET基于Topshelf ... 
- 基于qml创建最简单的图像处理程序(3)-使用opencv&qml进行图像处理
		<基于qml创建最简单的图像处理程序>系列课程及配套代码基于qml创建最简单的图像处理程序(1)-基于qml创建界面http://www.cnblogs.com/jsxyhelu/p/83 ... 
- 基于qml创建最简单的图像处理程序(2)-使用c++&qml进行图像处理
		<基于qml创建最简单的图像处理程序>系列课程及配套代码基于qml创建最简单的图像处理程序(1)-基于qml创建界面http://www.cnblogs.com/jsxyhelu/p/8 ... 
- 基于qml创建最简单的图像处理程序(1)-基于qml创建界面
		<基于qml创建最简单的图像处理程序>系列课程及配套代码基于qml创建最简单的图像处理程序(1)-基于qml创建界面http://www.cnblogs.com/jsxyhelu/p/83 ... 
随机推荐
- SQL数值函数
			/*abs(n)返回参数n所指定数值的绝对值(如果参数值为NULL,则返回结果为NULL,下同).*/--SELECT ABS(-3.14) FROM DUAL; --3.14 /*round(n[, ... 
- 编译lua5.3.2报错提示libreadline.so存在未定义的引用解决方法
			从官网上下载5.3.2的源码后,make linux进行编译,提示报错: gcc -std=gnu99 -o lua lua.o liblua.a -lm -Wl,-E -ldl -lreadline ... 
- web前端技术
			在网上找了点前端资料,记录下来,以便后面工作可能用到. Flat UI:一个WEB界面工具组件库.很多漂亮的菜单.按钮等. stickUp:一个jquery插件,可以将页面中的元素固定.经常用在把菜单 ... 
- JQuery中常用的        属性选择器
			jQuery中使用$()作为选择符极大提高工作效率以及方便快捷;一些常用属性的选择器由以下几种 1) $('#id') id选择器 2) $('.class') css选择器,class类名 3) $ ... 
- Ring对象
			Ring是一个封闭的Path即起始和终止点有相同的坐标值,它有内部和外部属性. 
- arcgis engine - 命令和工具
			在engine中, 命令是实现了 ICommand,我们可以通过使用 UID, progID 或 ICommand 将一个命令宿主到 ToolBarControl中. ICommand接口有一个 On ... 
- C#中静态构造函数含义及使用
			static以前都接触过,可是最近才发现了还有静态类的写法,也可能是以前没太注意了,所以自己去研究了一下! 1.什么是构造函数: 1.1 例如:static Class{} 1.2 使用静态函数的注 ... 
- ORA-00911: invalid character
			出错原因:sql语句后面加了中文状态下的分号. 解决办法:改成英文状态下的分号即可. --本篇文章参考自:http://blog.sina.com.cn/s/blog_5b2a1aee0100n4oy ... 
- css技巧之如何实现ul li边框重合
			提到边框重合,我们不妨打开淘宝首页浏览主体分类内容板块瞧瞧---亲,你看到了,正是这个,边框重合.其实我们不难发现,这个效果并不难,只是我们没有真正的动手做过而已,所以不知道怎么做,那么下面就是一个很 ... 
- Linux修改时间时区并在Tomcat中生效
			Linux查看当前时间时区linux:~ # datelinux:~ # date –Rlinux:~ # zdump -v /usr/share/zoneinfo/Asia/Beijing ---- ... 
