{-# LANGUAGE BangPatterns, TypeFamilies, DataKinds, PolyKinds, TypeApplications, ScopedTypeVariables, ConstraintKinds, TypeOperators, GADTs, UndecidableInstances, StandaloneDeriving, FunctionalDependencies, FlexibleContexts, InstanceSigs, AllowAmbiguousTypes, DeriveAnyClass #-}
module IHP.QueryBuilder.Union
( queryUnion
, queryUnionList
, queryOr
) where
import IHP.Prelude
import IHP.ModelSupport
import IHP.QueryBuilder.Types
import IHP.QueryBuilder.Compiler (query)
import qualified Hasql.DynamicStatements.Snippet as Snippet
queryUnion :: (HasQueryBuilder queryBuilderProvider joinRegister, HasQueryBuilder r joinRegister') => queryBuilderProvider model -> r model -> NoJoinQueryBuilderWrapper model
queryUnion :: forall {k} {k} (queryBuilderProvider :: Symbol -> *)
(joinRegister :: k) (r :: Symbol -> *) (joinRegister' :: k)
(model :: Symbol).
(HasQueryBuilder queryBuilderProvider joinRegister,
HasQueryBuilder r joinRegister') =>
queryBuilderProvider model
-> r model -> NoJoinQueryBuilderWrapper model
queryUnion queryBuilderProvider model
firstQueryBuilderProvider r model
secondQueryBuilderProvider = QueryBuilder model -> NoJoinQueryBuilderWrapper model
forall (table :: Symbol).
QueryBuilder table -> NoJoinQueryBuilderWrapper table
NoJoinQueryBuilderWrapper (UnionQueryBuilder { QueryBuilder model
firstQueryBuilder :: QueryBuilder model
firstQueryBuilder :: QueryBuilder model
firstQueryBuilder, QueryBuilder model
secondQueryBuilder :: QueryBuilder model
secondQueryBuilder :: QueryBuilder model
secondQueryBuilder })
where
firstQueryBuilder :: QueryBuilder model
firstQueryBuilder = queryBuilderProvider model -> QueryBuilder model
forall {k} (queryBuilderProvider :: Symbol -> *)
(joinRegister :: k) (table :: Symbol).
HasQueryBuilder queryBuilderProvider joinRegister =>
queryBuilderProvider table -> QueryBuilder table
forall (table :: Symbol).
queryBuilderProvider table -> QueryBuilder table
getQueryBuilder queryBuilderProvider model
firstQueryBuilderProvider
secondQueryBuilder :: QueryBuilder model
secondQueryBuilder = r model -> QueryBuilder model
forall {k} (queryBuilderProvider :: Symbol -> *)
(joinRegister :: k) (table :: Symbol).
HasQueryBuilder queryBuilderProvider joinRegister =>
queryBuilderProvider table -> QueryBuilder table
forall (table :: Symbol). r table -> QueryBuilder table
getQueryBuilder r model
secondQueryBuilderProvider
{-# INLINE queryUnion #-}
queryUnionList :: forall table. (Table (GetModelByTableName table), KnownSymbol table, GetTableName (GetModelByTableName table) ~ table) => [QueryBuilder table] -> QueryBuilder table
queryUnionList :: forall (table :: Symbol).
(Table (GetModelByTableName table), KnownSymbol table,
GetTableName (GetModelByTableName table) ~ table) =>
[QueryBuilder table] -> QueryBuilder table
queryUnionList [] = FilterByQueryBuilder { queryBuilder :: QueryBuilder table
queryBuilder = forall model (table :: Symbol).
(table ~ GetTableName model, Table model, DefaultScope table) =>
QueryBuilder table
query @(GetModelByTableName table) @table, queryFilter :: (Text, FilterOperator, Snippet)
queryFilter = (Text
"id", FilterOperator
NotEqOp, Text -> Snippet
Snippet.sql Text
"id"), applyLeft :: Maybe Text
applyLeft = Maybe Text
forall a. Maybe a
Nothing, applyRight :: Maybe Text
applyRight = Maybe Text
forall a. Maybe a
Nothing }
queryUnionList (QueryBuilder table
firstQueryBuilder:QueryBuilder table
secondQueryBuilder:[]) = UnionQueryBuilder { QueryBuilder table
firstQueryBuilder :: QueryBuilder table
firstQueryBuilder :: QueryBuilder table
firstQueryBuilder, QueryBuilder table
secondQueryBuilder :: QueryBuilder table
secondQueryBuilder :: QueryBuilder table
secondQueryBuilder }
queryUnionList (QueryBuilder table
firstQueryBuilder:[QueryBuilder table]
rest) = UnionQueryBuilder { QueryBuilder table
firstQueryBuilder :: QueryBuilder table
firstQueryBuilder :: QueryBuilder table
firstQueryBuilder, secondQueryBuilder :: QueryBuilder table
secondQueryBuilder = forall (table :: Symbol).
(Table (GetModelByTableName table), KnownSymbol table,
GetTableName (GetModelByTableName table) ~ table) =>
[QueryBuilder table] -> QueryBuilder table
queryUnionList @table [QueryBuilder table]
rest }
queryOr :: (HasQueryBuilder queryBuilderProvider joinRegister, HasQueryBuilder queryBuilderProvider'' joinRegister'', HasQueryBuilder queryBuilderProvider''' joinRegister''') => (queryBuilderProvider model -> queryBuilderProvider''' model) -> (queryBuilderProvider model -> queryBuilderProvider'' model) -> queryBuilderProvider model -> queryBuilderProvider model
queryOr :: forall {k} {k} {k} (queryBuilderProvider :: Symbol -> *)
(joinRegister :: k) (queryBuilderProvider'' :: Symbol -> *)
(joinRegister'' :: k) (queryBuilderProvider''' :: Symbol -> *)
(joinRegister''' :: k) (model :: Symbol).
(HasQueryBuilder queryBuilderProvider joinRegister,
HasQueryBuilder queryBuilderProvider'' joinRegister'',
HasQueryBuilder queryBuilderProvider''' joinRegister''') =>
(queryBuilderProvider model -> queryBuilderProvider''' model)
-> (queryBuilderProvider model -> queryBuilderProvider'' model)
-> queryBuilderProvider model
-> queryBuilderProvider model
queryOr queryBuilderProvider model -> queryBuilderProvider''' model
firstQuery queryBuilderProvider model -> queryBuilderProvider'' model
secondQuery queryBuilderProvider model
queryBuilder = QueryBuilder model -> queryBuilderProvider model
forall {k} (queryBuilderProvider :: Symbol -> *)
(joinRegister :: k) (table :: Symbol).
HasQueryBuilder queryBuilderProvider joinRegister =>
QueryBuilder table -> queryBuilderProvider table
forall (table :: Symbol).
QueryBuilder table -> queryBuilderProvider table
injectQueryBuilder
(UnionQueryBuilder {
firstQueryBuilder :: QueryBuilder model
firstQueryBuilder = queryBuilderProvider''' model -> QueryBuilder model
forall {k} (queryBuilderProvider :: Symbol -> *)
(joinRegister :: k) (table :: Symbol).
HasQueryBuilder queryBuilderProvider joinRegister =>
queryBuilderProvider table -> QueryBuilder table
forall (table :: Symbol).
queryBuilderProvider''' table -> QueryBuilder table
getQueryBuilder (queryBuilderProvider''' model -> QueryBuilder model)
-> queryBuilderProvider''' model -> QueryBuilder model
forall a b. (a -> b) -> a -> b
$ queryBuilderProvider model -> queryBuilderProvider''' model
firstQuery queryBuilderProvider model
queryBuilder,
secondQueryBuilder :: QueryBuilder model
secondQueryBuilder = queryBuilderProvider'' model -> QueryBuilder model
forall {k} (queryBuilderProvider :: Symbol -> *)
(joinRegister :: k) (table :: Symbol).
HasQueryBuilder queryBuilderProvider joinRegister =>
queryBuilderProvider table -> QueryBuilder table
forall (table :: Symbol).
queryBuilderProvider'' table -> QueryBuilder table
getQueryBuilder (queryBuilderProvider'' model -> QueryBuilder model)
-> queryBuilderProvider'' model -> QueryBuilder model
forall a b. (a -> b) -> a -> b
$ queryBuilderProvider model -> queryBuilderProvider'' model
secondQuery queryBuilderProvider model
queryBuilder}
)
{-# INLINE queryOr #-}