山大软工实践hive(9)-dispatch关于minCost的计算

2021SC@SDUSC

山大软工实践hive(9)-dispatch关于minCost的计算

上一节说到要去看dispatcher,并已经梳理了大致步骤,现在要去理解。

从初始化看是DefaultRuleDispatcher
在这里插入图片描述

从DefaultRuleDispatcher开始

追踪dispatcher.dispatch(nd, ndStack, nodeOutputs);
在这里插入图片描述
三个参数分别是:当前被使用dispatch方法的节点,从哪条路径到该节点的节点栈,一个数组储存了该节点的子节点中的所有已经被调度过的节点(没有被调度的为null)

先看dispatch方法的前半部分
在这里插入图片描述
minCost先设定为最大值
这里的processRules是下图中的opRules,它是个map
在这里插入图片描述
Rule r就不断遍历 opRules中的Key(Rule),在这个优化器里只有一个(之前展示了另一个优化器,有许多Rule被添加进opRules),然后对每一个rule通过路径栈计算开销,如果开销正常并比当前最小值小,就记录该开销与规则

现在我们去看这个cost方法(RuleRegExp类)
在这里插入图片描述
前面就是根据情况决定用什么方法
在这里插入图片描述
总而言之这三个只有一个不为null,才会根据情况触发三个方法之一
在这里插入图片描述
三个参数是上图中间的三个,顺便一提这里的ruleName是“R1”,这里的 withoutWildCardChar是“FIL%”(根据之前的博客)

同时,如果特殊符号在wildCards里面的所有wildCards字符并且不是只有“|”这一种字符,那么就是被编译的正则表达式withWildCardChar;反之则是String数组ORWildChar,内容以"|"分割 (如下图推测)
在这里插入图片描述
回到cost方法,我们先看withoutWildCardChar不为null时的方法(也是这个优化器会调用的方法)
在这里插入图片描述
前面部分就是取栈长度与传入的字符串长度(这里是“FIL%”,长度为4)
StringBulider是可变字符串对象,并且是线程安全的,这里name初始化长度为字符串长度与栈长度之和
然后for循环:

  1. 对于这个栈依次取节点的名字并加%,然后放到目前的name的最前面(以FilterOperator为例,它的名字是FIL;SelOperator是SEL,和前面的算子的简称串联起来了,可以猜测,这个%是连接符,代表DAG的边
  2. 然后如果目前那么的长度大于等于withoutWCC,那么看是否两者相等,如果相等就返回withoutWCC的长度,不相等则break,返回-1,如果长度小于则执行下一个循环

这个cost就算完了,-1代表无效,在dispatch方法里会排除这个(cost>=0的条件),但疑惑的是为什么返回的是字符串的长度,而不是返回目前是几个算子?而且为什么这个方法只有两个返回,要么-1,要么就是最开始传入的“FIL%”的长度?

接着看第二种情况,即withWCC不为null时的方法
在这里插入图片描述
这里name的构造与上一个方法一样,不一样的是Matcher,它会每次让name与当前正则表达式与记录的withWildCardChar的正则表达式进行全局比对,如果对得上就返回name的长度,一直没对上就返回-1

也就是说,在进行开销计算时,一定要让计算匹配opRules传入的规则,当传入如 FIL% 这种就是绝对规则,要么从栈中取出的规则要与它相同,要么就是无效开销;而如果包含正则表达式,则进行这里的匹配,规则具有更多可能性。问题在于,开销是什么,为什么要这样计算,为什么是字符串的长度?

接下来是特殊字符只有“|”时的方法
在这里插入图片描述
在这里插入图片描述

这个方法太长了,以下为总结
方法思想:以 | 为间隔代表or,即ORWCC数组的每一个元素对name做类似withoutWCC的比对,只有当所有元素都匹配不了才返回-1,反之返回对应长度
实现:先申明一个hashMap<字符串长度,可能的规则(name)>,然后用之前的for循环对其初始化(如上面两种方法),并且当字符串name长度大于ORWCC数组第一个元素长度时与之比较,不匹配则看下一个元素;可以发现栈并没有遍历完,也因此会记录一个叫maxLength的参数,记录当前name的长度的最大值,如果ORWCC的元素小于该值,则不断取下一个,知道结束,或者当元素长度大于该值,则从hashmap取出maxLength对应的name,并且从此处开始对name进行运算。

总而言之是对|符号的特殊优化,把它转化成多个withoutWCC的比较

以上内容的总结

就是opRules添加一个或多个规则,并且在不同的Walker里在DAG上会走出不同的路径,这个路径存放在stack里,用于对某节点进行dispatch方法时使用,使用的原则就是与opRules的每个规则进行以上的开销计算,获取一个最小的且大于0的cost值

问题是:
nodeoutput还没使用;
cost的数值到底是根据什么规则,为什么是字符串长度;
为什么要匹配一开始的opRules的规则,是因为逻辑优化如此吗

接下来

往下看
整理几大基础类型的关系(Node,Rule,Dispatcher等)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值