{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Orville.PostgreSQL.Expr.Index
( CreateIndexExpr
, createIndexExpr
, IndexUniqueness (UniqueIndex, NonUniqueIndex)
, IndexBodyExpr
, indexBodyColumns
, ConcurrentlyExpr
, concurrently
, DropIndexExpr
, dropIndexExpr
, createNamedIndexExpr
)
where
import Data.List.NonEmpty (NonEmpty)
import Orville.PostgreSQL.Expr.Name (ColumnName, IndexName, Qualified, TableName)
import qualified Orville.PostgreSQL.Raw.RawSql as RawSql
newtype CreateIndexExpr
= CreateIndexExpr RawSql.RawSql
deriving
(
RawSql -> CreateIndexExpr
CreateIndexExpr -> RawSql
(CreateIndexExpr -> RawSql)
-> (RawSql -> CreateIndexExpr) -> SqlExpression CreateIndexExpr
forall a. (a -> RawSql) -> (RawSql -> a) -> SqlExpression a
$ctoRawSql :: CreateIndexExpr -> RawSql
toRawSql :: CreateIndexExpr -> RawSql
$cunsafeFromRawSql :: RawSql -> CreateIndexExpr
unsafeFromRawSql :: RawSql -> CreateIndexExpr
RawSql.SqlExpression
)
createIndexExpr ::
IndexUniqueness ->
Maybe ConcurrentlyExpr ->
Qualified TableName ->
NonEmpty ColumnName ->
CreateIndexExpr
createIndexExpr :: IndexUniqueness
-> Maybe ConcurrentlyExpr
-> Qualified TableName
-> NonEmpty ColumnName
-> CreateIndexExpr
createIndexExpr IndexUniqueness
uniqueness Maybe ConcurrentlyExpr
mbConcurrently Qualified TableName
tableName NonEmpty ColumnName
columns =
RawSql -> CreateIndexExpr
CreateIndexExpr (RawSql -> CreateIndexExpr) -> RawSql -> CreateIndexExpr
forall a b. (a -> b) -> a -> b
$
String -> RawSql
RawSql.fromString String
"CREATE "
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> IndexUniqueness -> RawSql
uniquenessToSql IndexUniqueness
uniqueness
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> String -> RawSql
RawSql.fromString String
"INDEX "
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> RawSql -> (RawSql -> RawSql) -> Maybe RawSql -> RawSql
forall b a. b -> (a -> b) -> Maybe a -> b
maybe RawSql
forall a. Monoid a => a
mempty (RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> RawSql
RawSql.space) ((ConcurrentlyExpr -> RawSql)
-> Maybe ConcurrentlyExpr -> Maybe RawSql
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ConcurrentlyExpr -> RawSql
forall a. SqlExpression a => a -> RawSql
RawSql.toRawSql Maybe ConcurrentlyExpr
mbConcurrently)
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> String -> RawSql
RawSql.fromString String
"ON "
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> Qualified TableName -> RawSql
forall a. SqlExpression a => a -> RawSql
RawSql.toRawSql Qualified TableName
tableName
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> RawSql
RawSql.space
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> IndexBodyExpr -> RawSql
forall a. SqlExpression a => a -> RawSql
RawSql.toRawSql (NonEmpty ColumnName -> IndexBodyExpr
indexBodyColumns NonEmpty ColumnName
columns)
createNamedIndexExpr ::
IndexUniqueness ->
Maybe ConcurrentlyExpr ->
Qualified TableName ->
IndexName ->
IndexBodyExpr ->
CreateIndexExpr
createNamedIndexExpr :: IndexUniqueness
-> Maybe ConcurrentlyExpr
-> Qualified TableName
-> IndexName
-> IndexBodyExpr
-> CreateIndexExpr
createNamedIndexExpr IndexUniqueness
uniqueness Maybe ConcurrentlyExpr
mbConcurrently Qualified TableName
tableName IndexName
indexName IndexBodyExpr
bodyExpr =
RawSql -> CreateIndexExpr
CreateIndexExpr (RawSql -> CreateIndexExpr) -> RawSql -> CreateIndexExpr
forall a b. (a -> b) -> a -> b
$
String -> RawSql
RawSql.fromString String
"CREATE "
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> IndexUniqueness -> RawSql
uniquenessToSql IndexUniqueness
uniqueness
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> String -> RawSql
RawSql.fromString String
"INDEX "
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> RawSql -> (RawSql -> RawSql) -> Maybe RawSql -> RawSql
forall b a. b -> (a -> b) -> Maybe a -> b
maybe RawSql
forall a. Monoid a => a
mempty (RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> RawSql
RawSql.space) ((ConcurrentlyExpr -> RawSql)
-> Maybe ConcurrentlyExpr -> Maybe RawSql
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ConcurrentlyExpr -> RawSql
forall a. SqlExpression a => a -> RawSql
RawSql.toRawSql Maybe ConcurrentlyExpr
mbConcurrently)
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> IndexName -> RawSql
forall a. SqlExpression a => a -> RawSql
RawSql.toRawSql IndexName
indexName
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> String -> RawSql
RawSql.fromString String
" ON "
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> Qualified TableName -> RawSql
forall a. SqlExpression a => a -> RawSql
RawSql.toRawSql Qualified TableName
tableName
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> RawSql
RawSql.space
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> IndexBodyExpr -> RawSql
forall a. SqlExpression a => a -> RawSql
RawSql.toRawSql IndexBodyExpr
bodyExpr
newtype ConcurrentlyExpr
= ConcurrentlyExpr RawSql.RawSql
deriving
(
RawSql -> ConcurrentlyExpr
ConcurrentlyExpr -> RawSql
(ConcurrentlyExpr -> RawSql)
-> (RawSql -> ConcurrentlyExpr) -> SqlExpression ConcurrentlyExpr
forall a. (a -> RawSql) -> (RawSql -> a) -> SqlExpression a
$ctoRawSql :: ConcurrentlyExpr -> RawSql
toRawSql :: ConcurrentlyExpr -> RawSql
$cunsafeFromRawSql :: RawSql -> ConcurrentlyExpr
unsafeFromRawSql :: RawSql -> ConcurrentlyExpr
RawSql.SqlExpression
)
concurrently :: ConcurrentlyExpr
concurrently :: ConcurrentlyExpr
concurrently =
String -> ConcurrentlyExpr
forall a. SqlExpression a => String -> a
RawSql.unsafeSqlExpression String
"CONCURRENTLY"
newtype IndexBodyExpr
= IndexBodyExpr RawSql.RawSql
deriving
(
RawSql -> IndexBodyExpr
IndexBodyExpr -> RawSql
(IndexBodyExpr -> RawSql)
-> (RawSql -> IndexBodyExpr) -> SqlExpression IndexBodyExpr
forall a. (a -> RawSql) -> (RawSql -> a) -> SqlExpression a
$ctoRawSql :: IndexBodyExpr -> RawSql
toRawSql :: IndexBodyExpr -> RawSql
$cunsafeFromRawSql :: RawSql -> IndexBodyExpr
unsafeFromRawSql :: RawSql -> IndexBodyExpr
RawSql.SqlExpression
)
indexBodyColumns ::
NonEmpty ColumnName ->
IndexBodyExpr
indexBodyColumns :: NonEmpty ColumnName -> IndexBodyExpr
indexBodyColumns NonEmpty ColumnName
columns =
RawSql -> IndexBodyExpr
IndexBodyExpr (RawSql -> IndexBodyExpr) -> RawSql -> IndexBodyExpr
forall a b. (a -> b) -> a -> b
$
RawSql
RawSql.leftParen
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> RawSql -> NonEmpty ColumnName -> RawSql
forall sql (f :: * -> *).
(SqlExpression sql, Foldable f) =>
RawSql -> f sql -> RawSql
RawSql.intercalate RawSql
RawSql.comma NonEmpty ColumnName
columns
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> RawSql
RawSql.rightParen
data IndexUniqueness
= UniqueIndex
| NonUniqueIndex
deriving
(
IndexUniqueness -> IndexUniqueness -> Bool
(IndexUniqueness -> IndexUniqueness -> Bool)
-> (IndexUniqueness -> IndexUniqueness -> Bool)
-> Eq IndexUniqueness
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: IndexUniqueness -> IndexUniqueness -> Bool
== :: IndexUniqueness -> IndexUniqueness -> Bool
$c/= :: IndexUniqueness -> IndexUniqueness -> Bool
/= :: IndexUniqueness -> IndexUniqueness -> Bool
Eq
,
Eq IndexUniqueness
Eq IndexUniqueness
-> (IndexUniqueness -> IndexUniqueness -> Ordering)
-> (IndexUniqueness -> IndexUniqueness -> Bool)
-> (IndexUniqueness -> IndexUniqueness -> Bool)
-> (IndexUniqueness -> IndexUniqueness -> Bool)
-> (IndexUniqueness -> IndexUniqueness -> Bool)
-> (IndexUniqueness -> IndexUniqueness -> IndexUniqueness)
-> (IndexUniqueness -> IndexUniqueness -> IndexUniqueness)
-> Ord IndexUniqueness
IndexUniqueness -> IndexUniqueness -> Bool
IndexUniqueness -> IndexUniqueness -> Ordering
IndexUniqueness -> IndexUniqueness -> IndexUniqueness
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: IndexUniqueness -> IndexUniqueness -> Ordering
compare :: IndexUniqueness -> IndexUniqueness -> Ordering
$c< :: IndexUniqueness -> IndexUniqueness -> Bool
< :: IndexUniqueness -> IndexUniqueness -> Bool
$c<= :: IndexUniqueness -> IndexUniqueness -> Bool
<= :: IndexUniqueness -> IndexUniqueness -> Bool
$c> :: IndexUniqueness -> IndexUniqueness -> Bool
> :: IndexUniqueness -> IndexUniqueness -> Bool
$c>= :: IndexUniqueness -> IndexUniqueness -> Bool
>= :: IndexUniqueness -> IndexUniqueness -> Bool
$cmax :: IndexUniqueness -> IndexUniqueness -> IndexUniqueness
max :: IndexUniqueness -> IndexUniqueness -> IndexUniqueness
$cmin :: IndexUniqueness -> IndexUniqueness -> IndexUniqueness
min :: IndexUniqueness -> IndexUniqueness -> IndexUniqueness
Ord
,
Int -> IndexUniqueness -> ShowS
[IndexUniqueness] -> ShowS
IndexUniqueness -> String
(Int -> IndexUniqueness -> ShowS)
-> (IndexUniqueness -> String)
-> ([IndexUniqueness] -> ShowS)
-> Show IndexUniqueness
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> IndexUniqueness -> ShowS
showsPrec :: Int -> IndexUniqueness -> ShowS
$cshow :: IndexUniqueness -> String
show :: IndexUniqueness -> String
$cshowList :: [IndexUniqueness] -> ShowS
showList :: [IndexUniqueness] -> ShowS
Show
)
uniquenessToSql :: IndexUniqueness -> RawSql.RawSql
uniquenessToSql :: IndexUniqueness -> RawSql
uniquenessToSql IndexUniqueness
uniqueness =
case IndexUniqueness
uniqueness of
IndexUniqueness
UniqueIndex -> String -> RawSql
RawSql.fromString String
"UNIQUE "
IndexUniqueness
NonUniqueIndex -> RawSql
forall a. Monoid a => a
mempty
newtype DropIndexExpr
= DropIndexExpr RawSql.RawSql
deriving
(
RawSql -> DropIndexExpr
DropIndexExpr -> RawSql
(DropIndexExpr -> RawSql)
-> (RawSql -> DropIndexExpr) -> SqlExpression DropIndexExpr
forall a. (a -> RawSql) -> (RawSql -> a) -> SqlExpression a
$ctoRawSql :: DropIndexExpr -> RawSql
toRawSql :: DropIndexExpr -> RawSql
$cunsafeFromRawSql :: RawSql -> DropIndexExpr
unsafeFromRawSql :: RawSql -> DropIndexExpr
RawSql.SqlExpression
)
dropIndexExpr :: IndexName -> DropIndexExpr
dropIndexExpr :: IndexName -> DropIndexExpr
dropIndexExpr IndexName
indexName =
RawSql -> DropIndexExpr
DropIndexExpr (RawSql -> DropIndexExpr) -> RawSql -> DropIndexExpr
forall a b. (a -> b) -> a -> b
$
String -> RawSql
RawSql.fromString String
"DROP INDEX " RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> IndexName -> RawSql
forall a. SqlExpression a => a -> RawSql
RawSql.toRawSql IndexName
indexName