起源
最近自己从学长口中得知matrixone——专为异构工作负载打造的全球规模、云边缘原生大数据引擎
MatrixOne 是面向未来的超融合云和边缘原生 DBMS,它通过简化的分布式数据库引擎支持跨多个数据中心、云、边缘和其他异构基础架构的事务、分析和流工作负载。
偶然了解到matrixone发布了一部分 good first issue 的 task,非常适合新手去完成,详细的文档介绍和对于matrixone的兴趣,我参与了其中一个相关任务中
简介
ceil(x[, N]), ceiling(x[, N])
Returns the smallest round number that is greater than or equal to x.
In every other way, it is the same as the floor function (see above).
这是ceil的真实具体实现,需要兼容floor的语意,并且向下返回不小于 X 的最小整数值。
ceil(1.23) -----> 1.0
ceil(1.23, 0) ----> 1.0
ceil(1.23, 1) -----> 1.2
ceil(12.34, -1) ---- > 10.0
开始
我就是看到任务发布后就一头扎进去实现该函数,然后直接pr,,但是Reviewers要求要与floor的语意兼容,所以就重构了代码,所以大家在参与开源中要仔细看文档,多提issue和社区人员沟通好后,最后codeing,我感觉还是至关重要。
参照具体帮助文档(文档还是很具体的),然后就是函数实现。
具体实现
1.注册函数,声明函数参数类型和返回类型。
2.实现具体函数
3.编译并连接数据库
4,编写单元测试并完成test
1.注册函数和返回值,参照相关文档实现即可
for _, item := range argsAndRets {
overload.AppendFunctionRets(builtin.Ceil, item.args, item.ret)
}
extend.MultiReturnTypes[builtin.Ceil] = func(es []extend.Extend) types.T {
return getMultiReturnType(builtin.Ceil, es)
}
2.函数实现
实现以unint8 作为输入和输出为例展示代码逻辑
func ceilUint8Pure(xs, rs []uint8, digits int64) []uint8 {
// maximum uint8 number is 255, so we only need to worry about a few digit cases,
switch {
case digits >= 0:
return xs
case digits == -1 || digits == -2:
scale := uint8(floor.ScaleTable[-digits])
for i := range xs {
t := xs[i] % scale
s := xs[i]
if t != 0 {
s -= t
rs[i] = (s + scale) / scale * scale
} else {
rs[i] = xs[i]
}
}
case digits <= -floor.MaxUint8digits:
for i := range xs {
rs[i] = 0
}
}
return rs
}
尤其对于digits<0做具体解析,特别注意go中数据的范围
结果
交上代码,虽然有些细节上的debug,但是社区的Reviewers,确实非常热情,积极的回复issue并且非常细心的指出问题
最后成功将pr merage 主分支,虽然不是很难,但是参与到开源中还是很开心