eKuiper Newsletter 2022-02 | 新增变化检测函数、重构共用连接
目前 eKuiper 处于 1.5.0 版本的开发周期中。本月我们主要实现了一个通用的变化检测函数,以满足很多用户提出的仅采集变化数据的需求。同时我们也在进行 1.4.3 版本的开发,解决了共用连接的订阅导致的问题以及其他用户反馈问题。
变化检测函数
通用的变化检测函数 changed_cols
已开发完成,并合并到 1.5.0 版本的分支中。changed_cols
函数的作用是检测指定的列是否发生变化,如果发生变化,则返回变化的列的值,否则不返回。在变化检测的场景中,用户经常需要监测多个列/表达式,而且数量不固定。因此,该函数可接收不定数量的参数,同时其返回值为多个列。相比于普通的标量函数固定返回单一结果列(多列结果会被包含在 map 中),这是第一个返回多列的函数,我们对函数的实现进行了重构以实现多列函数的支持。
该函数的使用语法为 CHANGED_COLS (<prefix>, <ignoreNull>, <expr> [,...,<exprN>])
。在下面的例子中,我们将检测 temperature
和 humidity
列是否发生变化,如果发生变化,则返回变化的列的值,且为列名添加c_
前缀,否则不返回对应的列。
SELECT CHANGED_COLS("c_", true, temperature, humidity) FROM demo
_________________________________________________________
{"c_temperature":23,"c_humidity":88}
{"c_temperature":25}
{"c_humidity":90}
{"c_humidity":91}
我们可以注意到,列的个数是可变的,同时列的参数也可以是别的表达式。列参数也支持 *
号,表示检测所有列,例如 SELECT CHANGED_COLS("c_", true, *) FROM demo
。
多列函数仅可在 select 子句中使用。其选出的值不能用于 WHERE 或其他子句中。若需要根据变化值做过滤,需要将 CHANGED_COLS 的规则作为规则流水线的前置规则。我们接下来将实现其他配套的变化检测函数,以标量函数的形式,支持获取变化值,从而在过滤等其余子句中进行使用。
1.4.3 版本动态
1.4.3 版本主要解决本月发现的一些问题。主要是共用连接在 MQTT 和 EdgeX 中的订阅同一个主题导致的问题。我们对共用连接的实现进行了重构,以解决这个问题。另外,我们还修复了预编译的 tdengine 插件运行崩溃的问题。