Squerylでカスタム集計関数(custom aggregate function)を作る
Squerylでsum, avgとか以外の集計関数を使いたい
集計関数とはavgとかsumみたいに、複数の値を受け取って1つの値を返す関数のこと。Squerylではここに載っているものがサポートされてる。
でも、今回は、medianを使いたい。中央値。中央値と平均値の違いがわからない方は検索してね。
環境は Squeryl 0.9.5-6 っす。
カスタム関数の作り方とは違うっぽい
集計関数ではなく、通常のカスタム関数の作り方であればこのページに載っている。例として出ているのはsha1関数。文字列を受け取って文字列を返す。
でも、これだとどうも上手く動かないっぽい。詳細は省略
結局、 UnaryAgregateFloatOp ってのを使った
困ったときはRTFS。avg関数の実装を見てみると以下のようになっていた。
def avg[A](e: NumericalExpression[A]) = new UnaryAgregateFloatOp[A](e, "avg")
これを真似て以下なようにしたらOKだった。
def median[A](e: NumericalExpression[A]) = new UnaryAgregateFloatOp[A](e, "median")
分かっちゃえば簡単なんだけどねー・・・
ちなみに、当然ながらRDBMS側でmedianという集計関数が無いとダメ。
まとめ
- Squerylで独自の(標準でサポートされていない)集計関数が必要な場合、UnaryAgregateFloatOp とかを使う
- わからないことはソースを読むとだいたい解決する。