naoki86star

インターネットの片隅でなにかしら書いてみる

custom function for VoltDB

今時点のVoltDBにはcreate functionとかがなくて、ちょっとした変換は、存在するSQL Functionを組み合わせる必要があります。*1
自分らの都合だけでいうとinet_ntoaみたいなのが欲しい、と思う瞬間があったりします。アプリケーションとしてはVoltDBの思想からいくとProcedureで書けばたいていはよい結果が得られますし、sqlcmdのようなアドリブ的には

cast(BIT_SHIFT_RIGHT(BITAND(c,4278190080),24) as varchar) || '.' || BIT_SHIFT_RIGHT(BITAND(c,16711680),16) || ',' || BIT_SHIFT_RIGHT(BITAND(c,65280),8) || '.' || BITAND(c,255)

とか書けばいいのでしょうが、時間たってくるとこれがイヤ(というか手間にもほどがある)になってきてしまいました。それで改善案のひとつとしてsqlcmdでprocedureを登録してからcallを実行、とか考えたわけです。ある程度はスクリプト側で変換すればいいや、と。*2

でもそれもイヤになってきてしまい、まずは自分で追加できる?みたいなことを考えてみることにしました*3

https://github.com/VoltDB/voltdb/wiki/Implementing-sql-functionsを読んでみると

  • C++のコアの部分まで手を入れてね、といっている(関数実体はC++の部分)

そうすると開発・検証用でしか、なかなか使いにくい、ということになります。でも、それでも使い勝手あがりそうです。

sqlcmdのところで関数定義して折り返すのはない?ととりあえず思ってみたけど、上記方法を試している過程でどうもorg.voltdb.utils.SQLCommandではVoltDBプロセスにコマンドライン丸ごと送っているようなので*4、その方法をするのはorg.voltdb.utils.SQLCommandにパースをいれるところから、になってしまいそうです。

とりあえずinet_ntoaぽいcustom functionの追加を試すのはできました。本質的新規追加関数のテストコード書くのは複雑だぞって説明にもあってregression-testコードの追加ができてません。確かに作った関数の呼び出しテストレベルはUnitTestでなくてもすぐにできましたがC++のコアの本質的なテストはどこまですればいいかみたいなのがわかりません*5*6


師匠の薦めにより、この修正をpull requestしました。gitを操作するのこのリンク*7を頼りにしました。

*1:あるいは脳内変換ですませるか

*2:procedureを簡易でなくjavaクラスで書くほうの手法に対し、それをスクリプト化する実現方法を考える、という選択もある

*3:VoltDBもまたOpenSourceであったりする

*4:@AdhocというPorcedureとして扱われているみたい

*5:というかやり方はundocumentだよって書かれちゃってるし

*6:率直今回の場合多機能への干渉がないのでそんなに不安はない

*7:Github で Fork してから Pull Request をするまでの流れ | けーこ in サンフランシスコ