{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE CPP #-}
module Database.Beam.Query.CustomSQL
(
IsCustomExprFn(..)
, valueExpr_, agg_
, IsCustomSqlSyntax(..) ) where
import Database.Beam.Query.Internal
import Database.Beam.Backend.SQL
import Database.Beam.Backend.SQL.Builder
import Data.ByteString (ByteString)
import Data.ByteString.Builder (byteString, toLazyByteString)
import Data.ByteString.Lazy (toStrict)
import Data.Kind (Type)
import Data.String
import qualified Data.Text as T
class (Monoid (CustomSqlSyntax syntax), Semigroup (CustomSqlSyntax syntax), IsString (CustomSqlSyntax syntax)) =>
IsCustomSqlSyntax syntax where
data CustomSqlSyntax syntax :: Type
customExprSyntax :: CustomSqlSyntax syntax -> syntax
renderSyntax :: syntax -> CustomSqlSyntax syntax
instance IsCustomSqlSyntax SqlSyntaxBuilder where
newtype CustomSqlSyntax SqlSyntaxBuilder = SqlSyntaxBuilderCustom ByteString
deriving (String -> CustomSqlSyntax SqlSyntaxBuilder
forall a. (String -> a) -> IsString a
fromString :: String -> CustomSqlSyntax SqlSyntaxBuilder
$cfromString :: String -> CustomSqlSyntax SqlSyntaxBuilder
IsString, Semigroup (CustomSqlSyntax SqlSyntaxBuilder)
CustomSqlSyntax SqlSyntaxBuilder
[CustomSqlSyntax SqlSyntaxBuilder]
-> CustomSqlSyntax SqlSyntaxBuilder
CustomSqlSyntax SqlSyntaxBuilder
-> CustomSqlSyntax SqlSyntaxBuilder
-> CustomSqlSyntax SqlSyntaxBuilder
forall a.
Semigroup a -> a -> (a -> a -> a) -> ([a] -> a) -> Monoid a
mconcat :: [CustomSqlSyntax SqlSyntaxBuilder]
-> CustomSqlSyntax SqlSyntaxBuilder
$cmconcat :: [CustomSqlSyntax SqlSyntaxBuilder]
-> CustomSqlSyntax SqlSyntaxBuilder
mappend :: CustomSqlSyntax SqlSyntaxBuilder
-> CustomSqlSyntax SqlSyntaxBuilder
-> CustomSqlSyntax SqlSyntaxBuilder
$cmappend :: CustomSqlSyntax SqlSyntaxBuilder
-> CustomSqlSyntax SqlSyntaxBuilder
-> CustomSqlSyntax SqlSyntaxBuilder
mempty :: CustomSqlSyntax SqlSyntaxBuilder
$cmempty :: CustomSqlSyntax SqlSyntaxBuilder
Monoid, NonEmpty (CustomSqlSyntax SqlSyntaxBuilder)
-> CustomSqlSyntax SqlSyntaxBuilder
CustomSqlSyntax SqlSyntaxBuilder
-> CustomSqlSyntax SqlSyntaxBuilder
-> CustomSqlSyntax SqlSyntaxBuilder
forall b.
Integral b =>
b
-> CustomSqlSyntax SqlSyntaxBuilder
-> CustomSqlSyntax SqlSyntaxBuilder
forall a.
(a -> a -> a)
-> (NonEmpty a -> a)
-> (forall b. Integral b => b -> a -> a)
-> Semigroup a
stimes :: forall b.
Integral b =>
b
-> CustomSqlSyntax SqlSyntaxBuilder
-> CustomSqlSyntax SqlSyntaxBuilder
$cstimes :: forall b.
Integral b =>
b
-> CustomSqlSyntax SqlSyntaxBuilder
-> CustomSqlSyntax SqlSyntaxBuilder
sconcat :: NonEmpty (CustomSqlSyntax SqlSyntaxBuilder)
-> CustomSqlSyntax SqlSyntaxBuilder
$csconcat :: NonEmpty (CustomSqlSyntax SqlSyntaxBuilder)
-> CustomSqlSyntax SqlSyntaxBuilder
<> :: CustomSqlSyntax SqlSyntaxBuilder
-> CustomSqlSyntax SqlSyntaxBuilder
-> CustomSqlSyntax SqlSyntaxBuilder
$c<> :: CustomSqlSyntax SqlSyntaxBuilder
-> CustomSqlSyntax SqlSyntaxBuilder
-> CustomSqlSyntax SqlSyntaxBuilder
Semigroup)
customExprSyntax :: CustomSqlSyntax SqlSyntaxBuilder -> SqlSyntaxBuilder
customExprSyntax (SqlSyntaxBuilderCustom ByteString
bs) = Builder -> SqlSyntaxBuilder
SqlSyntaxBuilder (ByteString -> Builder
byteString ByteString
bs)
renderSyntax :: SqlSyntaxBuilder -> CustomSqlSyntax SqlSyntaxBuilder
renderSyntax = ByteString -> CustomSqlSyntax SqlSyntaxBuilder
SqlSyntaxBuilderCustom forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ByteString
toStrict forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> ByteString
toLazyByteString forall b c a. (b -> c) -> (a -> b) -> a -> c
. SqlSyntaxBuilder -> Builder
buildSql
newtype CustomSqlSnippet be = CustomSqlSnippet (T.Text -> CustomSqlSyntax (BeamSqlBackendExpressionSyntax be))
instance IsCustomSqlSyntax (BeamSqlBackendExpressionSyntax be) => Semigroup (CustomSqlSnippet be) where
CustomSqlSnippet Text -> CustomSqlSyntax (BeamSqlBackendExpressionSyntax be)
a <> :: CustomSqlSnippet be -> CustomSqlSnippet be -> CustomSqlSnippet be
<> CustomSqlSnippet Text -> CustomSqlSyntax (BeamSqlBackendExpressionSyntax be)
b =
forall be.
(Text -> CustomSqlSyntax (BeamSqlBackendExpressionSyntax be))
-> CustomSqlSnippet be
CustomSqlSnippet forall a b. (a -> b) -> a -> b
$ \Text
pfx -> Text -> CustomSqlSyntax (BeamSqlBackendExpressionSyntax be)
a Text
pfx forall a. Semigroup a => a -> a -> a
<> Text -> CustomSqlSyntax (BeamSqlBackendExpressionSyntax be)
b Text
pfx
instance IsCustomSqlSyntax (BeamSqlBackendExpressionSyntax be) => Monoid (CustomSqlSnippet be) where
mempty :: CustomSqlSnippet be
mempty = forall be.
(Text -> CustomSqlSyntax (BeamSqlBackendExpressionSyntax be))
-> CustomSqlSnippet be
CustomSqlSnippet (forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a. Monoid a => a
mempty)
mappend :: CustomSqlSnippet be -> CustomSqlSnippet be -> CustomSqlSnippet be
mappend = forall a. Semigroup a => a -> a -> a
(<>)
instance IsCustomSqlSyntax (BeamSqlBackendExpressionSyntax be) => IsString (CustomSqlSnippet be) where
fromString :: String -> CustomSqlSnippet be
fromString String
s = forall be.
(Text -> CustomSqlSyntax (BeamSqlBackendExpressionSyntax be))
-> CustomSqlSnippet be
CustomSqlSnippet forall a b. (a -> b) -> a -> b
$ \Text
_ -> forall a. IsString a => String -> a
fromString String
s
class IsCustomExprFn fn res | res -> fn where
customExpr_ :: fn -> res
type BeamSqlBackendHasCustomSyntax be = IsCustomSqlSyntax (BeamSqlBackendExpressionSyntax be)
instance BeamSqlBackendHasCustomSyntax be => IsCustomExprFn (CustomSqlSnippet be) (QGenExpr ctxt be s res) where
customExpr_ :: CustomSqlSnippet be -> QGenExpr ctxt be s res
customExpr_ (CustomSqlSnippet Text -> CustomSqlSyntax (BeamSqlBackendExpressionSyntax be)
mkSyntax) = forall context be s t.
(Text -> BeamSqlBackendExpressionSyntax be)
-> QGenExpr context be s t
QExpr (forall syntax.
IsCustomSqlSyntax syntax =>
CustomSqlSyntax syntax -> syntax
customExprSyntax forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> CustomSqlSyntax (BeamSqlBackendExpressionSyntax be)
mkSyntax)
instance (IsCustomExprFn a res, BeamSqlBackendHasCustomSyntax be) =>
IsCustomExprFn (CustomSqlSnippet be -> a) (QGenExpr ctxt be s r -> res) where
customExpr_ :: (CustomSqlSnippet be -> a) -> QGenExpr ctxt be s r -> res
customExpr_ CustomSqlSnippet be -> a
fn (QExpr Text -> BeamSqlBackendExpressionSyntax be
e) = forall fn res. IsCustomExprFn fn res => fn -> res
customExpr_ forall a b. (a -> b) -> a -> b
$ CustomSqlSnippet be -> a
fn (forall be.
(Text -> CustomSqlSyntax (BeamSqlBackendExpressionSyntax be))
-> CustomSqlSnippet be
CustomSqlSnippet (forall syntax.
IsCustomSqlSyntax syntax =>
syntax -> CustomSqlSyntax syntax
renderSyntax forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> BeamSqlBackendExpressionSyntax be
e))
valueExpr_ :: QExpr be s a -> QExpr be s a
valueExpr_ :: forall be s a. QExpr be s a -> QExpr be s a
valueExpr_ = forall a. a -> a
id
agg_ :: QAgg be s a -> QAgg be s a
agg_ :: forall be s a. QAgg be s a -> QAgg be s a
agg_ = forall a. a -> a
id