...
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 的变量。
名称 | 符号化表示方法 | 示例 |
---|---|---|
TimeEq | time == t | time == 14152176545,表示 timestamp 等于 14152176545 |
TimeGt | time > t | time > 14152176545,表示 timestamp 大于 14152176545 |
TimeGtEq | time >= t | time >= 14152176545,表示 timestamp 大于等于 14152176545 |
TimeLt | time < t | time < 14152176545,表示 timestamp 小于 14152176545 |
TimeLtEq | time <= t | time <= 14152176545,表示 timestamp 小于等于 14152176545 |
TimeNotEq | time != t | time != 14152176545,表示 timestamp 等于 14152176545 |
ValueEq | value == v | value == 10,表示 value 等于 10 |
ValueGt | value > v | value > 100.5,表示 value 大于 100.5 |
ValueGtEq | value >= v | value >= 2,表示 value 大于等于 2 |
ValueLt | value < v | value < “string”,表示 value [1e 小于“string” |
ValueLtEq | value <= v | value <= -100,表示 value 小于等于-100 |
ValueNotEq | value != v | value != 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 中的节点进行合并,返回合并后的表达式。
...