package io.mycat.route.parser.druid;
import java.util.ArrayList;
import java.util.List;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr;
import com.alibaba.druid.stat.TableStat.Condition;
/**
* Where条件单元
*
* @author wang.dw
* @date 2015-3-17 下午4:21:21
* @version 0.1.0
* @copyright wonhigh.cn
*
* 示例:
SELECT id,traveldate
FROM travelrecord
WHERE id = 1
AND ( fee > 0
OR days > 0
OR ( traveldate > '2015-05-04 00:00:07.375'
AND ( user_id <= 2
OR fee = days
OR fee > 0 ) ) )
AND name = 'zhangsan'
ORDER BY traveldate DESC
LIMIT 20
*
*
*
*/
public class WhereUnit {
/**
* 完整的where条件
*/
private SQLBinaryOpExpr whereExpr;
/**
* 还能继续再分的表达式:可能还有or关键字
*/
private SQLBinaryOpExpr canSplitExpr;
private List<SQLExpr> splitedExprList = new ArrayList<SQLExpr>();
private List<List<Condition>> conditionList = new ArrayList<List<Condition>>();
/**
* whereExpr并不是一个where的全部,有部分条件在outConditions
*/
private List<Condition> outConditions = new ArrayList<Condition>();
/**
* 按照or拆分后的条件片段中可能还有or语句,这样的片段实际上是嵌套的or语句,将其作为内层子whereUnit,不管嵌套多少层,循环处理
*/
private List<WhereUnit> subWhereUnits = new ArrayList<WhereUnit>();
private boolean finishedParse = false;
public List<Condition> getOutConditions() {
return outConditions;
}
public void addOutConditions(List<Condition> outConditions) {
this.outConditions.addAll(outConditions);
}
public boolean isFinishedParse() {
return finishedParse;
}
public void setFinishedParse(boolean finishedParse) {
this.finishedParse = finishedParse;
}
public WhereUnit() {
}
public WhereUnit(SQLBinaryOpExpr whereExpr) {
this.whereExpr = whereExpr;
this.canSplitExpr = whereExpr;
}
public SQLBinaryOpExpr getWhereExpr() {
return whereExpr;
}
public void setWhereExpr(SQLBinaryOpExpr whereExpr) {
this.whereExpr = whereExpr;
}
public SQLBinaryOpExpr getCanSplitExpr() {
return canSplitExpr;
}
public void setCanSplitExpr(SQLBinaryOpExpr canSplitExpr) {
this.canSplitExpr = canSplitExpr;
}
public List<SQLExpr> getSplitedExprList() {
return splitedExprList;
}
public void addSplitedExpr(SQLExpr splitedExpr) {
this.splitedExprList.add(splitedExpr);
}
public List<List<Condition>> getConditionList() {
return conditionList;
}
public void setConditionList(List<List<Condition>> conditionList) {
this.conditionList = conditionList;
}
public void addSubWhereUnit(WhereUnit whereUnit) {
this.subWhereUnits.add(whereUnit);
}
public List<WhereUnit> getSubWhereUnit() {
return this.subWhereUnits;
}
}