diff --git a/src/Database/Esqueleto.hs b/src/Database/Esqueleto.hs index a5ab442..3599dd6 100644 --- a/src/Database/Esqueleto.hs +++ b/src/Database/Esqueleto.hs @@ -48,7 +48,7 @@ module Database.Esqueleto , min_, max_, sum_, avg_, castNum, castNumM , coalesce, coalesceDefault , lower_, like, ilike, (%), concat_, (++.) - , subList_select, subList_selectDistinct, valList + , subList_select, subList_selectDistinct, valList, justList , in_, notIn, exists, notExists , set, (=.), (+=.), (-=.), (*=.), (/=.) , case_ ) diff --git a/src/Database/Esqueleto/Internal/Language.hs b/src/Database/Esqueleto/Internal/Language.hs index 6a13397..4014bdf 100644 --- a/src/Database/Esqueleto/Internal/Language.hs +++ b/src/Database/Esqueleto/Internal/Language.hs @@ -427,6 +427,13 @@ class (Functor query, Applicative query, Monad query) => -- | Lift a list of constant value from Haskell-land to the query. valList :: PersistField typ => [typ] -> expr (ValueList typ) + -- | Same as 'just' but for 'ValueList'. Most of the time you + -- won't need it, though, because you can use 'just' from + -- inside 'subList_select' or 'Just' from inside 'valList'. + -- + -- /Since: 2.2.12/ + justList :: expr (ValueList typ) -> expr (ValueList (Maybe typ)) + -- | @IN@ operator. in_ :: PersistField typ => expr (Value typ) -> expr (ValueList typ) -> expr (Value Bool) diff --git a/src/Database/Esqueleto/Internal/Sql.hs b/src/Database/Esqueleto/Internal/Sql.hs index cd158dc..2fb8dcf 100644 --- a/src/Database/Esqueleto/Internal/Sql.hs +++ b/src/Database/Esqueleto/Internal/Sql.hs @@ -496,6 +496,9 @@ instance Esqueleto SqlQuery SqlExpr SqlBackend where valList vals = EList $ ERaw Parens $ const ( uncommas ("?" <$ vals) , map toPersistValue vals ) + justList EEmptyList = EEmptyList + justList (EList v) = EList (just v) + v `in_` e = ifNotEmptyList e False $ unsafeSqlBinOp " IN " v (veryUnsafeCoerceSqlExprValueList e) v `notIn` e = ifNotEmptyList e True $ unsafeSqlBinOp " NOT IN " v (veryUnsafeCoerceSqlExprValueList e)