packages feed

opaleye-0.7.2.0: src/Opaleye/Exists.hs

module Opaleye.Exists (exists) where

import           Opaleye.Field (Field)
import           Opaleye.Internal.Column (Column (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