Versions Compared

Key

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

现状


Image RemovedImage Added


尽管IoTDB包含大量的查询类型,但是查询的 operator 只有基类的 QueryOperator,所有查询相关的标志位和参数都存储在同一个类中,包括聚合查询、GroupBy查询、AlignByDevice 等等。

...

而 Group by 查询,select count(s1) from root.sg.d1 group by ([1, 10), 2ms),则由第四部分确定。


总结一下:

第一部分确定的查询类型包括:

    1. 普通查询

    1. 聚合查询

    1. last 查询

    1. UDF 查询

第四部分确定的查询类型包括:

    1. Group by 查询

    1. Group by fill 查询

    1. Fill 查询

    1. Align by device 查询


我们计划为每种查询类型新建一个逻辑运算符,如为 Group by 新建 GroupByQueryOperator,以此方便之后物理计划生成的重构,即将物理计划生成放在不同种类的逻辑运算符内完成

...

首先明确一个概念,QueryOperator 继承自 SFWOperator。


Image RemovedImage Added


其中有三个成员变量,SelectOperator,FromOperator 和 FilterOperator。


Image RemovedImage Added


SFWOperator 的继承类包括:


Image RemovedImage Added



DeleteOperator 为例:


Image RemovedImage Added


其只是为了利用 SelectOperator 中的前(后)缀路径。

这显然是当时设计的时候图省事,就直接让这几个类继承 SFW 了。SFWOperator 还有对于 Where 子句中过滤条件的优化,这是 Insert、Delete 等运算符根本没必要去跑的。


Image RemovedImage Added


因此,这些类可以从 SFWOperator 的子类中分离出来。(这部分交给宇荣去做了)

...

此前,普通查询中 SELECT 子句中的后缀路径,聚合查询中的聚合函数等信息是存储在SFWOperator内的 SelectOperator 内的,而不是存储在 QueryOperator 内里。


Image RemovedImage Added


这部分中的后缀路径、聚合函数、UDF及算数表达式等信息,都会被包装为一个 List<ResultColumn> 的一个 List,其中相关操作都会在ResultColumn 内部完成,我们暂时不关心内部实现。

...

这个在读取到第一个 Select 元素时就可以进行判断,并生成对应的查询类型。


于是最后 QueryOperator 的类图为:


Image RemovedImage Added


QueryOperator主要内容如下:


Image RemovedImage Added


这里由于 Select、From 等只用来存储内容,并没有逻辑运算符的特性,因此其不应该继承 Operator,于是重新命名为 XxxComponent

...

SpecialClauseCompent 的类图为:


Image RemovedImage Added