次のモデルがあるとします。
Person
stackOverflowUser Bool
age Int Maybe
Esqueleto (および Yesod) を使用して、Stack Overflow ユーザーの平均年齢を取得したいとします。型シグネチャを持つ関数を作成したい:
userAge :: Handler (Maybe Int)
これまでのところ、私は次のものを持っています:
userAge :: Handler [Value (Maybe Int)]
userAge = runDB $
select $
from $ \person -> do
where_ (person ^. PersonStackOverflowUser ==. val True)
return joinV $ avg_ (person ^. PersonAge)
[Value (Maybe Int)] になりますが、「Maybe Int」に戻る必要があります。やってみた
mapM_ unValue userAge
しかし、何らかの理由で、そうすると型エラーが発生し、[Maybe Int] ではなく [Maybe ()] が返されました... さらに、上記のコードの最後の行には次のようにすべきだと思います。
person ?. PersonAge
それよりも
person ^. PersonAge
PersonAge は NULL になる可能性があるため、変更すると型エラーが発生します。
avg_ :: (PersistField a, PersistField b) => expr (Value a) -> expr (Value (Maybe b))
(^.) :: (PersistEntity val, PersistField typ) => expr (Entity val) -> EntityField val typ -> expr (Value typ)
(?.) :: (PersistEntity val, PersistField typ) => expr (Maybe (Entity val)) -> EntityField val typ -> expr (Value (Maybe typ))
これはおそらく私が思っているよりも簡単ですが、Esqueleto で集計関数を使用するための例をオンラインで見つけることができません。
生のSQLでもいいと思いますが、できればEsqueletoでやってみたいです。