SqlVisitor
基础类
SqlVisitor是操作与sqlNode层面的api,代码不多,主要功能是提供访问SqlNode,如果遇到满足条件的node返回对应的操作。
1 | /* |
这个接口有一个实现SqlBasicVisitor,自定义的visitor只要继承这个类,去实现需要的方法,不用所有SqlNode的类型都实现。
从上面的方法看,可以看到shuttle主要是visit每一个node,如果遇到满足条件的node原样返回。
1 |
|
具体实现类
SqlShuttle
它返回未更改的每个叶节点(returns each leaf node unchanged.)
1 |
|
使用方法
- 获取select的where用到了那些key
1 | select * from tableA where 1=1 date ='2020-09-26' and name in ('xx'); |
1 | List<String> whereIdList = new ArrayList<>(); |
得到 date 、name.
如果不使用这种visit,通过sqlSelect.getWhere()然后通过遍历sqlNode。
但是 1=1 会出现很大的干扰,需要自己写深搜才行。
- 为每一个where条件加一个x。
1 | SqlShuttle sqlShuttle =new SqlShuttle(){ |
sql就会变成
1 | select * from tableA where 1=1 datex ='2020-09-26' and namex in ('xx'); |
AndFinder
判断sqlNod是否有and
1 | private static class AndFinder extends SqlBasicVisitor<Void> { |
通过抛出异常判断是否找到and。1
2
boolean b = new AndFinder().containsAnd(sqlNode);
RelShuttle
RelShuttle 是操作RelNode层面,在sqlNode校验过后,进行优化的环节。
基础类
1 |
|
存在一个基础实现RelShuttleImpl,RelHomogeneousShuttle。