Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

功能描述


扩展聚合语句中支持“group by level=

...

n”的功能

Group by level语句中可以支持多个聚合函数的存在。


实现方案


接口修改

将FilePathUtils.getPathByLevel()的接口为放到AggregationPlan中,pathIndex作为AggregationPlan的成员。

Map<String, AggregateResult> getPathByLevel()

返回值finalPaths的类型是Map<String, AggregateResult>,Key为由聚合函数和序列名拼接而成的字符串,如avg(root.sg.d1.s1),用于区分多个聚合函数的相同序列。该字符串会显示为查询结果的列名。

IoTDB> select count(temperature),avg(temperature) from root.sg.*.*

目前计划暂时先支持select语句中聚合函数有且只有一个的情况。即对于以下sql语句:

select func(<measurement>) from <path> group by level=n

...

Jira
serverASF JIRA
serverId5aa69414-a9e9-3523-82ec-879b028fb15b
keyIOTDB-1024

...

2

+-----------------------------+-----------------------------+---------------------------+---------------------------+
|count(root.sg.d1.temperature)|count(root.sg.d2.temperature)|avg(root.sg.d1.temperature)|avg(root.sg.d2.temperature)|
+-----------------------------+-----------------------------+---------------------------+---------------------------+
|                           2|                           2|                     114.0|         45.915000915527344|
+-----------------------------+-----------------------------+------------------- -------+---------------------------+


考虑到需要支持多种聚合函数及多种数据类型的需求,将mergeRecordByPath接受的参数类型改为中间类型AggregateResult,修改为:

Image Removed

实现方案

接口修改

目前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,修改为:

RowRecord 
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的过程中检查需要聚合的时间序列,如果类型不同则报错。

...


结果集 Header修改

修改cli返回的result header

...

如下图中,改为count(root.ln.wf01..temperature)和count(root.ln.wf02..temperature)

...

Screen Shot 2020-11-19 at 5.55.15 PMImage Added