ShardingSphere解析SQL示例详解


当前第2页 返回上一页

遍历抽象语法树中的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内容来自木庄网络博客


打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...