开源经历——MatrixOne 开发感悟

起源

最近自己从学长口中得知matrixone——专为异构工作负载打造的全球规模、云边缘原生大数据引擎

MatrixOne 是面向未来的超融合云和边缘原生 DBMS,它通过简化的分布式数据库引擎支持跨多个数据中心、云、边缘和其他异构基础架构的事务、分析和流工作负载。

偶然了解到matrixone发布了一部分 good first issue 的 task,非常适合新手去完成,详细的文档介绍和对于matrixone的兴趣,我参与了其中一个相关任务中
开源经历——MatrixOne 开发感悟_第1张图片

简介

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 主分支,虽然不是很难,但是参与到开源中还是很开心
开源经历——MatrixOne 开发感悟_第2张图片

你可能感兴趣的:(golang)