遍历抽象语法树中的Sql片段的提取器,提取器分为两种类型,一种是单节点的Sql片段提取器,这时候就直接获取Sql片段,放入集合中就可以了,另一种是树状节点的Sql片段提取线,这时候就需要遍历这棵树,将结果放入集合中。看!数据结构之树的遍历用到了吧,以后别说数据结构没用了。。
3. 填充Sql片段,生成解析结果
第三步就是填充得到的Sql片段了,对应的是SQLStatementFillerEngine的fill()方法
public SQLStatement fill(final Collection<SQLSegment> sqlSegments, final int parameterMarkerCount, final SQLStatementRule rule) { SQLStatement result = rule.getSqlStatementClass().newInstance(); Preconditions.checkArgument(result instanceof AbstractSQLStatement, "%s must extends AbstractSQLStatement", result.getClass().getName()); ((AbstractSQLStatement) result).setParametersCount(parameterMarkerCount); result.getAllSQLSegments().addAll(sqlSegments); for (SQLSegment each : sqlSegments) { Optional<SQLSegmentFiller> filler = parseRuleRegistry.findSQLSegmentFiller(databaseTypeName, each.getClass()); if (filler.isPresent()) { filler.get().fill(each, result); } } return result; }
- 获取SQLStatement对象,对SQLStatement进行合法性进行校验
- 设置结果的参数的个数
- 将上一步中的SQL片段集合添加到结果对象中
- 遍历Sql片段,根据数据库类型和Sql片段找到Sql片段过滤器,利用Sql片段过滤器来填充Sql片段
- 最后返回解析后的SQLStatement
总结
这篇文章我们讲了ShardingSphere的解析Sql的功能,从它的入口开始到它具体解析Sql的过程,分三步走,第一步将原始SQL解析成抽象语法树,第二步提取Sql片段,第三步根据数据库类型和Sql片段选择相应的填充器填充Sql片段,这就是解析Sql的整体过程了,希望对你理解ShardingSphere有所帮助。
更多关于ShardingSphere SQL的资料请关注其它相关文章!
更多SQL内容来自木庄网络博客