{-# LANGUAGE BangPatterns, TypeFamilies, DataKinds, PolyKinds, TypeApplications, ScopedTypeVariables, ConstraintKinds, TypeOperators, GADTs, UndecidableInstances, StandaloneDeriving, FunctionalDependencies, FlexibleContexts, InstanceSigs, AllowAmbiguousTypes, DeriveAnyClass #-}
module IHP.QueryBuilder.Filter
( filterWhere
, filterWhereCaseInsensitive
, filterWhereNot
, filterWhereIn
, filterWhereInCaseInsensitive
, filterWhereIdIn
, filterWhereNotIn
, filterWhereLike
, filterWhereILike
, filterWhereMatches
, filterWhereIMatches
, filterWherePast
, filterWhereFuture
, filterWhereGreaterThan
, filterWhereLarger
, filterWhereGreaterThanOrEqualTo
, filterWhereAtLeast
, filterWhereLessThan
, filterWhereSmaller
, filterWhereLessThanOrEqualTo
, filterWhereAtMost
, filterWhereSql
) where
import IHP.Prelude
import IHP.ModelSupport
import IHP.QueryBuilder.Types
import IHP.QueryBuilder.Compiler (negateFilterOperator)
import qualified Hasql.Encoders as Encoders
import Hasql.Implicits.Encoders (DefaultParamEncoder(..))
import IHP.Hasql.Encoders ()
import IHP.QueryBuilder.Compiler (qualifiedColumnName)
import Data.Functor.Contravariant (contramap)
paramValue :: DefaultParamEncoder a => a -> ConditionValue
paramValue :: forall a. DefaultParamEncoder a => a -> ConditionValue
paramValue a
value = Params () -> ConditionValue
Param ((() -> a) -> Params a -> Params ()
forall a' a. (a' -> a) -> Params a -> Params a'
forall (f :: * -> *) a' a.
Contravariant f =>
(a' -> a) -> f a -> f a'
contramap (a -> () -> a
forall a b. a -> b -> a
const a
value) (NullableOrNot Value a -> Params a
forall a. NullableOrNot Value a -> Params a
Encoders.param NullableOrNot Value a
forall a. DefaultParamEncoder a => NullableOrNot Value a
defaultParam))
{-# INLINE paramValue #-}
condValueForOp :: DefaultParamEncoder a => FilterOperator -> a -> ConditionValue
condValueForOp :: forall a.
DefaultParamEncoder a =>
FilterOperator -> a -> ConditionValue
condValueForOp FilterOperator
IsOp a
_ = Text -> ConditionValue
Literal Text
"NULL"
condValueForOp FilterOperator
IsNotOp a
_ = Text -> ConditionValue
Literal Text
"NULL"
condValueForOp FilterOperator
_ a
value = a -> ConditionValue
forall a. DefaultParamEncoder a => a -> ConditionValue
paramValue a
value
{-# INLINE condValueForOp #-}
filterWhere :: forall name table model value. (KnownSymbol table, KnownSymbol name, DefaultParamEncoder value, HasField name model value, EqOrIsOperator value, model ~ GetModelByTableName table, Table model) => (Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhere :: forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol table, KnownSymbol name, DefaultParamEncoder value,
HasField name model value, EqOrIsOperator value,
model ~ GetModelByTableName table, Table model) =>
(Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhere (Proxy name
name, value
value) QueryBuilder table
queryBuilder = Condition -> QueryBuilder table -> QueryBuilder table
forall (table :: Symbol).
Condition -> QueryBuilder table -> QueryBuilder table
addCondition Condition
condition QueryBuilder table
queryBuilder
where
condition :: Condition
condition = let op :: FilterOperator
op = value -> FilterOperator
forall value. EqOrIsOperator value => value -> FilterOperator
toEqOrIsOperator value
value in Text
-> FilterOperator
-> ConditionValue
-> Maybe Text
-> Maybe Text
-> Condition
ColumnCondition Text
columnName FilterOperator
op (FilterOperator -> value -> ConditionValue
forall a.
DefaultParamEncoder a =>
FilterOperator -> a -> ConditionValue
condValueForOp FilterOperator
op value
value) Maybe Text
forall a. Maybe a
Nothing Maybe Text
forall a. Maybe a
Nothing
columnName :: Text
columnName = Text -> Text -> Text
qualifiedColumnName (forall record. Table record => Text
tableName @model) (forall (symbol :: Symbol). KnownSymbol symbol => Text
symbolToText @name)
{-# INLINE filterWhere #-}
filterWhereNot :: forall name table model value. (KnownSymbol table, KnownSymbol name, DefaultParamEncoder value, HasField name model value, EqOrIsOperator value, model ~ GetModelByTableName table, Table model) => (Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereNot :: forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol table, KnownSymbol name, DefaultParamEncoder value,
HasField name model value, EqOrIsOperator value,
model ~ GetModelByTableName table, Table model) =>
(Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereNot (Proxy name
name, value
value) QueryBuilder table
queryBuilder = Condition -> QueryBuilder table -> QueryBuilder table
forall (table :: Symbol).
Condition -> QueryBuilder table -> QueryBuilder table
addCondition Condition
condition QueryBuilder table
queryBuilder
where
condition :: Condition
condition = let op :: FilterOperator
op = FilterOperator -> FilterOperator
negateFilterOperator (value -> FilterOperator
forall value. EqOrIsOperator value => value -> FilterOperator
toEqOrIsOperator value
value) in Text
-> FilterOperator
-> ConditionValue
-> Maybe Text
-> Maybe Text
-> Condition
ColumnCondition Text
columnName FilterOperator
op (FilterOperator -> value -> ConditionValue
forall a.
DefaultParamEncoder a =>
FilterOperator -> a -> ConditionValue
condValueForOp FilterOperator
op value
value) Maybe Text
forall a. Maybe a
Nothing Maybe Text
forall a. Maybe a
Nothing
columnName :: Text
columnName = Text -> Text -> Text
qualifiedColumnName (forall record. Table record => Text
tableName @model) (forall (symbol :: Symbol). KnownSymbol symbol => Text
symbolToText @name)
{-# INLINE filterWhereNot #-}
filterWhereIn :: forall name table model value. (KnownSymbol table, KnownSymbol name, DefaultParamEncoder [value], DefaultParamEncoder value, HasField name model value, model ~ GetModelByTableName table, EqOrIsOperator value, Table model) => (Proxy name, [value]) -> QueryBuilder table -> QueryBuilder table
filterWhereIn :: forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol table, KnownSymbol name, DefaultParamEncoder [value],
DefaultParamEncoder value, HasField name model value,
model ~ GetModelByTableName table, EqOrIsOperator value,
Table model) =>
(Proxy name, [value]) -> QueryBuilder table -> QueryBuilder table
filterWhereIn (Proxy name
name, [value]
value) QueryBuilder table
queryBuilder =
case [value] -> Maybe value
forall a. [a] -> Maybe a
head [value]
nullValues of
Maybe value
Nothing -> Condition -> QueryBuilder table -> QueryBuilder table
forall (table :: Symbol).
Condition -> QueryBuilder table -> QueryBuilder table
addCondition Condition
inCondition QueryBuilder table
queryBuilder
Just value
nullValue ->
let
isNullCondition :: Condition
isNullCondition = Text
-> FilterOperator
-> ConditionValue
-> Maybe Text
-> Maybe Text
-> Condition
ColumnCondition Text
columnName FilterOperator
IsOp (Text -> ConditionValue
Literal Text
"NULL") Maybe Text
forall a. Maybe a
Nothing Maybe Text
forall a. Maybe a
Nothing
in
case [value] -> Maybe value
forall a. [a] -> Maybe a
head [value]
nonNullValues of
Just value
nonNullValue ->
Condition -> QueryBuilder table -> QueryBuilder table
forall (table :: Symbol).
Condition -> QueryBuilder table -> QueryBuilder table
addCondition (Condition -> Condition -> Condition
OrCondition Condition
inCondition Condition
isNullCondition) QueryBuilder table
queryBuilder
Maybe value
Nothing -> Condition -> QueryBuilder table -> QueryBuilder table
forall (table :: Symbol).
Condition -> QueryBuilder table -> QueryBuilder table
addCondition Condition
isNullCondition QueryBuilder table
queryBuilder
where
([value]
nonNullValues, [value]
nullValues) = [value]
value [value] -> ([value] -> ([value], [value])) -> ([value], [value])
forall a b. a -> (a -> b) -> b
|> (value -> Bool) -> [value] -> ([value], [value])
forall a. (a -> Bool) -> [a] -> ([a], [a])
partition (\value
v -> value -> FilterOperator
forall value. EqOrIsOperator value => value -> FilterOperator
toEqOrIsOperator value
v FilterOperator -> FilterOperator -> Bool
forall a. Eq a => a -> a -> Bool
== FilterOperator
EqOp)
inCondition :: Condition
inCondition = Text
-> FilterOperator
-> ConditionValue
-> Maybe Text
-> Maybe Text
-> Condition
ColumnCondition Text
columnName FilterOperator
InOp ([value] -> ConditionValue
forall a. DefaultParamEncoder a => a -> ConditionValue
paramValue [value]
nonNullValues) Maybe Text
forall a. Maybe a
Nothing Maybe Text
forall a. Maybe a
Nothing
columnName :: Text
columnName = Text -> Text -> Text
qualifiedColumnName (forall record. Table record => Text
tableName @model) (forall (symbol :: Symbol). KnownSymbol symbol => Text
symbolToText @name)
{-# INLINE filterWhereIn #-}
filterWhereInCaseInsensitive :: forall name table model value. ( KnownSymbol table, KnownSymbol name, DefaultParamEncoder value, HasField name model value, model ~ GetModelByTableName table, EqOrIsOperator value, Table model) => (Proxy name, [Text]) -> QueryBuilder table -> QueryBuilder table
filterWhereInCaseInsensitive :: forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol table, KnownSymbol name, DefaultParamEncoder value,
HasField name model value, model ~ GetModelByTableName table,
EqOrIsOperator value, Table model) =>
(Proxy name, [Text]) -> QueryBuilder table -> QueryBuilder table
filterWhereInCaseInsensitive (Proxy name
name, [Text]
values) QueryBuilder table
queryBuilder =
case [Text] -> Maybe Text
forall a. [a] -> Maybe a
head [Text]
nullValues of
Maybe Text
Nothing -> Condition -> QueryBuilder table -> QueryBuilder table
forall (table :: Symbol).
Condition -> QueryBuilder table -> QueryBuilder table
addCondition Condition
inCondition QueryBuilder table
queryBuilder
Just Text
nullValue ->
let
isNullCondition :: Condition
isNullCondition = Text
-> FilterOperator
-> ConditionValue
-> Maybe Text
-> Maybe Text
-> Condition
ColumnCondition Text
columnName FilterOperator
IsOp (Text -> ConditionValue
Literal Text
"NULL") Maybe Text
forall a. Maybe a
Nothing Maybe Text
forall a. Maybe a
Nothing
in
case [Text] -> Maybe Text
forall a. [a] -> Maybe a
head [Text]
nonNullValues of
Just Text
_ ->
Condition -> QueryBuilder table -> QueryBuilder table
forall (table :: Symbol).
Condition -> QueryBuilder table -> QueryBuilder table
addCondition (Condition -> Condition -> Condition
OrCondition Condition
inCondition Condition
isNullCondition) QueryBuilder table
queryBuilder
Maybe Text
Nothing -> Condition -> QueryBuilder table -> QueryBuilder table
forall (table :: Symbol).
Condition -> QueryBuilder table -> QueryBuilder table
addCondition Condition
isNullCondition QueryBuilder table
queryBuilder
where
([Text]
nonNullValues, [Text]
nullValues) = [Text]
values [Text] -> ([Text] -> ([Text], [Text])) -> ([Text], [Text])
forall a b. a -> (a -> b) -> b
|> (Text -> Bool) -> [Text] -> ([Text], [Text])
forall a. (a -> Bool) -> [a] -> ([a], [a])
partition (\Text
v -> Text -> FilterOperator
forall value. EqOrIsOperator value => value -> FilterOperator
toEqOrIsOperator Text
v FilterOperator -> FilterOperator -> Bool
forall a. Eq a => a -> a -> Bool
== FilterOperator
EqOp)
lowerValues :: [Text]
lowerValues = (Text -> Text) -> [Text] -> [Text]
forall a b. (a -> b) -> [a] -> [b]
map Text -> Text
toLower [Text]
nonNullValues
inCondition :: Condition
inCondition = Text
-> FilterOperator
-> ConditionValue
-> Maybe Text
-> Maybe Text
-> Condition
ColumnCondition Text
lowerColumnName FilterOperator
InOp ([Text] -> ConditionValue
forall a. DefaultParamEncoder a => a -> ConditionValue
paramValue [Text]
lowerValues) Maybe Text
forall a. Maybe a
Nothing Maybe Text
forall a. Maybe a
Nothing
lowerColumnName :: Text
lowerColumnName = Text
"LOWER(" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
columnName Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
")"
columnName :: Text
columnName = Text -> Text -> Text
qualifiedColumnName (forall record. Table record => Text
tableName @model) (forall (symbol :: Symbol). KnownSymbol symbol => Text
symbolToText @name)
{-# INLINE filterWhereInCaseInsensitive #-}
filterWhereNotIn :: forall name table model value. (KnownSymbol table, KnownSymbol name, DefaultParamEncoder [value], DefaultParamEncoder value, HasField name model value, model ~ GetModelByTableName table, EqOrIsOperator value) => (Proxy name, [value]) -> QueryBuilder table -> QueryBuilder table
filterWhereNotIn :: forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol table, KnownSymbol name, DefaultParamEncoder [value],
DefaultParamEncoder value, HasField name model value,
model ~ GetModelByTableName table, EqOrIsOperator value) =>
(Proxy name, [value]) -> QueryBuilder table -> QueryBuilder table
filterWhereNotIn (Proxy name
_, []) QueryBuilder table
queryBuilder = QueryBuilder table
queryBuilder
filterWhereNotIn (Proxy name
name, [value]
value) QueryBuilder table
queryBuilder =
case [value] -> Maybe value
forall a. [a] -> Maybe a
head [value]
nullValues of
Maybe value
Nothing -> Condition -> QueryBuilder table -> QueryBuilder table
forall (table :: Symbol).
Condition -> QueryBuilder table -> QueryBuilder table
addCondition Condition
notInCondition QueryBuilder table
queryBuilder
Just value
nullValue ->
case [value] -> Maybe value
forall a. [a] -> Maybe a
head [value]
nonNullValues of
Just value
nonNullValue -> Condition -> QueryBuilder table -> QueryBuilder table
forall (table :: Symbol).
Condition -> QueryBuilder table -> QueryBuilder table
addCondition (Text
-> FilterOperator
-> ConditionValue
-> Maybe Text
-> Maybe Text
-> Condition
ColumnCondition Text
columnName FilterOperator
IsNotOp (Text -> ConditionValue
Literal Text
"NULL") Maybe Text
forall a. Maybe a
Nothing Maybe Text
forall a. Maybe a
Nothing) (Condition -> QueryBuilder table -> QueryBuilder table
forall (table :: Symbol).
Condition -> QueryBuilder table -> QueryBuilder table
addCondition Condition
notInCondition QueryBuilder table
queryBuilder)
Maybe value
Nothing -> Condition -> QueryBuilder table -> QueryBuilder table
forall (table :: Symbol).
Condition -> QueryBuilder table -> QueryBuilder table
addCondition (Text
-> FilterOperator
-> ConditionValue
-> Maybe Text
-> Maybe Text
-> Condition
ColumnCondition Text
columnName FilterOperator
IsNotOp (Text -> ConditionValue
Literal Text
"NULL") Maybe Text
forall a. Maybe a
Nothing Maybe Text
forall a. Maybe a
Nothing) QueryBuilder table
queryBuilder
where
([value]
nonNullValues, [value]
nullValues) = [value]
value [value] -> ([value] -> ([value], [value])) -> ([value], [value])
forall a b. a -> (a -> b) -> b
|> (value -> Bool) -> [value] -> ([value], [value])
forall a. (a -> Bool) -> [a] -> ([a], [a])
partition (\value
v -> value -> FilterOperator
forall value. EqOrIsOperator value => value -> FilterOperator
toEqOrIsOperator value
v FilterOperator -> FilterOperator -> Bool
forall a. Eq a => a -> a -> Bool
== FilterOperator
EqOp)
notInCondition :: Condition
notInCondition = Text
-> FilterOperator
-> ConditionValue
-> Maybe Text
-> Maybe Text
-> Condition
ColumnCondition Text
columnName FilterOperator
NotInOp ([value] -> ConditionValue
forall a. DefaultParamEncoder a => a -> ConditionValue
paramValue [value]
nonNullValues) Maybe Text
forall a. Maybe a
Nothing Maybe Text
forall a. Maybe a
Nothing
columnName :: Text
columnName = Text -> Text -> Text
qualifiedColumnName (forall (symbol :: Symbol). KnownSymbol symbol => Text
symbolToText @table) (forall (symbol :: Symbol). KnownSymbol symbol => Text
symbolToText @name)
{-# INLINE filterWhereNotIn #-}
filterWhereLike :: forall name table model value. (KnownSymbol table, KnownSymbol name, DefaultParamEncoder value, HasField name model value, model ~ GetModelByTableName table, Table model) => (Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereLike :: forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol table, KnownSymbol name, DefaultParamEncoder value,
HasField name model value, model ~ GetModelByTableName table,
Table model) =>
(Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereLike (Proxy name
name, value
value) QueryBuilder table
queryBuilder = Condition -> QueryBuilder table -> QueryBuilder table
forall (table :: Symbol).
Condition -> QueryBuilder table -> QueryBuilder table
addCondition Condition
condition QueryBuilder table
queryBuilder
where
condition :: Condition
condition = Text
-> FilterOperator
-> ConditionValue
-> Maybe Text
-> Maybe Text
-> Condition
ColumnCondition Text
columnName (MatchSensitivity -> FilterOperator
LikeOp MatchSensitivity
CaseSensitive) (value -> ConditionValue
forall a. DefaultParamEncoder a => a -> ConditionValue
paramValue value
value) Maybe Text
forall a. Maybe a
Nothing Maybe Text
forall a. Maybe a
Nothing
columnName :: Text
columnName = Text -> Text -> Text
qualifiedColumnName (forall record. Table record => Text
tableName @model) (forall (symbol :: Symbol). KnownSymbol symbol => Text
symbolToText @name)
{-# INLINE filterWhereLike #-}
filterWhereILike :: forall name table model value. (KnownSymbol table, KnownSymbol name, DefaultParamEncoder value, HasField name model value, model ~ GetModelByTableName table, Table model) => (Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereILike :: forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol table, KnownSymbol name, DefaultParamEncoder value,
HasField name model value, model ~ GetModelByTableName table,
Table model) =>
(Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereILike (Proxy name
name, value
value) QueryBuilder table
queryBuilder = Condition -> QueryBuilder table -> QueryBuilder table
forall (table :: Symbol).
Condition -> QueryBuilder table -> QueryBuilder table
addCondition Condition
condition QueryBuilder table
queryBuilder
where
condition :: Condition
condition = Text
-> FilterOperator
-> ConditionValue
-> Maybe Text
-> Maybe Text
-> Condition
ColumnCondition Text
columnName (MatchSensitivity -> FilterOperator
LikeOp MatchSensitivity
CaseInsensitive) (value -> ConditionValue
forall a. DefaultParamEncoder a => a -> ConditionValue
paramValue value
value) Maybe Text
forall a. Maybe a
Nothing Maybe Text
forall a. Maybe a
Nothing
columnName :: Text
columnName = Text -> Text -> Text
qualifiedColumnName (forall record. Table record => Text
tableName @model) (forall (symbol :: Symbol). KnownSymbol symbol => Text
symbolToText @name)
{-# INLINE filterWhereILike #-}
filterWhereMatches :: forall name table model value. (KnownSymbol table, KnownSymbol name, DefaultParamEncoder value, HasField name model value, table ~ GetTableName model, Table model) => (Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereMatches :: forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol table, KnownSymbol name, DefaultParamEncoder value,
HasField name model value, table ~ GetTableName model,
Table model) =>
(Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereMatches (Proxy name
name, value
value) QueryBuilder table
queryBuilder = Condition -> QueryBuilder table -> QueryBuilder table
forall (table :: Symbol).
Condition -> QueryBuilder table -> QueryBuilder table
addCondition Condition
condition QueryBuilder table
queryBuilder
where
condition :: Condition
condition = Text
-> FilterOperator
-> ConditionValue
-> Maybe Text
-> Maybe Text
-> Condition
ColumnCondition Text
columnName (MatchSensitivity -> FilterOperator
MatchesOp MatchSensitivity
CaseSensitive) (value -> ConditionValue
forall a. DefaultParamEncoder a => a -> ConditionValue
paramValue value
value) Maybe Text
forall a. Maybe a
Nothing Maybe Text
forall a. Maybe a
Nothing
columnName :: Text
columnName = Text -> Text -> Text
qualifiedColumnName (forall record. Table record => Text
tableName @model) (forall (symbol :: Symbol). KnownSymbol symbol => Text
symbolToText @name)
{-# INLINE filterWhereMatches #-}
filterWhereIMatches :: forall name table model value. (KnownSymbol table, KnownSymbol name, DefaultParamEncoder value, HasField name model value, model ~ GetModelByTableName table, Table model) => (Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereIMatches :: forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol table, KnownSymbol name, DefaultParamEncoder value,
HasField name model value, model ~ GetModelByTableName table,
Table model) =>
(Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereIMatches (Proxy name
name, value
value) QueryBuilder table
queryBuilder = Condition -> QueryBuilder table -> QueryBuilder table
forall (table :: Symbol).
Condition -> QueryBuilder table -> QueryBuilder table
addCondition Condition
condition QueryBuilder table
queryBuilder
where
condition :: Condition
condition = Text
-> FilterOperator
-> ConditionValue
-> Maybe Text
-> Maybe Text
-> Condition
ColumnCondition Text
columnName (MatchSensitivity -> FilterOperator
MatchesOp MatchSensitivity
CaseInsensitive) (value -> ConditionValue
forall a. DefaultParamEncoder a => a -> ConditionValue
paramValue value
value) Maybe Text
forall a. Maybe a
Nothing Maybe Text
forall a. Maybe a
Nothing
columnName :: Text
columnName = Text -> Text -> Text
qualifiedColumnName (forall record. Table record => Text
tableName @model) (forall (symbol :: Symbol). KnownSymbol symbol => Text
symbolToText @name)
{-# INLINE filterWhereIMatches #-}
filterWherePast
:: ( KnownSymbol table
, KnownSymbol name
, HasField name (GetModelByTableName table) value
, Table (GetModelByTableName table)
)
=> Proxy name -> QueryBuilder table -> QueryBuilder table
filterWherePast :: forall (table :: Symbol) (name :: Symbol) value.
(KnownSymbol table, KnownSymbol name,
HasField name (GetModelByTableName table) value,
Table (GetModelByTableName table)) =>
Proxy name -> QueryBuilder table -> QueryBuilder table
filterWherePast Proxy name
name = (Proxy name, Text) -> QueryBuilder table -> QueryBuilder table
forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol table, KnownSymbol name, HasField name model value,
model ~ GetModelByTableName table, Table model) =>
(Proxy name, Text) -> QueryBuilder table -> QueryBuilder table
filterWhereSql (Proxy name
name, Text
"<= NOW()")
{-# INLINE filterWherePast #-}
filterWhereFuture
:: ( KnownSymbol table
, KnownSymbol name
, HasField name (GetModelByTableName table) value
, Table (GetModelByTableName table)
)
=> Proxy name -> QueryBuilder table -> QueryBuilder table
filterWhereFuture :: forall (table :: Symbol) (name :: Symbol) value.
(KnownSymbol table, KnownSymbol name,
HasField name (GetModelByTableName table) value,
Table (GetModelByTableName table)) =>
Proxy name -> QueryBuilder table -> QueryBuilder table
filterWhereFuture Proxy name
name = (Proxy name, Text) -> QueryBuilder table -> QueryBuilder table
forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol table, KnownSymbol name, HasField name model value,
model ~ GetModelByTableName table, Table model) =>
(Proxy name, Text) -> QueryBuilder table -> QueryBuilder table
filterWhereSql (Proxy name
name, Text
"> NOW()")
{-# INLINE filterWhereFuture #-}
filterWhereGreaterThan :: forall name table model value. (KnownSymbol table, KnownSymbol name, DefaultParamEncoder value, HasField name model value, model ~ GetModelByTableName table, Table model) => (Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereGreaterThan :: forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol table, KnownSymbol name, DefaultParamEncoder value,
HasField name model value, model ~ GetModelByTableName table,
Table model) =>
(Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereGreaterThan (Proxy name
name, value
value) QueryBuilder table
queryBuilder = Condition -> QueryBuilder table -> QueryBuilder table
forall (table :: Symbol).
Condition -> QueryBuilder table -> QueryBuilder table
addCondition Condition
condition QueryBuilder table
queryBuilder
where
condition :: Condition
condition = Text
-> FilterOperator
-> ConditionValue
-> Maybe Text
-> Maybe Text
-> Condition
ColumnCondition Text
columnName FilterOperator
GreaterThanOp (value -> ConditionValue
forall a. DefaultParamEncoder a => a -> ConditionValue
paramValue value
value) Maybe Text
forall a. Maybe a
Nothing Maybe Text
forall a. Maybe a
Nothing
columnName :: Text
columnName = Text -> Text -> Text
qualifiedColumnName (forall record. Table record => Text
tableName @model) (forall (symbol :: Symbol). KnownSymbol symbol => Text
symbolToText @name)
{-# INLINE filterWhereGreaterThan #-}
filterWhereLarger :: forall name table model value. (KnownSymbol table, KnownSymbol name, DefaultParamEncoder value, HasField name model value, model ~ GetModelByTableName table, Table model) => (Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereLarger :: forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol table, KnownSymbol name, DefaultParamEncoder value,
HasField name model value, model ~ GetModelByTableName table,
Table model) =>
(Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereLarger = (Proxy name, value) -> QueryBuilder table -> QueryBuilder table
forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol table, KnownSymbol name, DefaultParamEncoder value,
HasField name model value, model ~ GetModelByTableName table,
Table model) =>
(Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereGreaterThan
{-# INLINE filterWhereLarger #-}
filterWhereGreaterThanOrEqualTo :: forall name table model value. (KnownSymbol table, KnownSymbol name, DefaultParamEncoder value, HasField name model value, model ~ GetModelByTableName table, Table model) => (Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereGreaterThanOrEqualTo :: forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol table, KnownSymbol name, DefaultParamEncoder value,
HasField name model value, model ~ GetModelByTableName table,
Table model) =>
(Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereGreaterThanOrEqualTo (Proxy name
name, value
value) QueryBuilder table
queryBuilder = Condition -> QueryBuilder table -> QueryBuilder table
forall (table :: Symbol).
Condition -> QueryBuilder table -> QueryBuilder table
addCondition Condition
condition QueryBuilder table
queryBuilder
where
condition :: Condition
condition = Text
-> FilterOperator
-> ConditionValue
-> Maybe Text
-> Maybe Text
-> Condition
ColumnCondition Text
columnName FilterOperator
GreaterThanOrEqualToOp (value -> ConditionValue
forall a. DefaultParamEncoder a => a -> ConditionValue
paramValue value
value) Maybe Text
forall a. Maybe a
Nothing Maybe Text
forall a. Maybe a
Nothing
columnName :: Text
columnName = Text -> Text -> Text
qualifiedColumnName (forall record. Table record => Text
tableName @model) (forall (symbol :: Symbol). KnownSymbol symbol => Text
symbolToText @name)
{-# INLINE filterWhereGreaterThanOrEqualTo #-}
filterWhereAtLeast :: forall name table model value. (KnownSymbol table, KnownSymbol name, DefaultParamEncoder value, HasField name model value, model ~ GetModelByTableName table, Table model) => (Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereAtLeast :: forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol table, KnownSymbol name, DefaultParamEncoder value,
HasField name model value, model ~ GetModelByTableName table,
Table model) =>
(Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereAtLeast = (Proxy name, value) -> QueryBuilder table -> QueryBuilder table
forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol table, KnownSymbol name, DefaultParamEncoder value,
HasField name model value, model ~ GetModelByTableName table,
Table model) =>
(Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereGreaterThanOrEqualTo
{-# INLINE filterWhereAtLeast #-}
filterWhereLessThan :: forall name table model value. (KnownSymbol table, KnownSymbol name, DefaultParamEncoder value, HasField name model value, model ~ GetModelByTableName table, Table model) => (Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereLessThan :: forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol table, KnownSymbol name, DefaultParamEncoder value,
HasField name model value, model ~ GetModelByTableName table,
Table model) =>
(Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereLessThan (Proxy name
name, value
value) QueryBuilder table
queryBuilder = Condition -> QueryBuilder table -> QueryBuilder table
forall (table :: Symbol).
Condition -> QueryBuilder table -> QueryBuilder table
addCondition Condition
condition QueryBuilder table
queryBuilder
where
condition :: Condition
condition = Text
-> FilterOperator
-> ConditionValue
-> Maybe Text
-> Maybe Text
-> Condition
ColumnCondition Text
columnName FilterOperator
LessThanOp (value -> ConditionValue
forall a. DefaultParamEncoder a => a -> ConditionValue
paramValue value
value) Maybe Text
forall a. Maybe a
Nothing Maybe Text
forall a. Maybe a
Nothing
columnName :: Text
columnName = Text -> Text -> Text
qualifiedColumnName (forall record. Table record => Text
tableName @model) (forall (symbol :: Symbol). KnownSymbol symbol => Text
symbolToText @name)
{-# INLINE filterWhereLessThan #-}
filterWhereSmaller :: forall name table model value. (KnownSymbol table, KnownSymbol name, DefaultParamEncoder value, HasField name model value, model ~ GetModelByTableName table, Table model) => (Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereSmaller :: forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol table, KnownSymbol name, DefaultParamEncoder value,
HasField name model value, model ~ GetModelByTableName table,
Table model) =>
(Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereSmaller = (Proxy name, value) -> QueryBuilder table -> QueryBuilder table
forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol table, KnownSymbol name, DefaultParamEncoder value,
HasField name model value, model ~ GetModelByTableName table,
Table model) =>
(Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereLessThan
{-# INLINE filterWhereSmaller #-}
filterWhereLessThanOrEqualTo :: forall name table model value. (KnownSymbol table, KnownSymbol name, DefaultParamEncoder value, HasField name model value, model ~ GetModelByTableName table, Table model) => (Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereLessThanOrEqualTo :: forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol table, KnownSymbol name, DefaultParamEncoder value,
HasField name model value, model ~ GetModelByTableName table,
Table model) =>
(Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereLessThanOrEqualTo (Proxy name
name, value
value) QueryBuilder table
queryBuilder = Condition -> QueryBuilder table -> QueryBuilder table
forall (table :: Symbol).
Condition -> QueryBuilder table -> QueryBuilder table
addCondition Condition
condition QueryBuilder table
queryBuilder
where
condition :: Condition
condition = Text
-> FilterOperator
-> ConditionValue
-> Maybe Text
-> Maybe Text
-> Condition
ColumnCondition Text
columnName FilterOperator
LessThanOrEqualToOp (value -> ConditionValue
forall a. DefaultParamEncoder a => a -> ConditionValue
paramValue value
value) Maybe Text
forall a. Maybe a
Nothing Maybe Text
forall a. Maybe a
Nothing
columnName :: Text
columnName = Text -> Text -> Text
qualifiedColumnName (forall record. Table record => Text
tableName @model) (forall (symbol :: Symbol). KnownSymbol symbol => Text
symbolToText @name)
{-# INLINE filterWhereLessThanOrEqualTo #-}
filterWhereAtMost :: forall name table model value. (KnownSymbol table, KnownSymbol name, DefaultParamEncoder value, HasField name model value, model ~ GetModelByTableName table, Table model) => (Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereAtMost :: forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol table, KnownSymbol name, DefaultParamEncoder value,
HasField name model value, model ~ GetModelByTableName table,
Table model) =>
(Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereAtMost = (Proxy name, value) -> QueryBuilder table -> QueryBuilder table
forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol table, KnownSymbol name, DefaultParamEncoder value,
HasField name model value, model ~ GetModelByTableName table,
Table model) =>
(Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereLessThanOrEqualTo
{-# INLINE filterWhereAtMost #-}
filterWhereSql :: forall name table model value. (KnownSymbol table, KnownSymbol name, HasField name model value, model ~ GetModelByTableName table, Table model) => (Proxy name, Text) -> QueryBuilder table -> QueryBuilder table
filterWhereSql :: forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol table, KnownSymbol name, HasField name model value,
model ~ GetModelByTableName table, Table model) =>
(Proxy name, Text) -> QueryBuilder table -> QueryBuilder table
filterWhereSql (Proxy name
name, Text
sqlCondition) QueryBuilder table
queryBuilder = Condition -> QueryBuilder table -> QueryBuilder table
forall (table :: Symbol).
Condition -> QueryBuilder table -> QueryBuilder table
addCondition Condition
condition QueryBuilder table
queryBuilder
where
condition :: Condition
condition = Text
-> FilterOperator
-> ConditionValue
-> Maybe Text
-> Maybe Text
-> Condition
ColumnCondition Text
columnName FilterOperator
SqlOp (Text -> ConditionValue
Literal Text
sqlCondition) Maybe Text
forall a. Maybe a
Nothing Maybe Text
forall a. Maybe a
Nothing
columnName :: Text
columnName = Text -> Text -> Text
qualifiedColumnName (forall record. Table record => Text
tableName @model) (forall (symbol :: Symbol). KnownSymbol symbol => Text
symbolToText @name)
{-# INLINE filterWhereSql #-}
filterWhereCaseInsensitive :: forall name table model value. (KnownSymbol table, KnownSymbol name, DefaultParamEncoder value, HasField name model value, EqOrIsOperator value, model ~ GetModelByTableName table, Table model) => (Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereCaseInsensitive :: forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol table, KnownSymbol name, DefaultParamEncoder value,
HasField name model value, EqOrIsOperator value,
model ~ GetModelByTableName table, Table model) =>
(Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereCaseInsensitive (Proxy name
name, value
value) QueryBuilder table
queryBuilder = Condition -> QueryBuilder table -> QueryBuilder table
forall (table :: Symbol).
Condition -> QueryBuilder table -> QueryBuilder table
addCondition Condition
condition QueryBuilder table
queryBuilder
where
condition :: Condition
condition = let op :: FilterOperator
op = value -> FilterOperator
forall value. EqOrIsOperator value => value -> FilterOperator
toEqOrIsOperator value
value in Text
-> FilterOperator
-> ConditionValue
-> Maybe Text
-> Maybe Text
-> Condition
ColumnCondition Text
columnName FilterOperator
op (FilterOperator -> value -> ConditionValue
forall a.
DefaultParamEncoder a =>
FilterOperator -> a -> ConditionValue
condValueForOp FilterOperator
op value
value) (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
"LOWER") (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
"LOWER")
columnName :: Text
columnName = Text -> Text -> Text
qualifiedColumnName (forall record. Table record => Text
tableName @model) (forall (symbol :: Symbol). KnownSymbol symbol => Text
symbolToText @name)
{-# INLINE filterWhereCaseInsensitive #-}
filterWhereIdIn :: forall table model. (KnownSymbol table, Table model, model ~ GetModelByTableName table, DefaultParamEncoder [PrimaryKey (GetTableName model)]) => [Id model] -> QueryBuilder table -> QueryBuilder table
filterWhereIdIn :: forall (table :: Symbol) model.
(KnownSymbol table, Table model, model ~ GetModelByTableName table,
DefaultParamEncoder [PrimaryKey (GetTableName model)]) =>
[Id model] -> QueryBuilder table -> QueryBuilder table
filterWhereIdIn [Id model]
values QueryBuilder table
queryBuilder =
let
rawPrimaryKeys :: [PrimaryKey (GetTableName model)]
rawPrimaryKeys = (Id model -> PrimaryKey (GetTableName model))
-> [Id model] -> [PrimaryKey (GetTableName model)]
forall a b. (a -> b) -> [a] -> [b]
map (\(Id PrimaryKey (GetTableName model)
pk) -> PrimaryKey (GetTableName model)
pk) [Id model]
values
condition :: Condition
condition = Text
-> FilterOperator
-> ConditionValue
-> Maybe Text
-> Maybe Text
-> Condition
ColumnCondition (forall record. Table record => Text
primaryKeyConditionColumnSelector @model) FilterOperator
InOp ([PrimaryKey (GetTableName model)] -> ConditionValue
forall a. DefaultParamEncoder a => a -> ConditionValue
paramValue [PrimaryKey (GetTableName model)]
rawPrimaryKeys) Maybe Text
forall a. Maybe a
Nothing Maybe Text
forall a. Maybe a
Nothing
in
Condition -> QueryBuilder table -> QueryBuilder table
forall (table :: Symbol).
Condition -> QueryBuilder table -> QueryBuilder table
addCondition Condition
condition QueryBuilder table
queryBuilder
{-# INLINE filterWhereIdIn #-}