{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Orville.PostgreSQL.Expr.WhereClause
( WhereClause
, whereClause
, BooleanExpr
, literalBooleanExpr
, andExpr
, (.&&)
, orExpr
, (.||)
, parenthesized
, equals
, notEquals
, greaterThan
, lessThan
, greaterThanOrEqualTo
, lessThanOrEqualTo
, like
, likeInsensitive
, isNull
, isNotNull
, valueIn
, valueNotIn
, tupleIn
, tupleNotIn
, InValuePredicate
, inPredicate
, notInPredicate
, inValueList
)
where
import qualified Data.List.NonEmpty as NE
import Orville.PostgreSQL.Expr.BinaryOperator (andOp, binaryOpExpression, equalsOp, greaterThanOp, greaterThanOrEqualsOp, iLikeOp, lessThanOp, lessThanOrEqualsOp, likeOp, notEqualsOp, orOp)
import Orville.PostgreSQL.Expr.ValueExpression (ValueExpression, rowValueConstructor)
import qualified Orville.PostgreSQL.Raw.RawSql as RawSql
newtype WhereClause
= WhereClause RawSql.RawSql
deriving (RawSql -> WhereClause
WhereClause -> RawSql
(WhereClause -> RawSql)
-> (RawSql -> WhereClause) -> SqlExpression WhereClause
forall a. (a -> RawSql) -> (RawSql -> a) -> SqlExpression a
$ctoRawSql :: WhereClause -> RawSql
toRawSql :: WhereClause -> RawSql
$cunsafeFromRawSql :: RawSql -> WhereClause
unsafeFromRawSql :: RawSql -> WhereClause
RawSql.SqlExpression)
whereClause :: BooleanExpr -> WhereClause
whereClause :: BooleanExpr -> WhereClause
whereClause BooleanExpr
booleanExpr =
RawSql -> WhereClause
WhereClause (RawSql -> WhereClause) -> RawSql -> WhereClause
forall a b. (a -> b) -> a -> b
$
String -> RawSql
RawSql.fromString String
"WHERE " RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> BooleanExpr -> RawSql
forall a. SqlExpression a => a -> RawSql
RawSql.toRawSql BooleanExpr
booleanExpr
newtype BooleanExpr
= BooleanExpr RawSql.RawSql
deriving (RawSql -> BooleanExpr
BooleanExpr -> RawSql
(BooleanExpr -> RawSql)
-> (RawSql -> BooleanExpr) -> SqlExpression BooleanExpr
forall a. (a -> RawSql) -> (RawSql -> a) -> SqlExpression a
$ctoRawSql :: BooleanExpr -> RawSql
toRawSql :: BooleanExpr -> RawSql
$cunsafeFromRawSql :: RawSql -> BooleanExpr
unsafeFromRawSql :: RawSql -> BooleanExpr
RawSql.SqlExpression)
literalBooleanExpr :: Bool -> BooleanExpr
literalBooleanExpr :: Bool -> BooleanExpr
literalBooleanExpr Bool
bool =
RawSql -> BooleanExpr
BooleanExpr (RawSql -> BooleanExpr)
-> (String -> RawSql) -> String -> BooleanExpr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> RawSql
RawSql.fromString (String -> BooleanExpr) -> String -> BooleanExpr
forall a b. (a -> b) -> a -> b
$
case Bool
bool of
Bool
False -> String
"FALSE"
Bool
True -> String
"TRUE"
booleanValueExpression :: BooleanExpr -> ValueExpression
booleanValueExpression :: BooleanExpr -> ValueExpression
booleanValueExpression (BooleanExpr RawSql
rawSql) =
RawSql -> ValueExpression
forall a. SqlExpression a => RawSql -> a
RawSql.unsafeFromRawSql RawSql
rawSql
orExpr :: BooleanExpr -> BooleanExpr -> BooleanExpr
orExpr :: BooleanExpr -> BooleanExpr -> BooleanExpr
orExpr BooleanExpr
left BooleanExpr
right =
BinaryOperator -> ValueExpression -> ValueExpression -> BooleanExpr
forall sql.
SqlExpression sql =>
BinaryOperator -> ValueExpression -> ValueExpression -> sql
binaryOpExpression
BinaryOperator
orOp
(BooleanExpr -> ValueExpression
booleanValueExpression BooleanExpr
left)
(BooleanExpr -> ValueExpression
booleanValueExpression BooleanExpr
right)
(.||) :: BooleanExpr -> BooleanExpr -> BooleanExpr
.|| :: BooleanExpr -> BooleanExpr -> BooleanExpr
(.||) = BooleanExpr -> BooleanExpr -> BooleanExpr
orExpr
infixr 8 .||
andExpr :: BooleanExpr -> BooleanExpr -> BooleanExpr
andExpr :: BooleanExpr -> BooleanExpr -> BooleanExpr
andExpr BooleanExpr
left BooleanExpr
right =
BinaryOperator -> ValueExpression -> ValueExpression -> BooleanExpr
forall sql.
SqlExpression sql =>
BinaryOperator -> ValueExpression -> ValueExpression -> sql
binaryOpExpression
BinaryOperator
andOp
(BooleanExpr -> ValueExpression
booleanValueExpression BooleanExpr
left)
(BooleanExpr -> ValueExpression
booleanValueExpression BooleanExpr
right)
(.&&) :: BooleanExpr -> BooleanExpr -> BooleanExpr
.&& :: BooleanExpr -> BooleanExpr -> BooleanExpr
(.&&) = BooleanExpr -> BooleanExpr -> BooleanExpr
andExpr
infixr 8 .&&
valueIn :: ValueExpression -> NE.NonEmpty ValueExpression -> BooleanExpr
valueIn :: ValueExpression -> NonEmpty ValueExpression -> BooleanExpr
valueIn ValueExpression
needle NonEmpty ValueExpression
haystack =
ValueExpression -> InValuePredicate -> BooleanExpr
inPredicate ValueExpression
needle (NonEmpty ValueExpression -> InValuePredicate
inValueList NonEmpty ValueExpression
haystack)
valueNotIn :: ValueExpression -> NE.NonEmpty ValueExpression -> BooleanExpr
valueNotIn :: ValueExpression -> NonEmpty ValueExpression -> BooleanExpr
valueNotIn ValueExpression
needle NonEmpty ValueExpression
haystack =
ValueExpression -> InValuePredicate -> BooleanExpr
notInPredicate ValueExpression
needle (NonEmpty ValueExpression -> InValuePredicate
inValueList NonEmpty ValueExpression
haystack)
tupleIn :: NE.NonEmpty ValueExpression -> NE.NonEmpty (NE.NonEmpty ValueExpression) -> BooleanExpr
tupleIn :: NonEmpty ValueExpression
-> NonEmpty (NonEmpty ValueExpression) -> BooleanExpr
tupleIn NonEmpty ValueExpression
needle NonEmpty (NonEmpty ValueExpression)
haystack =
ValueExpression -> InValuePredicate -> BooleanExpr
inPredicate
(NonEmpty ValueExpression -> ValueExpression
rowValueConstructor NonEmpty ValueExpression
needle)
(NonEmpty ValueExpression -> InValuePredicate
inValueList ((NonEmpty ValueExpression -> ValueExpression)
-> NonEmpty (NonEmpty ValueExpression) -> NonEmpty ValueExpression
forall a b. (a -> b) -> NonEmpty a -> NonEmpty b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap NonEmpty ValueExpression -> ValueExpression
rowValueConstructor NonEmpty (NonEmpty ValueExpression)
haystack))
tupleNotIn :: NE.NonEmpty ValueExpression -> NE.NonEmpty (NE.NonEmpty ValueExpression) -> BooleanExpr
tupleNotIn :: NonEmpty ValueExpression
-> NonEmpty (NonEmpty ValueExpression) -> BooleanExpr
tupleNotIn NonEmpty ValueExpression
needle NonEmpty (NonEmpty ValueExpression)
haystack =
ValueExpression -> InValuePredicate -> BooleanExpr
notInPredicate
(NonEmpty ValueExpression -> ValueExpression
rowValueConstructor NonEmpty ValueExpression
needle)
(NonEmpty ValueExpression -> InValuePredicate
inValueList ((NonEmpty ValueExpression -> ValueExpression)
-> NonEmpty (NonEmpty ValueExpression) -> NonEmpty ValueExpression
forall a b. (a -> b) -> NonEmpty a -> NonEmpty b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap NonEmpty ValueExpression -> ValueExpression
rowValueConstructor NonEmpty (NonEmpty ValueExpression)
haystack))
inPredicate :: ValueExpression -> InValuePredicate -> BooleanExpr
inPredicate :: ValueExpression -> InValuePredicate -> BooleanExpr
inPredicate ValueExpression
predicand InValuePredicate
predicate =
RawSql -> BooleanExpr
BooleanExpr (RawSql -> BooleanExpr) -> RawSql -> BooleanExpr
forall a b. (a -> b) -> a -> b
$
ValueExpression -> RawSql
forall a. SqlExpression a => a -> RawSql
RawSql.parenthesized ValueExpression
predicand
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> String -> RawSql
RawSql.fromString String
" IN "
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> InValuePredicate -> RawSql
forall a. SqlExpression a => a -> RawSql
RawSql.toRawSql InValuePredicate
predicate
notInPredicate :: ValueExpression -> InValuePredicate -> BooleanExpr
notInPredicate :: ValueExpression -> InValuePredicate -> BooleanExpr
notInPredicate ValueExpression
predicand InValuePredicate
predicate =
RawSql -> BooleanExpr
BooleanExpr (RawSql -> BooleanExpr) -> RawSql -> BooleanExpr
forall a b. (a -> b) -> a -> b
$
ValueExpression -> RawSql
forall a. SqlExpression a => a -> RawSql
RawSql.parenthesized ValueExpression
predicand
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> String -> RawSql
RawSql.fromString String
" NOT IN "
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> InValuePredicate -> RawSql
forall a. SqlExpression a => a -> RawSql
RawSql.toRawSql InValuePredicate
predicate
newtype InValuePredicate
= InValuePredicate RawSql.RawSql
deriving (RawSql -> InValuePredicate
InValuePredicate -> RawSql
(InValuePredicate -> RawSql)
-> (RawSql -> InValuePredicate) -> SqlExpression InValuePredicate
forall a. (a -> RawSql) -> (RawSql -> a) -> SqlExpression a
$ctoRawSql :: InValuePredicate -> RawSql
toRawSql :: InValuePredicate -> RawSql
$cunsafeFromRawSql :: RawSql -> InValuePredicate
unsafeFromRawSql :: RawSql -> InValuePredicate
RawSql.SqlExpression)
inValueList :: NE.NonEmpty ValueExpression -> InValuePredicate
inValueList :: NonEmpty ValueExpression -> InValuePredicate
inValueList NonEmpty ValueExpression
values =
RawSql -> InValuePredicate
InValuePredicate (RawSql -> InValuePredicate) -> RawSql -> InValuePredicate
forall a b. (a -> b) -> a -> b
$
RawSql
RawSql.leftParen
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> RawSql -> NonEmpty ValueExpression -> RawSql
forall sql (f :: * -> *).
(SqlExpression sql, Foldable f) =>
RawSql -> f sql -> RawSql
RawSql.intercalate RawSql
RawSql.commaSpace NonEmpty ValueExpression
values
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> RawSql
RawSql.rightParen
parenthesized :: BooleanExpr -> BooleanExpr
parenthesized :: BooleanExpr -> BooleanExpr
parenthesized BooleanExpr
expr =
RawSql -> BooleanExpr
BooleanExpr (RawSql -> BooleanExpr) -> RawSql -> BooleanExpr
forall a b. (a -> b) -> a -> b
$
RawSql
RawSql.leftParen RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> BooleanExpr -> RawSql
forall a. SqlExpression a => a -> RawSql
RawSql.toRawSql BooleanExpr
expr RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> RawSql
RawSql.rightParen
equals :: ValueExpression -> ValueExpression -> BooleanExpr
equals :: ValueExpression -> ValueExpression -> BooleanExpr
equals =
BinaryOperator -> ValueExpression -> ValueExpression -> BooleanExpr
forall sql.
SqlExpression sql =>
BinaryOperator -> ValueExpression -> ValueExpression -> sql
binaryOpExpression BinaryOperator
equalsOp
notEquals :: ValueExpression -> ValueExpression -> BooleanExpr
notEquals :: ValueExpression -> ValueExpression -> BooleanExpr
notEquals =
BinaryOperator -> ValueExpression -> ValueExpression -> BooleanExpr
forall sql.
SqlExpression sql =>
BinaryOperator -> ValueExpression -> ValueExpression -> sql
binaryOpExpression BinaryOperator
notEqualsOp
greaterThan :: ValueExpression -> ValueExpression -> BooleanExpr
greaterThan :: ValueExpression -> ValueExpression -> BooleanExpr
greaterThan =
BinaryOperator -> ValueExpression -> ValueExpression -> BooleanExpr
forall sql.
SqlExpression sql =>
BinaryOperator -> ValueExpression -> ValueExpression -> sql
binaryOpExpression BinaryOperator
greaterThanOp
lessThan :: ValueExpression -> ValueExpression -> BooleanExpr
lessThan :: ValueExpression -> ValueExpression -> BooleanExpr
lessThan =
BinaryOperator -> ValueExpression -> ValueExpression -> BooleanExpr
forall sql.
SqlExpression sql =>
BinaryOperator -> ValueExpression -> ValueExpression -> sql
binaryOpExpression BinaryOperator
lessThanOp
greaterThanOrEqualTo :: ValueExpression -> ValueExpression -> BooleanExpr
greaterThanOrEqualTo :: ValueExpression -> ValueExpression -> BooleanExpr
greaterThanOrEqualTo =
BinaryOperator -> ValueExpression -> ValueExpression -> BooleanExpr
forall sql.
SqlExpression sql =>
BinaryOperator -> ValueExpression -> ValueExpression -> sql
binaryOpExpression BinaryOperator
greaterThanOrEqualsOp
lessThanOrEqualTo :: ValueExpression -> ValueExpression -> BooleanExpr
lessThanOrEqualTo :: ValueExpression -> ValueExpression -> BooleanExpr
lessThanOrEqualTo =
BinaryOperator -> ValueExpression -> ValueExpression -> BooleanExpr
forall sql.
SqlExpression sql =>
BinaryOperator -> ValueExpression -> ValueExpression -> sql
binaryOpExpression BinaryOperator
lessThanOrEqualsOp
like :: ValueExpression -> ValueExpression -> BooleanExpr
like :: ValueExpression -> ValueExpression -> BooleanExpr
like =
BinaryOperator -> ValueExpression -> ValueExpression -> BooleanExpr
forall sql.
SqlExpression sql =>
BinaryOperator -> ValueExpression -> ValueExpression -> sql
binaryOpExpression BinaryOperator
likeOp
likeInsensitive :: ValueExpression -> ValueExpression -> BooleanExpr
likeInsensitive :: ValueExpression -> ValueExpression -> BooleanExpr
likeInsensitive =
BinaryOperator -> ValueExpression -> ValueExpression -> BooleanExpr
forall sql.
SqlExpression sql =>
BinaryOperator -> ValueExpression -> ValueExpression -> sql
binaryOpExpression BinaryOperator
iLikeOp
isNull :: ValueExpression -> BooleanExpr
isNull :: ValueExpression -> BooleanExpr
isNull ValueExpression
value =
RawSql -> BooleanExpr
BooleanExpr (RawSql -> BooleanExpr) -> RawSql -> BooleanExpr
forall a b. (a -> b) -> a -> b
$
ValueExpression -> RawSql
forall a. SqlExpression a => a -> RawSql
RawSql.toRawSql ValueExpression
value
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> RawSql
RawSql.space
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> String -> RawSql
RawSql.fromString String
"IS NULL"
isNotNull :: ValueExpression -> BooleanExpr
isNotNull :: ValueExpression -> BooleanExpr
isNotNull ValueExpression
value =
RawSql -> BooleanExpr
BooleanExpr (RawSql -> BooleanExpr) -> RawSql -> BooleanExpr
forall a b. (a -> b) -> a -> b
$
ValueExpression -> RawSql
forall a. SqlExpression a => a -> RawSql
RawSql.toRawSql ValueExpression
value
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> RawSql
RawSql.space
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> String -> RawSql
RawSql.fromString String
"IS NOT NULL"