sharding-core-merge

  • 模块结构
    sharding-core-merge的主要功能是利用属性DatabaseType databaseType;SQLRouteResult routeResult;(route产生),SelectSQLStatementContext selectSQLStatementContext;(preprocess产生),List<QueryResult> queryResults;(execute模块产生),产生MergedResult。按功能分类可以分成三个部分:
  1. org.apache.shardingsphere.core.merge.dal。包含若干DAL操作相关的MergedResult实现类和DALMergeEngine是一个合并引擎。此引擎对外提供merge()功能,负责将DAL操作的相关结果合并,返回包内定义的MergedResult实体类。
  2. org.apache.shardingsphere.core.merge.dql。包含若干DQL操作相关的MergedResult实现类和DQLMergeEngine是一个合并引擎。此引擎对外提供merge()功能,负责将DQL操作的相关结果合并,返回包内定义的MergedResult实体类。
  3. org.apache.shardingsphere.core.merge。包含MergedResult和MergeEngine接口的定义。MergeEngineFactory,负责创建MergeEngine实例。TransparentMergeEngine是一个合并引擎,实现了MergeEngine接口,此方法不对queryResults进行处理,直接返回迭代流式MergeResult。
  • 模块结构图
  • 主要逻辑流程和关键类分析
    分片执行的主要逻辑是从***MergeEngine实现类开始的。这里以DQLMergeEngine为例子,进行分析。首先判断List<QueryResult> queryResults;是否为1,如果为1则不需要处理,直接创建迭代流式归并MergedResult。否则,判断是否为orderBy或groupby,并创建相关MergedResult。最后,对分页进行处理,也就是在decorate()方法中,根据数据库类型,创建不同MergeResult。
  • 设计模式和设计原则
  1. 简单工厂方法
    MergeEngineFactory.newInstance()方法,根据SQLStatement类型来创建不同的MergeEngine。具体的MergeEngine类型为:DQLMergeEngine,DALMergeEngine,TransparentMergeEngine。MergeEngineFactory的存在方便了不同类型的MergeEngine创建,调用者不再需要关心如何创建MergeEngine,而只需要把这件事交给MergeEngineFactory就行。
  2. 适配器模式
    LocalMergedResultAdapter类是一个抽象类,它实现了MergedResult接口的部分方法,使得它的子类ShowDatabasesMergedResultShowShardingCTLMergedResult无需MergedResult接口的所有方法。当实现类和接口的方法无法完全匹配时,可以考虑使用适配器模式。