[SDU软件工程实践]Blog5-从CommandProcessorFactory.get开始
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_ENABLED
,defaultVar
为true
。但是呢Driver
和ReExecDriver
,从名字来看,后者是“重新执行”的意思,不免让我猜测后者是否依赖于前者。于是我去查看ReExecDriver
的run
方法。
这是因为我提前粗略地阅读了下一步的代码,CommandProcessorFactory.get
这个方法的返回量被传入下一个方法后执行了run(cmd)
这个方法,这个方法是一个接口的方法,被Driver
和ReExecDriver
两个类实现。而且这个run
方法还被计时了,显然对应了执行hql语句后命令行返回的执行时长,run
就是核心方法,值得关注。而且这也说明这两个类间的联系。
run(cmd)
也经过了一些调用,最后是这个
这里我就发现了一个很有趣的事情:各种return
的值,都是来自于一个叫做coreDriver
的类变量的方法,而这个类变量恰恰又是个Driver
类对象。闭环了同学们!而且这个Driver
也执行过一个compileAndRespond
的方法(这是从run(cmd)
到run()
中间做的事情),传入参数就是我们得命令。我们可以确定Driver
才是核心,分析的目标应该是Driver
,这也为我们再下一步的分析指明了方向
总结
看似是确定了CommandProcessorFactory.get
的返回值情况,但是我最后发现这个分析恰好十分关键,为下一个方法——processLocalCmd
——的核心内容铺平了道路,明确了分析方向,可喜可贺。
[SDU软件工程实践]Blog5-从CommandProcessorFactory.get开始相关推荐
- [SDU软件工程实践]Blog4-processLine及processCmd
2021SC@SDUSC 目录 方法processLine 官方注释 字符串处理 方法processCmd 预处理 确定最终执行的是hql后 方法processLine 官方注释 官方其实在源代码里为 ...
- 【软件工程实践】Hive研究-Blog5
[软件工程实践]Hive研究-Blog5 2021SC@SDUSC 研究内容介绍 本人负责的是负责的是将查询块QB转换成逻辑查询计划(OP Tree) 如下的代码出自apaceh-hive-3.1.2 ...
- 【软件工程实践】Hive研究-Blog6
[软件工程实践]Hive研究-Blog6 2021SC@SDUSC 研究内容介绍 本人负责的是负责的是将查询块QB转换成逻辑查询计划(OP Tree) 如下的代码出自apaceh-hive-3.1.2 ...
- 软件工程python就业方向-软件工程实践总结
软工ByeBye~ 请回望暑假时的第一次作业,你对于软件工程课程的想象 对比开篇博客你对课程目标和期待,"希望通过实践锻炼,增强计算机专业的能力和就业竞争力",对比目前的所学所练所 ...
- 软件工程实践2017第二次作业
软件工程实践2017第二次作业 1)Github地址 https://github.com/Maple27/sudoku 2)解题思路 个人从小就对数独就很喜欢,对解数独有一定程度的了解,这次自己开发 ...
- 个人作业——软件工程实践总结
一.请回望暑假时的第一次作业,你对于软件工程课程的想象 对比开篇博客你对课程目标和期待,"希望通过实践锻炼,增强计算机专业的能力和就业竞争力",对比目前的所学所练所得,在哪些方面达 ...
- 个人作业收官——软件工程实践总结
个人作业收官--软件工程实践总结 一.回望开学初对于软件工程课程的想象,回望博客开篇时对于这门课和这学期的期望, 1)对比现在的你和开学初博客开篇的课程目标和期待. 能力的预期 1.对于java的一些 ...
- 软件工程专业(互联网应用开发与优化方向)软件工程实践二环节教学大纲
软件工程专业(互联网应用开发与优化方向)软件工程实践二环节教学大纲 培训课程 Phthon Web开发 实训公司 XXX 总周数 3周
- 2017软件工程实践总结
一.请回望暑假时的第一次作业,你对于软件工程课程的想象 1)对比开篇博客你对课程目标和期待,"希望通过实践锻炼,增强计算机专业的能力和就业竞争力",对比目前的所学所练所得,在哪些方 ...
最新文章
- Apache,php配置
- Hibernate搭建成功!(源码)
- 天融信TOS系统命令行下查看资源使用情况
- 升降压斩波电路matlab,升降压直流斩波电路及matlab仿真.doc
- Linux 命令之 rpm -- RPM 软件包的管理工具
- scrolling=no 无法根据坐标获取元素_三坐标测量仪类型
- 【译】你不知道的Chrome调试工具技巧 第七天:异步console的趣味小窍门
- navicat连接批量删除_多连接数据库管理工具:Navicat Premium for Mac
- bzoj 1663: [Usaco2006 Open]赶集(最长路)
- ubuntu+nginx+php-cgi 环境开启php的curl功能
- (转)如何看待美国监管机构要求文艺复兴基金提交源码?
- 二级专业目录计算机(软件)类,一、二级学科专业目录及名称代码表
- 传递函数转化为状态空间 matlab,多变量系统传递函数模型转换为状态空间模型的MATLAB实现方法...
- 综述论文要写英文摘要吗_攻略|一些小论文撰写的建议
- TAGE Predictor
- 大学计算机专业那些课 --左飞
- 抖音短视频的推荐机制是什么? 国仁网络资讯
- 【树莓派开发】使用树莓派在Linux环境下编写C语言代码
- 猿创征文 | Java知识【Java基础语法】
- matlab memory 代数环,代数环概念
- MATLAB Simulink
- MathWorks 中国
热门文章
- Vue的Prop配置
- html中怎么给长方形填充颜色,PS怎么在一个矩形里填充两种颜色 ps给矩形填充两种颜色的教程...
- 【有利可图网】PS教程:设计仿制“这就是街舞”字体效果教程
- [转]场面话大全,绝对受用一生
- windows无盘启动技术开发之UEFI(新一代BIOS)引导程序开发之一
- PYNQ 开发板连接互联网
- 0基础学web----小鲜项目搭建(拓展)
- 已解决ValueError: Length mismatch: Expected axis has 5 elements, new values have 4 elements
- kotlin入门笔记
- 软件缘-网友个人精心打造的精品软件收集_我是亲民_新浪博客