在实现向量执行引擎的过程中,有大量不同类型,语义相同, 代码结构很相似的函数, 比如:
- +, - , *, /, %等算数运算.
- 类型之间相互cast的函数.
- 各种builtin函数.
这种函数,经过不同参数的排列组合下来, 数量非常庞大. 编写这么规模庞大函数,需要投入很大的精力. 同时, 后期维护成本也很大, 比如:
- 增加一个新类型,比如增加Array,Map, Struct等类型。
- 重构某一个类型,比如Decimal128的基础上,支持Decimal64, Decimal32, Decimal256.
- 发现为某一种具体运算的更有的向量实现,需要变更算法. 比如,double转string的函数需要变更,而tinyint,smallint,int等类型的转string函数保持不变.
怎么处理这么一大堆函数,满足下面条件:
- 代码类型安全: 如果类型错误,编译时的静态检查,可以给出报错提示.
- 代码的boilerplate要少: 重复的代码不利于维护,或者维护时,容易漏写.
- 代码的局部可调整性要好:代码足够的灵活,随时可以抽取一个特例,进行改写.
总之, 代码的逻辑上,要能够做到incremental refine.
本文作者起先尝试,使用模板重构DorisDB(incubator-doris的商业化版本), 但操作的过程中发现,直接使用模板,还是