功能描述
扩展聚合语句中支持“group by level=n”的功能,将之前只支持count()聚合函数的功能拓展为支持其他聚合函数,计划包含:sum, min_time, max_time, min_value, max_value, avg, last_value, first_value
目前计划暂时先支持select语句中聚合函数有且只有一个的情况。即对于以下sql语句:
select func(<measurement>) from <path> group by level=n
原因是目前已有的count() group by level对处理多个聚合measurement的查询实现有问题。对多个measurement聚合的功能扩展将会在Jira: 中完成。
接口修改
目前count()对多个序列结果集的合并逻辑位于 FilePathUtils.java的mergeRecordByPath()方法中。
mergeRecordByPath(RowRecord newRecord, Map<String, Long> finalPaths, Map<Integer, String> pathIndex)
其中pathIndex已在FilePathUtils.getPathByLevel()方法中已生成好。
Map<String, Long> finalPaths = FilePathUtils.getPathByLevel(plan.getDeduplicatedPaths(), ((AggregationPlan) plan).getLevel(), pathIndex);
考虑到需要支持多种聚合函数及多种数据类型的需求,将mergeRecordByPath接受的参数类型改为中间类型AggregateResult,修改为:
mergeRecordByPath(List<AggregateResult> aggResults, Map<String, AggregateResult> finalPaths, Map<Integer, String> pathIndex)
mergeRecordByPath的参数意义:
aggResults为对所有序列进行聚合后的结果列表,即一阶段聚合的结果集。
finalPaths的key为最终返回序列名,value为二次聚合计算结果, 需要在该方法中计算得到。
pathIndex为一个映射,映射内容为<聚合结果在aggResults列表中的index, 所属的返回序列名>。
基本逻辑为:对于aggResults中的每一个聚合结果,从pathIndex中找到对应的最终返回序列,对于位于同一返回序列的聚合结果进行二次聚合操作。二次聚合的操作交由AggregateResult类型计算,见AggregateResult.java中的merge()方法。
合并序列类型不同的处理
对于sum, avg, min_value, max_value四种聚合类型,考虑在生成physical plan的过程中检查需要聚合的时间序列,如果类型不同则报错。
Min_time, max_time, last_value, first_value不受影响。
结果集 Header修改
修改cli返回的result header
目前已实现的count函数返回结果的header不明确,如下图中,期望改为count(root.ln.wf01..temperature)和count(root.ln.wf02..temperature)