module Opaleye.Exists (exists) where import Opaleye.Field (Field) import Opaleye.Internal.Column (Field_(Column)) import Opaleye.Internal.QueryArr (runSimpleQueryArr, productQueryArr) import Opaleye.Internal.PackMap (run, extractAttr) import Opaleye.Internal.PrimQuery (PrimQuery' (Exists)) import Opaleye.Internal.Tag (next) import Opaleye.Select (Select) import Opaleye.SqlTypes (SqlBool) -- | True if any rows are returned by the given query, false otherwise. -- -- This operation is equivalent to Postgres's @EXISTS@ operator. exists :: Select a -> Select (Field SqlBool) exists q = productQueryArr (f . runSimpleQueryArr q) where f (_, query, tag) = (Column result, Exists binding query, tag') where (result, [(binding, ())]) = run (extractAttr "exists" tag ()) tag' = next tag