module Orville.PostgreSQL.Execution.SelectOptions
( SelectOptions
, emptySelectOptions
, appendSelectOptions
, selectDistinct
, selectWhereClause
, selectOrderByClause
, selectGroupByClause
, selectLimitExpr
, selectOffsetExpr
, distinct
, where_
, orderBy
, limit
, offset
, groupBy
, selectOptionsQueryExpr
)
where
import Data.Monoid (First (First, getFirst))
import qualified Orville.PostgreSQL.Expr as Expr
data SelectOptions = SelectOptions
{ SelectOptions -> First Bool
i_distinct :: First Bool
, SelectOptions -> Maybe BooleanExpr
i_whereCondition :: Maybe Expr.BooleanExpr
, SelectOptions -> Maybe OrderByExpr
i_orderBy :: Maybe Expr.OrderByExpr
, SelectOptions -> First LimitExpr
i_limitExpr :: First Expr.LimitExpr
, SelectOptions -> First OffsetExpr
i_offsetExpr :: First Expr.OffsetExpr
, SelectOptions -> Maybe GroupByExpr
i_groupByExpr :: Maybe Expr.GroupByExpr
}
instance Semigroup SelectOptions where
<> :: SelectOptions -> SelectOptions -> SelectOptions
(<>) = SelectOptions -> SelectOptions -> SelectOptions
appendSelectOptions
instance Monoid SelectOptions where
mempty :: SelectOptions
mempty = SelectOptions
emptySelectOptions
emptySelectOptions :: SelectOptions
emptySelectOptions :: SelectOptions
emptySelectOptions =
SelectOptions
{ i_distinct :: First Bool
i_distinct = First Bool
forall a. Monoid a => a
mempty
, i_whereCondition :: Maybe BooleanExpr
i_whereCondition = Maybe BooleanExpr
forall a. Maybe a
Nothing
, i_orderBy :: Maybe OrderByExpr
i_orderBy = Maybe OrderByExpr
forall a. Monoid a => a
mempty
, i_limitExpr :: First LimitExpr
i_limitExpr = First LimitExpr
forall a. Monoid a => a
mempty
, i_offsetExpr :: First OffsetExpr
i_offsetExpr = First OffsetExpr
forall a. Monoid a => a
mempty
, i_groupByExpr :: Maybe GroupByExpr
i_groupByExpr = Maybe GroupByExpr
forall a. Monoid a => a
mempty
}
appendSelectOptions :: SelectOptions -> SelectOptions -> SelectOptions
appendSelectOptions :: SelectOptions -> SelectOptions -> SelectOptions
appendSelectOptions SelectOptions
left SelectOptions
right =
First Bool
-> Maybe BooleanExpr
-> Maybe OrderByExpr
-> First LimitExpr
-> First OffsetExpr
-> Maybe GroupByExpr
-> SelectOptions
SelectOptions
(SelectOptions -> First Bool
i_distinct SelectOptions
left First Bool -> First Bool -> First Bool
forall a. Semigroup a => a -> a -> a
<> SelectOptions -> First Bool
i_distinct SelectOptions
right)
((BooleanExpr -> BooleanExpr -> BooleanExpr)
-> Maybe BooleanExpr -> Maybe BooleanExpr -> Maybe BooleanExpr
forall a. (a -> a -> a) -> Maybe a -> Maybe a -> Maybe a
unionMaybeWith BooleanExpr -> BooleanExpr -> BooleanExpr
Expr.andExpr (SelectOptions -> Maybe BooleanExpr
i_whereCondition SelectOptions
left) (SelectOptions -> Maybe BooleanExpr
i_whereCondition SelectOptions
right))
(SelectOptions -> Maybe OrderByExpr
i_orderBy SelectOptions
left Maybe OrderByExpr -> Maybe OrderByExpr -> Maybe OrderByExpr
forall a. Semigroup a => a -> a -> a
<> SelectOptions -> Maybe OrderByExpr
i_orderBy SelectOptions
right)
(SelectOptions -> First LimitExpr
i_limitExpr SelectOptions
left First LimitExpr -> First LimitExpr -> First LimitExpr
forall a. Semigroup a => a -> a -> a
<> SelectOptions -> First LimitExpr
i_limitExpr SelectOptions
right)
(SelectOptions -> First OffsetExpr
i_offsetExpr SelectOptions
left First OffsetExpr -> First OffsetExpr -> First OffsetExpr
forall a. Semigroup a => a -> a -> a
<> SelectOptions -> First OffsetExpr
i_offsetExpr SelectOptions
right)
(SelectOptions -> Maybe GroupByExpr
i_groupByExpr SelectOptions
left Maybe GroupByExpr -> Maybe GroupByExpr -> Maybe GroupByExpr
forall a. Semigroup a => a -> a -> a
<> SelectOptions -> Maybe GroupByExpr
i_groupByExpr SelectOptions
right)
unionMaybeWith :: (a -> a -> a) -> Maybe a -> Maybe a -> Maybe a
unionMaybeWith :: forall a. (a -> a -> a) -> Maybe a -> Maybe a -> Maybe a
unionMaybeWith a -> a -> a
f Maybe a
mbLeft Maybe a
mbRight =
case (Maybe a
mbLeft, Maybe a
mbRight) of
(Maybe a
Nothing, Maybe a
Nothing) -> Maybe a
forall a. Maybe a
Nothing
(Just a
left, Maybe a
Nothing) -> a -> Maybe a
forall a. a -> Maybe a
Just a
left
(Maybe a
Nothing, Just a
right) -> a -> Maybe a
forall a. a -> Maybe a
Just a
right
(Just a
left, Just a
right) -> a -> Maybe a
forall a. a -> Maybe a
Just (a -> a -> a
f a
left a
right)
selectDistinct :: SelectOptions -> Expr.SelectClause
selectDistinct :: SelectOptions -> SelectClause
selectDistinct SelectOptions
selectOptions =
case SelectOptions -> First Bool
i_distinct SelectOptions
selectOptions of
First (Just Bool
True) -> SelectExpr -> SelectClause
Expr.selectClause (SelectExpr -> SelectClause)
-> (Maybe Distinct -> SelectExpr) -> Maybe Distinct -> SelectClause
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Maybe Distinct -> SelectExpr
Expr.selectExpr (Maybe Distinct -> SelectClause) -> Maybe Distinct -> SelectClause
forall a b. (a -> b) -> a -> b
$ Distinct -> Maybe Distinct
forall a. a -> Maybe a
Just Distinct
Expr.Distinct
First Bool
_ -> SelectExpr -> SelectClause
Expr.selectClause (SelectExpr -> SelectClause) -> SelectExpr -> SelectClause
forall a b. (a -> b) -> a -> b
$ Maybe Distinct -> SelectExpr
Expr.selectExpr Maybe Distinct
forall a. Maybe a
Nothing
selectWhereClause :: SelectOptions -> Maybe Expr.WhereClause
selectWhereClause :: SelectOptions -> Maybe WhereClause
selectWhereClause =
(BooleanExpr -> WhereClause)
-> Maybe BooleanExpr -> Maybe WhereClause
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap BooleanExpr -> WhereClause
Expr.whereClause (Maybe BooleanExpr -> Maybe WhereClause)
-> (SelectOptions -> Maybe BooleanExpr)
-> SelectOptions
-> Maybe WhereClause
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SelectOptions -> Maybe BooleanExpr
i_whereCondition
distinct :: SelectOptions
distinct :: SelectOptions
distinct =
SelectOptions
emptySelectOptions
{ i_distinct :: First Bool
i_distinct = Maybe Bool -> First Bool
forall a. Maybe a -> First a
First (Maybe Bool -> First Bool) -> Maybe Bool -> First Bool
forall a b. (a -> b) -> a -> b
$ Bool -> Maybe Bool
forall a. a -> Maybe a
Just Bool
True
}
selectOrderByClause :: SelectOptions -> Maybe Expr.OrderByClause
selectOrderByClause :: SelectOptions -> Maybe OrderByClause
selectOrderByClause =
(OrderByExpr -> OrderByClause)
-> Maybe OrderByExpr -> Maybe OrderByClause
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap OrderByExpr -> OrderByClause
Expr.orderByClause (Maybe OrderByExpr -> Maybe OrderByClause)
-> (SelectOptions -> Maybe OrderByExpr)
-> SelectOptions
-> Maybe OrderByClause
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SelectOptions -> Maybe OrderByExpr
i_orderBy
selectGroupByClause :: SelectOptions -> Maybe Expr.GroupByClause
selectGroupByClause :: SelectOptions -> Maybe GroupByClause
selectGroupByClause =
(GroupByExpr -> GroupByClause)
-> Maybe GroupByExpr -> Maybe GroupByClause
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap GroupByExpr -> GroupByClause
Expr.groupByClause (Maybe GroupByExpr -> Maybe GroupByClause)
-> (SelectOptions -> Maybe GroupByExpr)
-> SelectOptions
-> Maybe GroupByClause
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SelectOptions -> Maybe GroupByExpr
i_groupByExpr
selectLimitExpr :: SelectOptions -> Maybe Expr.LimitExpr
selectLimitExpr :: SelectOptions -> Maybe LimitExpr
selectLimitExpr =
First LimitExpr -> Maybe LimitExpr
forall a. First a -> Maybe a
getFirst (First LimitExpr -> Maybe LimitExpr)
-> (SelectOptions -> First LimitExpr)
-> SelectOptions
-> Maybe LimitExpr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SelectOptions -> First LimitExpr
i_limitExpr
selectOffsetExpr :: SelectOptions -> Maybe Expr.OffsetExpr
selectOffsetExpr :: SelectOptions -> Maybe OffsetExpr
selectOffsetExpr =
First OffsetExpr -> Maybe OffsetExpr
forall a. First a -> Maybe a
getFirst (First OffsetExpr -> Maybe OffsetExpr)
-> (SelectOptions -> First OffsetExpr)
-> SelectOptions
-> Maybe OffsetExpr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SelectOptions -> First OffsetExpr
i_offsetExpr
where_ :: Expr.BooleanExpr -> SelectOptions
where_ :: BooleanExpr -> SelectOptions
where_ BooleanExpr
condition =
SelectOptions
emptySelectOptions
{ i_whereCondition :: Maybe BooleanExpr
i_whereCondition = BooleanExpr -> Maybe BooleanExpr
forall a. a -> Maybe a
Just BooleanExpr
condition
}
orderBy :: Expr.OrderByExpr -> SelectOptions
orderBy :: OrderByExpr -> SelectOptions
orderBy OrderByExpr
order =
SelectOptions
emptySelectOptions
{ i_orderBy :: Maybe OrderByExpr
i_orderBy = OrderByExpr -> Maybe OrderByExpr
forall a. a -> Maybe a
Just OrderByExpr
order
}
limit :: Int -> SelectOptions
limit :: Int -> SelectOptions
limit Int
limitValue =
SelectOptions
emptySelectOptions
{ i_limitExpr :: First LimitExpr
i_limitExpr = Maybe LimitExpr -> First LimitExpr
forall a. Maybe a -> First a
First (Maybe LimitExpr -> First LimitExpr)
-> (Int -> Maybe LimitExpr) -> Int -> First LimitExpr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LimitExpr -> Maybe LimitExpr
forall a. a -> Maybe a
Just (LimitExpr -> Maybe LimitExpr)
-> (Int -> LimitExpr) -> Int -> Maybe LimitExpr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> LimitExpr
Expr.limitExpr (Int -> First LimitExpr) -> Int -> First LimitExpr
forall a b. (a -> b) -> a -> b
$ Int
limitValue
}
offset :: Int -> SelectOptions
offset :: Int -> SelectOptions
offset Int
offsetValue =
SelectOptions
emptySelectOptions
{ i_offsetExpr :: First OffsetExpr
i_offsetExpr = Maybe OffsetExpr -> First OffsetExpr
forall a. Maybe a -> First a
First (Maybe OffsetExpr -> First OffsetExpr)
-> (Int -> Maybe OffsetExpr) -> Int -> First OffsetExpr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. OffsetExpr -> Maybe OffsetExpr
forall a. a -> Maybe a
Just (OffsetExpr -> Maybe OffsetExpr)
-> (Int -> OffsetExpr) -> Int -> Maybe OffsetExpr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> OffsetExpr
Expr.offsetExpr (Int -> First OffsetExpr) -> Int -> First OffsetExpr
forall a b. (a -> b) -> a -> b
$ Int
offsetValue
}
groupBy :: Expr.GroupByExpr -> SelectOptions
groupBy :: GroupByExpr -> SelectOptions
groupBy GroupByExpr
groupByExpr =
SelectOptions
emptySelectOptions
{ i_groupByExpr :: Maybe GroupByExpr
i_groupByExpr = GroupByExpr -> Maybe GroupByExpr
forall a. a -> Maybe a
Just GroupByExpr
groupByExpr
}
selectOptionsQueryExpr ::
Expr.SelectList ->
Expr.TableReferenceList ->
SelectOptions ->
Expr.QueryExpr
selectOptionsQueryExpr :: SelectList -> TableReferenceList -> SelectOptions -> QueryExpr
selectOptionsQueryExpr SelectList
selectList TableReferenceList
tableReferenceList SelectOptions
selectOptions =
SelectClause -> SelectList -> Maybe TableExpr -> QueryExpr
Expr.queryExpr
(SelectOptions -> SelectClause
selectDistinct SelectOptions
selectOptions)
SelectList
selectList
( TableExpr -> Maybe TableExpr
forall a. a -> Maybe a
Just (TableExpr -> Maybe TableExpr) -> TableExpr -> Maybe TableExpr
forall a b. (a -> b) -> a -> b
$
TableReferenceList
-> Maybe WhereClause
-> Maybe GroupByClause
-> Maybe OrderByClause
-> Maybe LimitExpr
-> Maybe OffsetExpr
-> TableExpr
Expr.tableExpr
TableReferenceList
tableReferenceList
(SelectOptions -> Maybe WhereClause
selectWhereClause SelectOptions
selectOptions)
(SelectOptions -> Maybe GroupByClause
selectGroupByClause SelectOptions
selectOptions)
(SelectOptions -> Maybe OrderByClause
selectOrderByClause SelectOptions
selectOptions)
(SelectOptions -> Maybe LimitExpr
selectLimitExpr SelectOptions
selectOptions)
(SelectOptions -> Maybe OffsetExpr
selectOffsetExpr SelectOptions
selectOptions)
)