かわいいリレーショナルデータベースでサブクエリ的なものを実装

勉強用にかわいいリレーショナルデータベースを作ってみてます。
http://d.hatena.ne.jp/nowokay/20120817#1345197962


こいつにインデックスを実装してみようかなーと思ったんですけど、そうするとちょっとソースコードを整理しないといけなくて、いろいろいじってたら、サブクエリー的なものが使えるようになりました。


こんな感じで、fromとleftJoinにクエリが使えます。

System.out.println(Query
        .from(Query.from("shohin").lessThan("price", 250))
        .leftJoin(Query.from("kubun").lessThan("kubun_id", 3), "kubun_id"));

こんな感じでそれっぽいものができました。

 |shohin.shohin_id|shohin.shohin_name|shohin.kubun_id|shohin.price|kubun.kubun_id|kubun.kubun_name|
 |2|みかん|1|130|1|くだもの|
 |3|キャベツ|2|200|2|野菜|
 |4|さんま|3|220|null|null|
 |6|しいたけ|4|180|null|null|


プログラム的には、いままでQueryがTableやRelationの外からクエリー操作を行っていたものを、全部Relationに載せてしまって、テーブル自体にクエリー操作を行うようにしてます。


あと、一致比較もできるようにしました。equalsToを追加してます。

System.out.println(Query //一致比較
        .from("shohin")
        .leftJoin("kubun", "kubun_id")
        .equalsTo("shohin_id", 2)
        .select("shohin_id", "shohin_name", "kubun_name", "price"));

そうすると、対応する値が抽出できます。

 |shohin_id|shohin_name|kubun_name|price|
 |2|みかん|くだもの|130|

なんか、まるでリレーショナルデータベースみたいになってきましたね。


あと、leftJoinでの結合でも、equalsToを使うようにしています。


ところで、equals toって英語的にどうなのかな?と思ったら、だいたい「is equal toのほうが自然だし間違ってるけど、equals toでもいいんじゃない?」くらいの感じでした。
http://answers.yahoo.com/question/index?qid=20080628060337AAJk2Wv


Javaではequalsというメソッド名が汎用に使えないので、苦肉の策で。


ソースはgistに。
https://gist.github.com/3380142/9ce3414d9758b399ee5cb781aaa11ae791203e47