二叉树的规则匹配设计

[b]如果我的数据表中存储n条如下形式的规则:[/b]
1:a=1 && b= 2 && c=3 && d=4
2.a=1 || b= 2 || c=3
3.a=1 && (b= 2 || c=3)
4.a=1 && c IN (C1,C2,C3)
[b]我的请求参数都如下列形式:[/b]
{a=1,c=C3}
[b]那么该如何设计代码,来实现入参匹配规则?[/b]

首先应该将规则转化为树模型,组件轮廓如下:


class Condition{
/**
* 条件是否匹配
* @return
*/
boolean isMatch(RequestParam requestParam);
}

class AndOrCondition implements Condition{
/** 条件枚举 */
protected ConditionOp conditionOp;
Condition left;
Condition right;
/**递归遍历*/
public boolean isMatch(RequestParam requestParam)
switch (conditionOp) {
case AND:
isMatch = left.isMatch(context)
&& right.isMatch(requestParam);
break;
case OR:
boolean leftMatch = left.isMatch(requestParam);
if (leftMatch) {
// 如果左子树匹配成功,则直接短路返回true
isMatch = true;
} else {
// 如果右子树匹配成功,则直接短路返回true
isMatch = right.isMatch(requestParam);
}
break;
}
}

class ComparableCondition implements Condition{
/** 左子节点名 */
private String left;
/** 右子节点名 */
private String right;

/**逻辑运算符号*/
private ConditionOp conditionOp;
/**数据类型*/
private String dataType;
/** 条件是否匹配
* @param requestParam
* @return
*/
public boolean isMatch(RequestParam requestParam) {
boolean isMatch = false;
if (requestParam.containsProperty(left)) {
isMatch = //字符串匹配结果
}
return isMatch;
}
}

/**
* 条件枚举
*/
public enum ConditionOp {

/** 逻辑与 */
AND,
/** 逻辑或 */
OR,
/** 集合包含 */
IN,
/** 集合不包含 */
NOTIN,
/** 等于 */
EQ,
/** 不等于 */
NE,
/** 小于 */
LT,
/** 小于等于 */
LE,
/** 大于 */
GT,
/** 大于等于 */
GE,
/** startsWith匹配 */
SW,
/** endsWith匹配 */
EW

}


用这几个组件将上面的规则1转化为如下数据模型:

AndOrCondition[left=ComparableCondition[right=1,left=a,dataType=STRING,conditionOp=EQ],
right=AndOrCondition[left=ComparableCondition[right=2,left=b,dataType=STRING,conditionOp=EQ],
right=AndOrConditin[left==ComparableCondition[right=3,left=c,dataType=STRING,conditionOp=EQ],right=ComparableCondition[right=4,left=d,dataType=STRING,conditionOp=EQ]]]]

可以看到只有叶子节点ComparableCondition会真正进行比较,AndOrCondition会继续遍历寻找它的叶子节点。

规则一树模型:


[img]http://dl2.iteye.com/upload/attachment/0097/5605/e37a7b63-70e9-37ef-9d30-172551a843db.jpg[/img]

规则三树模型:

[img]http://dl2.iteye.com/upload/attachment/0097/5607/b379648c-10a1-3ed5-af1c-0d65a8a1224e.jpg[/img]
[b]
那么表达式转为java二叉树领域模型如何实现?[/b]
未完待续

你可能感兴趣的:(规则匹配,二叉树,节点)