MatrixOne 开发感悟
初识
这里也还没听说过 MatrixOne 的读者介绍一下:
MatrixOne is a future-oriented hyper-converged cloud and edge native DBMS that supports transactional, analytical, and streaming workloads with a simplified and distributed database engine, across multiple data centers, clouds, edges and other heterogeneous infrastructures.[1]
以 Y7n05h 的个人感受,这是一个正在蓬勃发展的社区。仅仅是最近几天 Github 的主分支上就已经有了很多的提交。
恰逢 Y7n05h 对数据库系统的设计还是非常感兴趣的,Y7n05h 还是像去参与进去看看能不能完成一些社区所需要的功能。
参与
当然,要参与社区贡献,那也不是随随便便就参与的。首先,Y7n05h 看了下 CoC,仔细的看了下里面的条款,Y7n05h 认为里面的内容和自己的价值观是基本基本一致的,也是一个很包容新的参与者的社区。又看了一项目的下 License,发现是 Apache-2.0
这也是 FSF 和 OSI 共同批准的自由软件/自由软件许可证。
看完这些 Y7n05h 对 MatrixOne 社区也没有别的顾虑了,放心的在 issues 里面找了个带有 good first issue
标签的简单的 issues 去完成。
[Feature Request]: Mathematical Built-in function exp()
这就是 Y7n05h 决定去完成的 issue 了。
这个 issues 就是去实现 exp()
这个函数,也就是数学中的 $e^x$ 。issues 中给出了一个十分详细的文档 用来指导贡献者如何为 MatrixOne 添加一个新的内置函数。
说回 exp()
,这是一个常见的数学函数,为了便于说明,Y7n05h 还是放出他的图像。
相信中学的知识足够得出它的定义域是 $R$ 值域是 $(0,+\infty)$ 。
感觉这函数的数学特性,需要作出一些合理的设计。首先要想的是这个函数的返回值该是什么类型。
Y7n05h 想过,是否该接受一个整数类型的输入并返回一个小数部分被阶段的整数类型的结果。但这是不合理的。因为 $e^{45}$ 即使存储在 Uint64 里面也会发生整数溢出。也就意味着,倘若返回一个整数,若以任何大于等于 45 的整数作为参数进行调用 exp()
都会得到一个溢出后的数据。这显然是不可接受的。
那么,如何解决这种困境呢?通过将返回类型更改为浮点数这样不但在输入较小时不受指数函数的爆炸式增长的影响,且在输入数据较大时能够以精度的损失为代价保存下结果的近似值。
因此,不难想到,接受任意的整数或浮点数类型,并输出一个 float64 是一个最合适的选择。
下面的困难就是如何完成这个内置函数了。关于实现这个函数,根据 文档,只需要完成:
- 注册函数的类型
- 实现函数
这两个步骤既可。
写完这些之后,也还需要对函数的实现部分撰写单元测试。
上述内容实际上也就设计 4 个文件的更改。
在刚开始的时候,虽然有十分详细的文档,但 Y7n05h 也不能很好的理解整个函数实现方法,加之对这个项目是第一次接触,不能正确的理解项目的复杂结构(虽说 Y7n05h 只要看懂部分的结构就够了,但那是 Y7n05h 连部分结构也都没看明白)。
但这也并非无解。项目的源码里面,log()
、ln()
、abs()
这些函数的实现方式与 exp()
其实是十分类似的,已有的实现其实是文档未尽之处的最好补充。因此,Y7n05h 通过参考这些函数的实现最终完成了这个 issues。
参考资料
1. matrixone.[G/OL]. https://github.com/matrixorigin/matrixone/blob/main/README.md. ↩
MatrixOne 开发感悟