如何编写聚合函数
聚合函数是一种将多行数值合并为单个汇总值的函数。常见的聚合函数包括 sum、count、avg 等。
Databend 允许您使用 Rust 自定义聚合函数。这不是一个简单的方法,因为您首先需要成为一名 Rustacean。
Databend 计划将来支持使用其他语言(如 js、web assembly)编写 UDAF。
本节介绍如何在 Databend 中编写聚合函数。
函数注册
聚合函数的注册函数接受一个小写的函数名和一个 AggregateFunctionDescription
对象作为参数。每个注册的函数都存储在 case_insensitive_desc
(HashMap 数据结构)中。
case_insensitive_combinator_desc
用于存储组合函数,例如与 _if
后缀组合的 count_if
和 sum_if
。
pub struct AggregateFunctionFactory {
case_insensitive_desc: HashMap<String, AggregateFunctionDescription>,
case_insensitive_combinator_desc: Vec<(String, CombinatorDescription)>,
}
impl AggregateFunctionFactory {
...
pub fn register(&mut self, name: &str, desc: AggregateFunctionDescription) {
let case_insensitive_desc = &mut self.case_insensitive_desc;
case_insensitive_desc.insert(name.to_lowercase(), desc);
}
...
}