2021SC@SDUSC

目录

  • 方法CommandProcessorFactory.get
    • 方法getForHiveCommandInternal
      • 方法HiveCommand.find
      • 指令安全性检查
      • 最终switch
    • 那么DriverFactory.newDriver?
  • 总结

方法CommandProcessorFactory.get

好消息是这个方法并不长,坏消息是这个方法调用了另一个方法……这方法是直接把参数传下去了
我们经过几层调用调用到了一个叫getForHiveCommandInternal的方法。不过同时也要记住下面还有一种可能有意义的返回方式

方法getForHiveCommandInternal


我们集中关注这个find方法

方法HiveCommand.find

这里前半部分是各种特殊情况,注释里也有很多的解释了。不过基于之前CommandProcessorFactory.get在你各种返回null的时候仍能做出有意义的返回,所有返回null的都要考虑一下……

我们接下来的一个分支可以再着重看一下

COMMANDS是一个集合,这个集合的内容来自一个枚举类

相当于是定义了一些指令,然后先检查我们的这个token化的命令的第一个token属不属于这个给定的指令集合,如果属于的话,后续通过valueOf获取这个指令usedOnlyForTesting这个属性。看名字就知道是干啥用的了,指明这个指令是否只用于测试。如果findOnlyForTesting——也就是我们传入的,指明执行这个指令时是否是测试状态的boolean量——如果和这个操作的usedOnlyForTesting是否一致。只有一致才返回这个操作的枚举量。
枚举类来定义这种常量应该有考虑吧,比如非硬编码、可扩展性强?
总得看下来,这个find方法返回了我们的指令的第一个token所指向的指令类型。如果不属于这里规定的那些指令的话就会返回null。有一点也让我很在意:这里规定的那些指令中没有SELECT?如果一层一层往回看的话,SELECT开头的指令就会CommandProcessorFactory.get的返回就会滑向我之前说猜测的“另一种有意义”的走向了。
ps:后来我发现这个枚举上面有一行注释

看来这里规定的指令都是“非SQL”语句,至少能明显看出来是数据仓库不常用的指令(毕竟数据仓库的主力是SELECT)

指令安全性检查


下面那个是检测特殊指令的,我们主要看上面。上面那个HiveConf.ConfVars.HIVE_SECURITY_COMMAND_WHITELIST,这个有一段非常漫长的调用,总的来说返回的内容是这个defaultVal的内容

也就是说这是一个安全指令的名单啦,最上面那段是在确认这个命令是白名单中的安全指令

最终switch


这里就很明显了,根据HiveCommand.find检查到的这条命令所属类型,返回不同的CommandProcessor。那些不同的Processor都是实现了CommandProcessor这个接口

那么DriverFactory.newDriver?

这个方法调用到了这里

而这里面的HIVE_QUERY_REEXECUTION_ENABLEDdefaultVartrue。但是呢DriverReExecDriver,从名字来看,后者是“重新执行”的意思,不免让我猜测后者是否依赖于前者。于是我去查看ReExecDriverrun方法。
这是因为我提前粗略地阅读了下一步的代码,CommandProcessorFactory.get这个方法的返回量被传入下一个方法后执行了run(cmd)这个方法,这个方法是一个接口的方法,被DriverReExecDriver两个类实现。而且这个run方法还被计时了,显然对应了执行hql语句后命令行返回的执行时长,run就是核心方法,值得关注。而且这也说明这两个类间的联系。
run(cmd)也经过了一些调用,最后是这个

这里我就发现了一个很有趣的事情:各种return的值,都是来自于一个叫做coreDriver的类变量的方法,而这个类变量恰恰又是个Driver类对象。闭环了同学们!而且这个Driver也执行过一个compileAndRespond的方法(这是从run(cmd)run()中间做的事情),传入参数就是我们得命令。我们可以确定Driver才是核心,分析的目标应该是Driver,这也为我们再下一步的分析指明了方向

总结

看似是确定了CommandProcessorFactory.get的返回值情况,但是我最后发现这个分析恰好十分关键,为下一个方法——processLocalCmd——的核心内容铺平了道路,明确了分析方向,可喜可贺。

[SDU软件工程实践]Blog5-从CommandProcessorFactory.get开始相关推荐

  1. [SDU软件工程实践]Blog4-processLine及processCmd

    2021SC@SDUSC 目录 方法processLine 官方注释 字符串处理 方法processCmd 预处理 确定最终执行的是hql后 方法processLine 官方注释 官方其实在源代码里为 ...

  2. 【软件工程实践】Hive研究-Blog5

    [软件工程实践]Hive研究-Blog5 2021SC@SDUSC 研究内容介绍 本人负责的是负责的是将查询块QB转换成逻辑查询计划(OP Tree) 如下的代码出自apaceh-hive-3.1.2 ...

  3. 【软件工程实践】Hive研究-Blog6

    [软件工程实践]Hive研究-Blog6 2021SC@SDUSC 研究内容介绍 本人负责的是负责的是将查询块QB转换成逻辑查询计划(OP Tree) 如下的代码出自apaceh-hive-3.1.2 ...

  4. 软件工程python就业方向-软件工程实践总结

    软工ByeBye~ 请回望暑假时的第一次作业,你对于软件工程课程的想象 对比开篇博客你对课程目标和期待,"希望通过实践锻炼,增强计算机专业的能力和就业竞争力",对比目前的所学所练所 ...

  5. 软件工程实践2017第二次作业

    软件工程实践2017第二次作业 1)Github地址 https://github.com/Maple27/sudoku 2)解题思路 个人从小就对数独就很喜欢,对解数独有一定程度的了解,这次自己开发 ...

  6. 个人作业——软件工程实践总结

    一.请回望暑假时的第一次作业,你对于软件工程课程的想象 对比开篇博客你对课程目标和期待,"希望通过实践锻炼,增强计算机专业的能力和就业竞争力",对比目前的所学所练所得,在哪些方面达 ...

  7. 个人作业收官——软件工程实践总结

    个人作业收官--软件工程实践总结 一.回望开学初对于软件工程课程的想象,回望博客开篇时对于这门课和这学期的期望, 1)对比现在的你和开学初博客开篇的课程目标和期待. 能力的预期 1.对于java的一些 ...

  8. 软件工程专业(互联网应用开发与优化方向)软件工程实践二环节教学大纲

    软件工程专业(互联网应用开发与优化方向)软件工程实践二环节教学大纲 培训课程 Phthon Web开发 实训公司 XXX 总周数 3周

  9. 2017软件工程实践总结

    一.请回望暑假时的第一次作业,你对于软件工程课程的想象 1)对比开篇博客你对课程目标和期待,"希望通过实践锻炼,增强计算机专业的能力和就业竞争力",对比目前的所学所练所得,在哪些方 ...

最新文章

  1. Apache,php配置
  2. Hibernate搭建成功!(源码)
  3. 天融信TOS系统命令行下查看资源使用情况
  4. 升降压斩波电路matlab,升降压直流斩波电路及matlab仿真.doc
  5. Linux 命令之 rpm -- RPM 软件包的管理工具
  6. scrolling=no 无法根据坐标获取元素_三坐标测量仪类型
  7. 【译】你不知道的Chrome调试工具技巧 第七天:异步console的趣味小窍门
  8. navicat连接批量删除_多连接数据库管理工具:Navicat Premium for Mac
  9. bzoj 1663: [Usaco2006 Open]赶集(最长路)
  10. ubuntu+nginx+php-cgi 环境开启php的curl功能
  11. (转)如何看待美国监管机构要求文艺复兴基金提交源码?
  12. 二级专业目录计算机(软件)类,一、二级学科专业目录及名称代码表
  13. 传递函数转化为状态空间 matlab,多变量系统传递函数模型转换为状态空间模型的MATLAB实现方法...
  14. 综述论文要写英文摘要吗_攻略|一些小论文撰写的建议
  15. TAGE Predictor
  16. 大学计算机专业那些课 --左飞
  17. 抖音短视频的推荐机制是什么? 国仁网络资讯
  18. 【树莓派开发】使用树莓派在Linux环境下编写C语言代码
  19. 猿创征文 | Java知识【Java基础语法】
  20. matlab memory 代数环,代数环概念 - MATLAB Simulink - MathWorks 中国

热门文章

  1. Vue的Prop配置
  2. html中怎么给长方形填充颜色,PS怎么在一个矩形里填充两种颜色 ps给矩形填充两种颜色的教程...
  3. 【有利可图网】PS教程:设计仿制“这就是街舞”字体效果教程
  4. [转]场面话大全,绝对受用一生
  5. windows无盘启动技术开发之UEFI(新一代BIOS)引导程序开发之一
  6. PYNQ 开发板连接互联网
  7. 0基础学web----小鲜项目搭建(拓展)
  8. 已解决ValueError: Length mismatch: Expected axis has 5 elements, new values have 4 elements
  9. kotlin入门笔记
  10. 软件缘-网友个人精心打造的精品软件收集_我是亲民_新浪博客