Francesc Campoy 发布的文章

Gitbase 是一个由 Go 驱动的开源项目,它使得我们可以在 Git 仓库上运行 SQL 查询。

Git 已经成为了代码版本控制的事实标准。虽然 Git 已经很流行了,但想用它来对源代码仓库的历史和内容进行深度分析,仍然是一件复杂的事情。

另一方面,SQL 则是一个经过实际检验、适合查询大型代码库的的语言,毕竟 Spark 和 BigQuery 等项目都采用了 SQL 作为查询语言。

因此,在 source{d} 公司,我们顺理成章地结合了这两种技术来创建了 Gitbase:这是一个用 SQL 对 Git 仓库进行大规模分析的“代码即数据”解决方案。

Gitbase 是一个完全开源的项目,它站在一系列巨人的肩膀上,是它们使 Gitbase 的发展成为可能。本文旨在指出其中的主要部分。

Gitbase 试验场 提供了一种使用 Gitbase 的可视化方式。

使用 Vitess 解析 SQL

Gitbase 将 SQL 作为用户接口。这意味着我们需要解析基于 MySQL 协议传输的 SQL 请求,并理解它们。幸运的是,我们在 YouTube 的朋友和他们的 Vitess 项目已经实现了这一点。Vitess 是一个数据库集群系统,用于 MySQL 的水平扩展。

我们直接截取一些重要的代码片段,并把它做成了一个 开源项目。这个项目允许任何人在几分钟内编写一个 MySQL 服务器(正如我在 justforfunc 的专题:CSVQL - 用 SQL 处理 CSV 中所展示的那样)。

用 go-git 读取 Git 储存库

当成功解析了一个请求,我们还需要读取数据集里的 Git 仓库,才能够知道该如何回复它。为此,我们集成了 source{d} 最成功的仓库 go-git。go-git 是一个高度可扩展的纯 Go 语言的 Git 实现。

这使得我们能够轻松地分析以 siva 文件格式存储在磁盘上的源代码仓库(siva 也是一个 source{d} 的开源项目),或是直接使用 git clone 克隆的仓库。

使用 Enry 检测编程语言,使用 Babelfish 解析文件

Gitbase 并没有将其分析能力局限于 Git 历史记录上。它还使用(显然也是)我们的开源项目 Enry 集成了语言检测功能,并使用 Babelfish 实现了程序解析的功能。Babelfish 是一个用于通用源代码解析的自托管服务器,它可以将代码文件转化为 通用抽象语法树 Universal Abstract Syntax Trees (UAST)。

这两个功能在 Gitbase 中呈现为用户函数 LANGUAGEUAST。结合使用两个函数,许多查询请求都成为了可能,比如“找到上个月修改次数最多的函数名称”。

让它快速运行

Gitbase 经常要分析非常大的数据集,比如公共 Git 档案,其中有来自 GitHub 的 3TB 源代码(见 公告)。为了做到这一点,每份 CPU 处理能力都很重要。

这就是为什么我们又集成了另外两个项目:Rubex 和 Pilosa。

使用 Rubex 和 Oniguruma 加快正则表达式的速度

Rubex 是 Go 的 regexp 标准库包的一个准替代品。之所以还不能完成替代,是因为他们没有在 regexp.Regexp 类型上实现 LiteralPrefix 方法,不过我也是直到现在才听说这个方法。

Rubex 的高性能得归功于高度优化的 C 语言库 Oniguruma,它使用 cgo 来调用这个库。

使用 Pilosa 索引加快查询速度

索引基本上是每个关系型数据库的众所周知的特性,但 Vitess 却没有实现索引,因为它不是真正需要。

还好开源的 Pilosa 再一次拯救了我们,它是一个用 Go 实现的分布式位图索引,使得 Gitbase 可以用于大规模的数据集。Pilosa 是开源的,它极大地加快了对多个海量数据集的查询。

总结

我想通过这篇博文,亲自感谢开源社区,是他们让我们在如此短的时间内创建了 Gitbase,这是谁也没想到的。在 source{d} 公司,我们是开源的坚定信仰者,github.com/src-d 下的每一行代码(包括我们的 OKR 和投资者委员会)都可以证明这一点。

你想尝试一下 Gitbase 吗?最快、最简单的方法就是使用 source{d} 引擎。从 sourced.tech/engine 下载它,只需一个命令就能让 Gitbase 运行起来。

想了解更多吗?请查看我在 Go SF meetup 的演讲录音。

这篇文章 最初发表在 Medium 上,经授权后在此重新发布。


via: https://opensource.com/article/18/11/gitbase

作者:Francesc Campoy 选题:lkxed 译者:lkxed 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

gitbase 是一个使用 go 开发的的开源项目,它实现了在 Git 仓库上执行 SQL 查询。

Git 已经成为了代码版本控制的事实标准,但尽管 Git 相当普及,对代码仓库的深入分析的工作难度却没有因此而下降;而 SQL 在大型代码库的查询方面则已经是一种久经考验的语言,因此诸如 Spark 和 BigQuery 这样的项目都采用了它。

所以,source{d} 很顺理成章地将这两种技术结合起来,就产生了 gitbase(LCTT 译注:source{d} 是一家开源公司,本文作者是该公司开发者关系副总裁)。gitbase 是一个 代码即数据 code-as-data 的解决方案,可以使用 SQL 对 git 仓库进行大规模分析。

gitbase 是一个完全开源的项目。它站在了很多巨人的肩上,因此得到了足够的发展竞争力。下面就来介绍一下其中的一些“巨人”。

gitbase playground 为 gitbase 提供了一个可视化的操作环境。

用 Vitess 解析 SQL

gitbase 通过 SQL 与用户进行交互,因此需要能够遵循 MySQL 协议来对通过网络传入的 SQL 请求作出解析和理解,万幸由 YouTube 建立的 Vitess 项目已经在这一方面给出了解决方案。Vitess 是一个横向扩展的 MySQL 数据库集群系统。

我们只是使用了这个项目中的部分重要代码,并将其转化为一个可以让任何人在数分钟以内编写出一个 MySQL 服务器的开源程序,就像我在 justforfunc 视频系列中展示的 CSVQL 一样,它可以使用 SQL 操作 CSV 文件。

用 go-git 读取 git 仓库

在成功解析 SQL 请求之后,还需要对数据集中的 git 仓库进行查询才能返回结果。因此,我们还结合使用了 source{d} 最成功的 go-git 仓库。go-git 是使用纯 go 语言编写的具有高度可扩展性的 git 实现。

借此我们就可以很方便地将存储在磁盘上的代码仓库保存为 siva 文件格式(这同样是 source{d} 的一个开源项目),也可以通过 git clone 来对代码仓库进行复制。

使用 enry 检测语言、使用 babelfish 解析文件

gitbase 集成了我们开源的语言检测项目 enry 以及代码解析项目 babelfish,因此在分析 git 仓库历史代码的能力也相当强大。babelfish 是一个自托管服务,普适于各种源代码解析,并将代码文件转换为 通用抽象语法树 Universal Abstract Syntax Tree (UAST)。

这两个功能在 gitbase 中可以被用户以函数 LANGUAGEUAST 调用,诸如“查找上个月最常被修改的函数的名称”这样的请求就需要通过这两个功能实现。

提高性能

gitbase 可以对非常大的数据集进行分析,例如来自 GitHub 高达 3 TB 源代码的 Public Git Archive(公告)。面临的工作量如此巨大,因此每一点性能都必须运用到极致。于是,我们也使用到了 Rubex 和 Pilosa 这两个项目。

使用 Rubex 和 Oniguruma 优化正则表达式速度

Rubex 是 go 的正则表达式标准库包的一个准替代品。之所以说它是准替代品,是因为它没有在 regexp.Regexp 类中实现 LiteralPrefix 方法,直到现在都还没有。

Rubex 的高性能是由于使用 cgo 调用了 Oniguruma,它是一个高度优化的 C 代码库。

使用 Pilosa 索引优化查询速度

索引几乎是每个关系型数据库都拥有的特性,但 Vitess 由于不需要用到索引,因此并没有进行实现。

于是我们引入了 Pilosa 这个开源项目。Pilosa 是一个使用 go 实现的分布式位图索引,可以显著提升跨多个大型数据集的查询的速度。通过 Pilosa,gitbase 才得以在巨大的数据集中进行查询。

总结

我想用这一篇文章来对开源社区表达我衷心的感谢,让我们能够不负众望的在短时间内完成 gitbase 的开发。我们 source{d} 的每一位成员都是开源的拥护者,github.com/src-d 下的每一行代码都是见证。

你想使用 gitbase 吗?最简单快捷的方式是从 sourced.tech/engine 下载 source{d} 引擎,就可以通过单个命令运行 gitbase 了。

想要了解更多,可以听听我在 Go SF 大会上的演讲录音。

本文在 Medium 首发,并经许可在此发布。


via: https://opensource.com/article/18/11/gitbase

作者:Francesc Campoy 选题:lujun9972 译者:HankChow 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出