module Experimenter.Parameter.Query
    ( queryParamSettings
    ) where

import           Control.Monad.Reader
import           Database.Esqueleto
import           Prelude              hiding (exp)

import           Experimenter.Models


queryParamSettings :: (MonadIO m) => Key Exp -> ReaderT SqlBackend m [(Entity Exp, Entity ParamSetting)]
queryParamSettings :: Key Exp -> ReaderT SqlBackend m [(Entity Exp, Entity ParamSetting)]
queryParamSettings Key Exp
kExp =
  SqlQuery (SqlExpr (Entity Exp), SqlExpr (Entity ParamSetting))
-> SqlReadT m [(Entity Exp, Entity ParamSetting)]
forall a r (m :: * -> *).
(SqlSelect a r, MonadIO m) =>
SqlQuery a -> SqlReadT m [r]
select (SqlQuery (SqlExpr (Entity Exp), SqlExpr (Entity ParamSetting))
 -> SqlReadT m [(Entity Exp, Entity ParamSetting)])
-> SqlQuery (SqlExpr (Entity Exp), SqlExpr (Entity ParamSetting))
-> SqlReadT m [(Entity Exp, Entity ParamSetting)]
forall a b. (a -> b) -> a -> b
$
  ((SqlExpr (Entity Exp), SqlExpr (Entity ParamSetting))
 -> SqlQuery (SqlExpr (Entity Exp), SqlExpr (Entity ParamSetting)))
-> SqlQuery (SqlExpr (Entity Exp), SqlExpr (Entity ParamSetting))
forall a b. From a => (a -> SqlQuery b) -> SqlQuery b
from (((SqlExpr (Entity Exp), SqlExpr (Entity ParamSetting))
  -> SqlQuery (SqlExpr (Entity Exp), SqlExpr (Entity ParamSetting)))
 -> SqlQuery (SqlExpr (Entity Exp), SqlExpr (Entity ParamSetting)))
-> ((SqlExpr (Entity Exp), SqlExpr (Entity ParamSetting))
    -> SqlQuery (SqlExpr (Entity Exp), SqlExpr (Entity ParamSetting)))
-> SqlQuery (SqlExpr (Entity Exp), SqlExpr (Entity ParamSetting))
forall a b. (a -> b) -> a -> b
$ \(SqlExpr (Entity Exp)
exp, SqlExpr (Entity ParamSetting)
paramSet) -> do
    SqlExpr (Value Bool) -> SqlQuery ()
where_ (SqlExpr (Entity Exp)
exp SqlExpr (Entity Exp)
-> EntityField Exp (Key Exp) -> SqlExpr (Value (Key Exp))
forall typ val.
(PersistEntity val, PersistField typ) =>
SqlExpr (Entity val) -> EntityField val typ -> SqlExpr (Value typ)
^. EntityField Exp (Key Exp)
forall typ. (typ ~ Key Exp) => EntityField Exp typ
ExpId SqlExpr (Value (Key Exp))
-> SqlExpr (Value (Key Exp)) -> SqlExpr (Value Bool)
forall typ.
PersistField typ =>
SqlExpr (Value typ) -> SqlExpr (Value typ) -> SqlExpr (Value Bool)
==. SqlExpr (Entity ParamSetting)
paramSet SqlExpr (Entity ParamSetting)
-> EntityField ParamSetting (Key Exp) -> SqlExpr (Value (Key Exp))
forall typ val.
(PersistEntity val, PersistField typ) =>
SqlExpr (Entity val) -> EntityField val typ -> SqlExpr (Value typ)
^. EntityField ParamSetting (Key Exp)
forall typ. (typ ~ Key Exp) => EntityField ParamSetting typ
ParamSettingExp)
    SqlExpr (Value Bool) -> SqlQuery ()
where_ (SqlExpr (Entity Exp)
exp SqlExpr (Entity Exp)
-> EntityField Exp (Key Exp) -> SqlExpr (Value (Key Exp))
forall typ val.
(PersistEntity val, PersistField typ) =>
SqlExpr (Entity val) -> EntityField val typ -> SqlExpr (Value typ)
^. EntityField Exp (Key Exp)
forall typ. (typ ~ Key Exp) => EntityField Exp typ
ExpId SqlExpr (Value (Key Exp))
-> SqlExpr (Value (Key Exp)) -> SqlExpr (Value Bool)
forall typ.
PersistField typ =>
SqlExpr (Value typ) -> SqlExpr (Value typ) -> SqlExpr (Value Bool)
==. Key Exp -> SqlExpr (Value (Key Exp))
forall typ. PersistField typ => typ -> SqlExpr (Value typ)
val Key Exp
kExp)
    [SqlExpr OrderBy] -> SqlQuery ()
orderBy [SqlExpr (Value Int) -> SqlExpr OrderBy
forall a. PersistField a => SqlExpr (Value a) -> SqlExpr OrderBy
asc (SqlExpr (Entity Exp)
exp SqlExpr (Entity Exp) -> EntityField Exp Int -> SqlExpr (Value Int)
forall typ val.
(PersistEntity val, PersistField typ) =>
SqlExpr (Entity val) -> EntityField val typ -> SqlExpr (Value typ)
^. EntityField Exp Int
forall typ. (typ ~ Int) => EntityField Exp typ
ExpNumber)]
    (SqlExpr (Entity Exp), SqlExpr (Entity ParamSetting))
-> SqlQuery (SqlExpr (Entity Exp), SqlExpr (Entity ParamSetting))
forall (m :: * -> *) a. Monad m => a -> m a
return (SqlExpr (Entity Exp)
exp, SqlExpr (Entity ParamSetting)
paramSet)