勉強用にかわいいリレーショナルデータベースを作ってみてます。
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