JRuby から Datomic を使う

Clojure の作者 Rich Hickey が作ったデータベースサービス Datomic がおもしろそうなので、JRuby から使ってみました。

といっても、jar を JRuby で読んで debugger 起動してるだけですが。

Datomic って?

こちらの紹介記事が分かりやすいです。

大きな特徴は下記の 2 つ。

  • クエリの処理とキャッシュをクライアント側 (Peer) で行うことにより、スケールしやすい
  • データ (fact) を削除・更新しても過去のデータが残り、さらに任意の時点のデータベースにクエリを投げられる

かなり魅力的ですよね。

JRuby から使う

現在のところ Datomic のピアライブラリは JVM 用しかない (たぶんしばらくこのまま) ので、rubyist としては JRuby から使いたい。

ここでは Datomic Shell とほぼ同様の挙動を JRuby で実現します。

まず、JRuby の準備。rvm / rbenv 使ってるなら簡単。

rvm install jruby
rvm jruby
gem install ruby-debug

ピアライブラリのダウンロード、展開。

# datomic.com の "Get Datomic" から datomic-0.1.2753.zip をダウンロード
unzip datomic-0.1.2753cd datomic-0.1.2753

このディレクトリに下記の内容で datomic.rb をつくる。

require "java"

# datomic ピアライブラリの jar をクラスパスに追加
require "./datomic-0.1.2753.jar"

# 依存ライブラリの jar をクラスパスに追加
Dir.glob("./lib/*.jar") do |jar|
  require jar
end

require "rubygems"
require "ruby-debug"
Debugger.settings[:autoeval] = true

include_class "datomic.Entity"
include_class "datomic.Connection"
include_class "datomic.Database"
include_class "datomic.Peer"
include_class "datomic.TxReport"
include_class "datomic.Util"
include_class "java.io.FileReader"

# デフォルトでは inspect が <#...> みたいなそっけないものなので
# Java オブジェクトでは to_s (toString) を使う
Java::JavaLang::Object.class_eval do
  def inspect
    to_s
  end
end

debugger
puts "" # debugger 直後に終了しないように

あとは --debug オプションつきで起動する。

ruby --debug datomic.rb

これで、Getting StartedTutorial を試してみましょう。

実際に使うとなると、クエリや結果のクラスを拡張すると使いやすそうですね。