Scala と ODBMS の合わせ技が効率的すぎる


Scala からオブジェクトDBの db4Object を使う

オブジェクト指向データベース db4Object を試す 〜その1〜 - etc9の記事でも取り上げた db4Object を Scala から利用してみます。
db4o-8.0.184.15484-all-java5.jar をクラスパスに追加して Scala から使うだけです。

エンティテイ

として、Customer クラスを準備

trait Entity {
  import org.apache.commons.lang3.builder.ToStringBuilder;
  override def toString = ToStringBuilder.reflectionToString(this); 
}

class Customer(
    var id :Long,
    var name :String
) extends Entity {
}

単純な例なのでこれだけです。@BeanProperty とかもいりません。


サクッと使うのは

これだけです。組み込みモードで db4o 使っています。

object Main {

  def main(args: Array[String]): Unit = { 
    
    // setup embedded db
    import com.db4o.{ObjectContainer,Db4oEmbedded};
    var db:ObjectContainer = Db4oEmbedded.openFile(
        Db4oEmbedded.newConfiguration(), "databaseFile.db4o");

    // store two Customer
    db.store(new Customer(1, "Thom"));
    db.store(new Customer(2, "Ron"));
    
    // select stored Customer
    import scala.collection.JavaConversions._
    var customers = db.query(classOf[Customer])
    customers.foreach(println);

    db.close();
  }
}

Customer オブジェクト永続化してから取り出しているだけです。



出力結果はこんな感じになります。

etc9.Customer@1a42792[id=1,name=Thom]
etc9.Customer@113a53d[id=2,name=Ron]


モデルの検証コードとか、楽過ぎます。

条件指定して検索

id が 2 のオブジェクトを検索

db.queryByExample(new Customer(2,null)).foreach(println);

まあ、ここまでは普通です。

そして Predicate が最高

Java だと、条件指定にPredicateを使う以下のような不毛なコードが必要です。

List <Customer> customers = db.query(new Predicate<Customer>() {
    public boolean match(Customer c) {
      return c.getName().contains("o");
    }
  });


Scala だと、暗黙的型変換を定義しておけば、

import com.db4o.query._;
implicit def toPredicate[T](predicate: T => Boolean) =
  new Predicate[T]() {def `match`(entry: T): Boolean = {predicate(entry)}}


直感的なコードで書けます。

db.query{ c:Customer => c.name.contains("o") }.foreach(println);

最高です。ハイ。