通过查阅文档,我们可以看到,一个聚合函数至少有两个函数来实现:
此外,还可以添加聚集结合函数(aggregate combine function):这个函数接收两个状态,合并为一个状态,并且返回,主要是当并行计算时,可能多组同时计算得到多个中间状态,需要通过这样的函数去合并这些状态。
进行下面步骤之前,我们先用源码安装好PostgreSQL(教程见
这里
)。在学习如何新增函数的过程中,少不了对原有的函数的学习,这个过程中需要调试来辅助学习,因此还应该先学习这篇文章:【
如何调试PG
】。
实现了上面8个函数每一个的转换函数、组合函数、最终函数。实现的函数有:
主要的函数,这些函数都需要之后写入PostgreSQL的初始函数表:
1.1. Datum int_entropy_accum(PG_FUNCTION_ARGS)
1.2. Datum text_entropy_accum(PG_FUNCTION_ARGS)
1.3. Datum entropy_combine(PG_FUNCTION_ARGS)
1.4. Datum entropy_final(PG_FUNCTION_ARGS)
1.5. Datum cross_int_entropy_accum(PG_FUNCTION_ARGS)
1.6. Datum cross_text_entropy_accum(PG_FUNCTION_ARGS)
1.7. Datum cross_entropy_combine(PG_FUNCTION_ARGS)
1.8. Datum cross_entropy_final(PG_FUNCTION_ARGS)
1.9. Datum kld_final(PG_FUNCTION_ARGS)
1.10. Datum jsd_final(PG_FUNCTION_ARGS)
辅助的函数,这里的函数只在该模块内部调用:
1.11. int APHash(char *str)
1.12. static ItemPs *makeItemPsAggState(FunctionCallInfo fcinfo)
1.13. static TwoItemPs *makeTwoItemPsAggState(FunctionCallInfo fcinfo)
1.14. void freeItemPs(ItemPs *state)
1.15. void freeTwoItemPs(TwoItemPs *state)
1.16. int is_in(int value, int *arr, int length)
1.17. void add_value_to_state(ItemPs *state, int value, int count, bool N_add)