StoragePluginRulesFactory 是dremio 为了分离每个插件的规则,我们存储插件可以包含自己的规则工厂,具体使用到StoragePluginRulesFactory
的包含了CatalogServiceImpl,SqlHandlerConfig,实际都会到sql 执行的handler 中

系统内置实现

 

 

集成使用

主要是CatalogServiceImpl.java 中,其他执行部分通过间接引用

 
public RuleSet getStorageRules(OptimizerRulesContext context, PlannerPhase phase) {

    final ImmutableSet.Builder<RelOptRule> rules = ImmutableSet.builder();

    final Set<SourceType> types = new HashSet<>();

 
    try {

      for (ManagedStoragePlugin plugin : getPlugins().managed()) {

        // we want to check state without acquiring a read lock

        if (plugin.getState().getStatus() == SourceState.SourceStatus.bad) {

          // we shouldn't consider rules for misbehaving plugins.

          continue;

        }

 
        StoragePluginId pluginId;

        try {

          // getId has a check for plugin state

          pluginId = plugin.getId();

        } catch (UserException e) {

          if (e.getErrorType() == ErrorType.SOURCE_BAD_STATE) {

            // we shouldn't consider rules for misbehaving plugins.

            continue;

          }

          throw e;

        }

 
        StoragePluginRulesFactory factory = plugin.getRulesFactory();

        if(factory != null) {

          // add instance level rules.

          rules.addAll(factory.getRules(context, phase, pluginId));

 
          // add type level rules.

          if(types.add(pluginId.getType())) {

            rules.addAll(factory.getRules(context, phase, pluginId.getType()));

          }

        }

      }

    } catch (InstantiationException | IllegalAccessException e) {

      throw UserException.validationError(e).message("Failure getting plugin rules.").build(logger);

    }

 
    ImmutableSet<RelOptRule> rulesSet = rules.build();

    return RuleSets.ofList(rulesSet);

  }

SqlHandlerConfig 对于规则的使用 SqlHandlerConfig.java 间接也是通过执行上下文使用的CatalogService

 public RuleSet getRules(PlannerPhase phase) {

    return PlannerPhase.mergedRuleSets(

        context.getInjectedRules(phase),

        phase.getRules(context),

        context.getCatalogService().getStorageRules(context, phase));

  }

说明

dremio StoragePluginRulesFactory 还是比较强大的,扩展了dremio sql 处理能力,是一个很不错的扩展点 尤其我们需要开发自己的存储扩展的时候

参考资料

https://github.com/dremio/dremio-oss/blob/d41cb52143b6b0289fc8ed4d970bfcf410a669e8/sabot/kernel/src/main/java/com/dremio/exec/catalog/CatalogServiceImpl.java
https://github.com/dremio/dremio-oss/blob/d41cb52143b6b0289fc8ed4d970bfcf410a669e8/sabot/kernel/src/main/java/com/dremio/exec/planner/sql/handlers/SqlHandlerConfig.java
https://github.com/dremio/dremio-oss/blob/d41cb52143b6b0289fc8ed4d970bfcf410a669e8/sabot/kernel/src/main/java/com/dremio/exec/store/StoragePlugin.java

原文地址:http://www.cnblogs.com/rongfengliang/p/16813109.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性