Linux中國

gitbase:用 SQL 查詢 Git 倉庫

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中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國