activerecord-originator
にベンチマークスクリプトを追加した。
これを追加したことによって、どの程度パフォーマンスが劣化しているかが分かった。単純に#to_sql
を呼び出す場合で3倍ぐらい、実際にselectクエリを発行する場合でも2倍ぐらいの速度差が出ていた。クエリを発行しているのはメモリ上のsqliteだし、レコードも100件しか作っていないからあまり現実的な比較ではない。
activerecord-originator
の速度改善をした。今まではすべてのNodeを拡張してinitialize
時にcaller
を保存していたのだけど、これをクエリに位置情報を差し込みたいNodeだけ拡張するようにした。
これによって、#to_sql
は71~78%程度、クエリの実行は84~86%程度の速度劣化に抑えられた。
これだけ速度劣化が小さく出ていれば、実アプリケーションに入れたときの速度差は気にならないぐらいになっていそう(たぶん)。単純なクエリ実行の例だと、1回あたり0.02ミリ秒しかオーバーヘッドが乗ってない計算になりそう。
この変更を入れたのでv0.2.0をリリースした
そういえばIS NULL
とかを考えていなかったな、と思ってテストを書いてみたら、特に何もせず通って便利だった。
すでに実装は済んでいたけど、テストがあったほうが後々嬉しくなる可能性がありそうなのでテストだけ追加した。
where("title LIKE ?", "%#{title}%")
みたいなやつの対応を考えていたのだけど、むずそう。
これはSqlLiteral
nodeとして扱われるのだけど、このNodeが特殊で、どうやら作られるタイミングは#where
が呼ばれるタイミングではなく#to_sql
が呼ばれるタイミングっぽい。それだとこのnodeのinitializeにhookしてもほしい位置情報が取れなくて困る。
いい解決方法あるかなあ。あんまり思いつかない。where
メソッドを上書きして…とかやればできるだろうけどやりたくないよねえ