{-# LANGUAGE BangPatterns, TypeFamilies, DataKinds, PolyKinds, TypeApplications, ScopedTypeVariables, ConstraintKinds, TypeOperators, GADTs, UndecidableInstances, StandaloneDeriving, FunctionalDependencies, FlexibleContexts, InstanceSigs, AllowAmbiguousTypes, DeriveAnyClass #-}
module IHP.QueryBuilder.Order
( orderBy
, orderByAsc
, orderByDesc
, limit
, offset
, distinct
, distinctOn
) where
import IHP.Prelude
import IHP.ModelSupport
import IHP.QueryBuilder.Types
import IHP.QueryBuilder.Compiler (qualifiedColumnName)
orderByAsc :: forall name model table value. (KnownSymbol table, KnownSymbol name, HasField name model value, model ~ GetModelByTableName table, Table model) => Proxy name -> QueryBuilder table -> QueryBuilder table
orderByAsc :: forall (name :: Symbol) model (table :: Symbol) value.
(KnownSymbol table, KnownSymbol name, HasField name model value,
model ~ GetModelByTableName table, Table model) =>
Proxy name -> QueryBuilder table -> QueryBuilder table
orderByAsc !Proxy name
name (QueryBuilder SQLQuery
sq) =
SQLQuery -> QueryBuilder table
forall (table :: Symbol). SQLQuery -> QueryBuilder table
QueryBuilder SQLQuery
sq { orderByClause = orderByClause sq <> [OrderByClause { orderByColumn = columnName, orderByDirection = Asc }] }
where
columnName :: Text
columnName = Text -> Text -> Text
qualifiedColumnName (forall record. Table record => Text
tableName @model) (forall (symbol :: Symbol). KnownSymbol symbol => Text
symbolToText @name)
{-# INLINE orderByAsc #-}
orderByDesc :: forall name model table value. (KnownSymbol table, KnownSymbol name, HasField name model value, model ~ GetModelByTableName table, Table model) => Proxy name -> QueryBuilder table -> QueryBuilder table
orderByDesc :: forall (name :: Symbol) model (table :: Symbol) value.
(KnownSymbol table, KnownSymbol name, HasField name model value,
model ~ GetModelByTableName table, Table model) =>
Proxy name -> QueryBuilder table -> QueryBuilder table
orderByDesc !Proxy name
name (QueryBuilder SQLQuery
sq) =
SQLQuery -> QueryBuilder table
forall (table :: Symbol). SQLQuery -> QueryBuilder table
QueryBuilder SQLQuery
sq { orderByClause = orderByClause sq <> [OrderByClause { orderByColumn = columnName, orderByDirection = Desc }] }
where
columnName :: Text
columnName = Text -> Text -> Text
qualifiedColumnName (forall record. Table record => Text
tableName @model) (forall (symbol :: Symbol). KnownSymbol symbol => Text
symbolToText @name)
{-# INLINE orderByDesc #-}
orderBy :: (KnownSymbol table, KnownSymbol name, HasField name model value, model ~ GetModelByTableName table, Table model) => Proxy name -> QueryBuilder table -> QueryBuilder table
orderBy :: forall (table :: Symbol) (name :: Symbol) model value.
(KnownSymbol table, KnownSymbol name, HasField name model value,
model ~ GetModelByTableName table, Table model) =>
Proxy name -> QueryBuilder table -> QueryBuilder table
orderBy !Proxy name
name = Proxy name -> QueryBuilder table -> QueryBuilder table
forall (name :: Symbol) model (table :: Symbol) value.
(KnownSymbol table, KnownSymbol name, HasField name model value,
model ~ GetModelByTableName table, Table model) =>
Proxy name -> QueryBuilder table -> QueryBuilder table
orderByAsc Proxy name
name
{-# INLINE orderBy #-}
limit :: Int -> QueryBuilder model -> QueryBuilder model
limit :: forall (model :: Symbol).
Int -> QueryBuilder model -> QueryBuilder model
limit !Int
queryLimit (QueryBuilder SQLQuery
sq) =
SQLQuery -> QueryBuilder model
forall (table :: Symbol). SQLQuery -> QueryBuilder table
QueryBuilder SQLQuery
sq { limitClause = Just queryLimit }
{-# INLINE limit #-}
offset :: Int -> QueryBuilder model -> QueryBuilder model
offset :: forall (model :: Symbol).
Int -> QueryBuilder model -> QueryBuilder model
offset !Int
queryOffset (QueryBuilder SQLQuery
sq) =
SQLQuery -> QueryBuilder model
forall (table :: Symbol). SQLQuery -> QueryBuilder table
QueryBuilder SQLQuery
sq { offsetClause = Just queryOffset }
{-# INLINE offset #-}
distinct :: QueryBuilder table -> QueryBuilder table
distinct :: forall (table :: Symbol). QueryBuilder table -> QueryBuilder table
distinct (QueryBuilder SQLQuery
sq) =
SQLQuery -> QueryBuilder table
forall (table :: Symbol). SQLQuery -> QueryBuilder table
QueryBuilder SQLQuery
sq { distinctClause = True }
{-# INLINE distinct #-}
distinctOn :: forall name model value table. (KnownSymbol table, KnownSymbol name, HasField name model value, model ~ GetModelByTableName table, Table model) => Proxy name -> QueryBuilder table -> QueryBuilder table
distinctOn :: forall (name :: Symbol) model value (table :: Symbol).
(KnownSymbol table, KnownSymbol name, HasField name model value,
model ~ GetModelByTableName table, Table model) =>
Proxy name -> QueryBuilder table -> QueryBuilder table
distinctOn !Proxy name
name (QueryBuilder SQLQuery
sq) =
SQLQuery -> QueryBuilder table
forall (table :: Symbol). SQLQuery -> QueryBuilder table
QueryBuilder SQLQuery
sq { distinctOnClause = Just columnName }
where
columnName :: Text
columnName = Text -> Text -> Text
qualifiedColumnName (forall record. Table record => Text
tableName @model) (forall (symbol :: Symbol). KnownSymbol symbol => Text
symbolToText @name)
{-# INLINE distinctOn #-}