sharding-core-rewrite
- 模块结构
sharding-core-rewrite的主要功能是将路由生成的RoutingUnit对象,进行改写生成SQLUnit。按功能分类可以分成六个部分:
- org.apache.shardingsphere.core.rewrite.SQLRewriteEngine。SQLRewriteEngine类是整个改写功能的入口,通过构造方法和generateSQL()方法,对外提供改写功能,生成SQLUnit。SQLUnit包含两个属性:sql和parameters,作为改写后的结果返回。这两个属性分别依赖org.apache.shardingsphere.core.rewrite.sql和org.apache.shardingsphere.core.rewrite.parameter包。
- org.apache.shardingsphere.core.rewrite.sql。主要类是SQLBuilder,它对外提供构建改写SQL的功能。这个模块内部的SQLToken是改写时重要的依赖。
- org.apache.shardingsphere.core.rewrite.parameter。包含ParameterBuilder和ParameterRewriter,分别抽象了参数列表构建和参数改写。其中org.apache.shardingsphere.core.rewrite.parameter.rewriter子包的功能较重要的类是:EncryptParameterBuilderFactory和ShardingParameterBuilderFactory。它俩通过build方法来完成对parameterBuilder的相关参数的设置,例如:在StandardParameterBuilder中设置addedIndexAndParameters和replacedIndexAndParameters。
- org.apache.shardingsphere.core.rewrite.SQLRewriteDecorator。接口类。定义了decorate()方法,为sqlRewriteEngine的parameterBuilder设置相关的parameter参数。它的实现类为ShardingRewriterDecorator和EncryptRewriterDecorator。
- org.apache.shardingsphere.core.rewrite.sharding。ShardingRewriterDecorator为主要功能类。ShardingParameterBuilderFactory.build()方法,为sqlRewriteEngine的parameterBuilder设置相关的parameter参数
- org.apache.shardingsphere.core.rewrite.encrypt。EncryptRewriterDecorator为主要功能类。EncryptParameterBuilderFactory.build()方法,为sqlRewriteEngine的parameterBuilder设置相关的parameter参数。
- 模块结构图
- 主要逻辑流程和关键类分析
sharding-core-rewrite的主要逻辑是从SQLRewriteEngine.generateSQLgenerateSQL(final RoutingUnit routingUnit, final Map<String, String> logicAndActualTables)开始的,主逻辑流程图如下。其中,虚线箭头表示从属关系,实线表示执行顺序。 - 设计模式和设计原则
接口分离原则和里式替换原则
org.apache.shardingsphere.core.rewrite.sql.token.pojo。这个包对面向对象编程有比较好的实践。首先,定义了SQLToken抽象类,所有实现类都继承它,它将实体类的公共的部分抽象封装了起来。其次,定义了三个接口
Alterable、Attachable、Substitutable三个接口,这三个接口从使用角度按照改写、附加、直接替换三个方面进行了划分,实现类根据自身特点来实现其中的接口。最后,调用者在调用时使用抽象类的引用,达到了统一处理的目的,同时可以根据实现类所属的接口进行差异化操作,这点在如下代码中有体现:
SQLBuilder的代码如下:1
2
3private String getSQLTokenLiterals(final SQLToken sqlToken, final RoutingUnit routingUnit, final Map<String, String> logicAndActualTables) {
return sqlToken instanceof Alterable ? ((Alterable) sqlToken).toString(routingUnit, logicAndActualTables) : sqlToken.toString();
}对父类的继承,使得调用者代码可以使用统一的类来引用不同的子类对象。
接口的实现,使得调用者代码可以对不同接口的实现类对象,进行差异化处理。
org.apache.shardingsphere.core.rewrite.sql.token.generator包对接口合理的使用,也达到类似的效果。同样也是优秀的面向对象编程实践。依赖倒转原则
org.apache.shardingsphere.core.rewrite.parameter.builder和org.apache.shardingsphere.core.rewrite.parameter.rewriter体现了依赖倒转原则,ParameterBuilder和ParameterRewriter都是接口类,是对内部多个实现类的良好抽象,调用者只需要声明接口引用,就可以使用多种实现类。