Versions Compared

Key

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

...

Filter 表示基本的过滤条件。用户可以在时间戳上、或某一列的值上给出具体的过滤条件。将时间戳和列值的过滤条件加以区分后,设 t 表示某一时间戳常量,Filter 有以下 12 种基本类型,在实现上是继承关系。


Filter类型含义示例
TimeEq时间过滤条件时间戳等于某个值TimeEq(t),表示时间戳等于 t
TimeGt时间过滤条件时间戳大于某个值TimeGt(t),表示时间戳大于 t
TimeGtEq时间过滤条件时间戳大于等于某个值TimeGtEq(t),表示时间戳大于等于 t
TimeLt时间过滤条件时间戳小于某个值TimeLt(t),表示时间戳小于 t
TimeLtEq时间过滤条件时间戳小于等于某个值TimeLtEq(t),表示时间戳小于等于 t
TimeNotEq时间过滤条件时间戳不等于某个值TimeNotEq(t),表示时间戳不等于 t
ValueEq值过滤条件该列数值等于某个值ValueEq(2147483649),表示该列数值等于 2147483649
ValueGt值过滤条件该列数值大于某个值ValueGt(100.5),表示该列数值大于 100.5
ValueGtEq值过滤条件该列数值大于等于某个值ValueGtEq(2),表示该列数值大于等于 2
ValueLt值过滤条件该列数值小于某个值ValueLt("string"),表示该列数值字典序小于"string"
ValueLtEq值过滤条件该列数值小于等于某个值ValueLtEq(-100),表示该列数值小于等于-100
ValueNotEq值过滤条件该列数值不等于某个值ValueNotEq(true),表示该列数值的值不能为 true



Filter 可以由一个或两个子 Filter 组成。如果 Filter 由单一 Filter 构成,则称之为一元过滤条件,及 UnaryFilter 。若包含两个子 Filter,则称之为二元过滤条件,及 BinaryFilter。在二元过滤条件中,两个子 Filter 之间通过逻辑关系“与”、“或”进行连接,前者称为 AndFilter,后者称为 OrFilter。AndFilter 和 OrFilter 都是二元过滤条件。UnaryFilter 和 BinaryFilter 都是 Filter。

...

为了便于表示,下面给出 Basic Filter、AndFilter 和 OrFilter 的符号化表示方法,其中 t 表示数据类型为 INT64 的变量;v 表示数据类型为 BOOLEAN、INT32、INT64、FLOAT、DOUBLE 或 BINARY 的变量。


名称符号化表示方法示例
TimeEqtime == ttime == 14152176545,表示 timestamp 等于 14152176545
TimeGttime > ttime > 14152176545,表示 timestamp 大于 14152176545
TimeGtEqtime >= ttime >= 14152176545,表示 timestamp 大于等于 14152176545
TimeLttime < ttime < 14152176545,表示 timestamp 小于 14152176545
TimeLtEqtime <= ttime <= 14152176545,表示 timestamp 小于等于 14152176545
TimeNotEqtime != ttime != 14152176545,表示 timestamp 等于 14152176545
ValueEqvalue == vvalue == 10,表示 value 等于 10
ValueGtvalue > vvalue > 100.5,表示 value 大于 100.5
ValueGtEqvalue >= vvalue >= 2,表示 value 大于等于 2
ValueLtvalue < vvalue < “string”,表示 value [1e 小于“string”
ValueLtEqvalue <= vvalue <= -100,表示 value 小于等于-100
ValueNotEqvalue != vvalue != true,表示 value 的值不能为 true
AndFilter<Filter> && <Filter>1. value > 100 && value < 200, 表示 value 大于 100 且小于 200;
2. (value >= 100 && value <= 200) && time > 14152176545, 表示“value 大于等于 100 且 value 小于等于 200” 且 “时间戳大于 14152176545”
OrFilter<Filter> || <Filter>1. value > 100 || time > 14152176545,表示 value 大于 100 或时间戳大于 14152176545;
2. (value > 100 && value < 200)|| time > 14152176545,表示“value 大于 100 且 value 小于 200”或“时间戳大于 14152176545”


1.2 Expression 表达式

当一个过滤条件作用到一个时间序列上,就成为一个表达式。例如,“数值大于 10” 是一个过滤条件;而 “序列 d1.s1 的数值大于 10” 就是一条表达式。特殊地,对时间的过滤条件也是一个表达式,称为 GlobalTimeExpression。以下章节将对表达式进行展开介绍。


#### 1.2.1 SingleSeriesExpression 表达式

...

        IExpression(
            AndExpression
                SingleSeriesExpression(“d1.s1”, (value > 100 && value < 200) || time > 14152176645)
                SingleSeriesExpression(“d1.s2”, value > 0.5 && value < 1.5)
        )

    **解释**:该 解释:该 IExpression 为一个 AndExpression,其中要求"d1.s1"和"d1.s2"必须同时满足其对应的 Filter。

...

        IExpression(
            AndExpression
                AndExpression
                    SingleSeriesExpression(“d1.s1”, (value > 100 && value < 200) || time > 14152176645)
                    SingleSeriesExpression(“d1.s2”, value > 0.5 && value < 1.5)
                GlobalTimeExpression(time > 14152176545 && time < 14152176645)
        )

    **解释**:该 解释:该 IExpression 为一个 AndExpression,其要求"d1.s1"和"d1.s2"必须同时满足其对应的 Filter,且时间列必须满足 GlobalTimeExpression 定义的 Filter 条件。####


1.2.4 可执行表达式


便于理解执行过程,定义可执行表达式的概念。可执行表达式是带有一定限制条件的 IExpression。用户输入的查询条件或构造的 IExpression 将经过特定的优化算法(该算法将在后面章节中介绍)转化为可执行表达式。满足下面任意条件的 IExpression 即为可执行表达式。

...

    IExpression(SingleSeriesExpression(“d1.s1”, value > 100 && value < 200))

是否为可执行表达式:是

**解释**:该 解释:该 IExpression 为一个 SingleSeriesExpression,满足条件 2

...

    IExpression(GlobalTimeExpression (time > 14152176545 && time < 14152176645))

是否为可执行表达式:是

**解释**:该 解释:该 IExpression 为一个 GlobalTimeExpression,满足条件 1

...

    IExpression(
        AndExpression
            GlobalTimeExpression (time > 14152176545)
            GlobalTimeExpression (time < 14152176645)
    )

是否为可执行表达式:否

**解释**:该 解释:该 IExpression 为一个 AndExpression,但其中包含了 GlobalTimeExpression,不满足条件 3

...

    IExpression(
        OrExpression
            AndExpression
                SingleSeriesExpression(“d1.s1”, (value > 100 && value < 200) || time > 14152176645)
                SingleSeriesExpression(“d1.s2”, value > 0.5 && value < 1.5)
        SingleSeriesExpression(“d1.s3”, value > “test” && value < “test100”)
    )

是否为可执行表达式:是

**解释**:该 解释:该 IExpression 作为一个 OrExpression,其中叶子结点都是 SingleSeriesExpression,满足条件 4.

...

    IExpression(
        AndExpression        
            AndExpression
                SingleSeriesExpression(“d1.s1”, (value > 100 && value < 200) || time > 14152176645)
                SingleSeriesExpression(“d1.s2”, value > 0.5 && value < 1.5)
            GlobalTimeExpression(time > 14152176545 && time < 14152176645)
    )

是否为可执行表达式:否

**解释**:该 解释:该 IExpression 为一个 AndExpression,但其叶子结点中包含了 GlobalTimeExpression,不满足条件 3

...

    算法实现是,使用 FilterFactory 类中的 AndFilter and(Filter left, Filter right) 和 OrFilter or(Filter left, Filter right) 方法进行实现。
    

* combineTwoGlobalTimeExpression: 将两个 GlobalTimeExpression 合并为一个 GlobalTimeExpression。
  
  该方法接受三个输入参数,方法的定义为:

...

    该方法首先调用 optimize() 方法,将输入的第二个参数 IExpression 转化为可执行表达式(从 optimize() 方法上看为递归调用),然后再分为两种情况进行合并。

   

情况一:GlobalTimeExpression *情况一*:GlobalTimeExpression 和优化后的 IExpression 的关系为 AND。这种情况下,记 GlobalTimeExpression 的 Filter 为 tFilter,则只需要 tFilter 合并到 IExpression 的每个 SingleSeriesExpression 的 Filter 中即可。void addTimeFilterToQueryFilter(Filter timeFilter, IExpression expression) 为具体实现方法。例如:

...

        IExpression
            AndExpression
                OrExpression
                    SingleSeriesExpression(“path1”, AndFilter(filter1, tFilter))
                    SingleSeriesExpression(“path2”, AndFilter(filter2, tFilter))
                SingleSeriesExpression(“path3”, AndFilter(filter3, tFilter))

   

情况二:GlobalTimeExpression *情况二*:GlobalTimeExpression 和 IExpression 的关系为 OR。该情况下的合并步骤如下:
    1. 得到该查询所要投影的所有时间序列,其为一个 Path 的集合,以一个包含三个投影时间序列的查询为例,记所有要投影的列为 PathList{path1, path2, path3}。
    2. 记 GlobalTimeExpression 的 Filter 为 tFilter,调用 pushGlobalTimeFilterToAllSeries() 方法为每个 Path 创建一个对应的 SingleSeriesExpression,且每个 SingleSeriesExpression 的 Filter 值均为 tFilter;将所有新创建的 SingleSeriesExpression 用 OR 运算符进行连接,得到一个 OrExpression,记其为 orExpression。
    3. 调用 mergeSecondTreeToFirstTree 方法将 IExpression 中的节点与步骤二得到的 orExpression 中的节点进行合并,返回合并后的表达式。

...