k4200’s notes and thoughts

Programmer side of k4200

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 とかを使う
  • わからないことはソースを読むとだいたい解決する。