Presto源码阅读笔记(Cli篇)

一、客户端启动

当客户端启动时(console执行run方法时),run方法中会进行一个判断,判断cli是否被终止,如果终止则使用addShutdownHook方法对当前正在执行的线程进行一个中断,并使当前线程进入一个等待唤醒的状态
addShutdownHook方法
在这里插入图片描述

当我们使用客户端进行连接时,会进行轮询判断,判断客户端是否还存活
在这里插入图片描述

获取PROMPT_NAME常量并赋值给prompt变量,并从queryRunner的session中获取schema信息,如果存在,则将 “:” 加schema信息添加至prompt变量末尾。
在这里插入图片描述

判断缓冲区内是否存在值,如存在,则说明语句没有输入完,将变量prompt赋值成PROMPT_NAME常量长度的空格加上 - 符号
在这里插入图片描述
最后在prompt变量后加>并输出到控制台
在这里插入图片描述
在这里插入图片描述

二、指令输入

将终端输入的命令使用赋值给line变量
在这里插入图片描述
判断本次的请求线程是否为中断状态,如果为中断状态,则清除缓冲区,执行下一个轮询请求
在这里插入图片描述

如果输入为空,则return回终端输入界面
在这里插入图片描述
从缓冲区是否存在值来判断是否为第一行,如果为第一行,则需要检测是否存在特殊命令,将变量line的值去掉前后空格赋给变量command
在这里插入图片描述
使用正则表达式来判断终端输入的命令是不是数字,如果是则获取输入数字所对应历史查询的索引并在终端输出历史查询的信息,如果输入数字小于零或者没有查询到相应索引的历史查询,则输出错误信息"Command does not exist"并进行下一次轮询
在这里插入图片描述
判断查询命令是否为分号结尾,如果是则将去掉分号的sql语句赋值给command变量
在这里插入图片描述
判断命令是否为exit,help,history,help,如果是则执行相应的逻辑
在这里插入图片描述
如果程序执行到这里则说明不为特殊命令,则将终端输入的指令加换行符后传入缓冲区
在这里插入图片描述
对代码以分号进行分割(\G在sql中可以理解为分号),并进行判断该sql语句是否为分号结尾,如果不是则为变量outputFormatoutputFormat赋常量值ALIGNED,是分号结尾则赋常量值VERTICAL
StatementSplitter类详解
在这里插入图片描述
这里定义常量使用了enum类型定义常量
在这里插入图片描述
之后执行process方法并将本次查询存入history中
在这里插入图片描述
检测是否存在不完整的语句并将其存入缓冲区(这里的完整指的是是否为分号结尾)
在这里插入图片描述

三、发送请求

这里说一下process方法
process方法的主要作用是用来初始执行某一条SQL,并通过初始执行返回信息不断查询结果
首先先对查询的sql进行补充,将queryRunner对象的session中存储的Catalog与Schema信息存入变量findSql
在这里插入图片描述
执行startQuery方法,该方法的主要作用是发送http请求(这里的query在执行完后会自动进行close)
在这里插入图片描述
在startQuery方法内部建立http请求并发送
在这里插入图片描述
包装request请求
在这里插入图片描述
发送请求并获取response
在这里插入图片描述
processResponse会将response的响应结果存入常量currentResults中
在这里插入图片描述
在这里插入图片描述

注意,这里获取的response不是查询的结果,所以需要再次向服务端发送请求来获取查询结果。回到Console类,可以看到执行了renderOutput方法,这个方法在获取到返回信息后不断循环进行查询
在这里插入图片描述
renderOutput方法进行判断当用户中断或者客户端挂掉的时候,直接返回,否则将当前线程暂时中断,执行完renderQueryOutput方法后再清除掉该线程的中断状态
在这里插入图片描述

renderQueryOutput方法中先判断客户端是否中断,如果中断则执行printInitialStatusUpdates方法,如果没有则执行processInitialStatusUpdates方法不断循环访问nextUri查询结果

在这里插入图片描述
processInitialStatusUpdates方法
在这里插入图片描述
processInitialStatusUpdates方法中执行advance方法不断获取下一个uri(这个uri中包括了queryid以及token)再次向服务端发送请求
如果nextUri为空,则将state从运行(RUNNING)置为结束(FINISHED),并直接返回false说明没有需要继续查询的数据了
在这里插入图片描述
生成的uri如下
在这里插入图片描述
使用nextUir构建request对象并使用execute方法进行发送
获取response
在这里插入图片描述
如果从获取的results中没有检测到Columns信息,则控制台输出"no columns"然后返回false
在这里插入图片描述
直到advance返回false时跳出while循环
执行console.resetScreen()方法逐行打印查询到的结果
在这里插入图片描述
至此,客户端sql执行流程完毕

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值