{-# 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)
import qualified Data.Text as Text
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 name, DefaultParamEncoder value, HasField name model value, EqOrIsOperator value, model ~ GetModelByTableName table) => (Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhere :: forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol name, DefaultParamEncoder value,
HasField name model value, EqOrIsOperator value,
model ~ GetModelByTableName table) =>
(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 (QueryBuilder table -> Text
forall (table :: Symbol). QueryBuilder table -> Text
queryBuilderTableName QueryBuilder table
queryBuilder) (forall (symbol :: Symbol). KnownSymbol symbol => Text
symbolToText @name)
{-# INLINE filterWhere #-}
filterWhereNot :: forall name table model value. (KnownSymbol name, DefaultParamEncoder value, HasField name model value, EqOrIsOperator value, model ~ GetModelByTableName table) => (Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereNot :: forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol name, DefaultParamEncoder value,
HasField name model value, EqOrIsOperator value,
model ~ GetModelByTableName table) =>
(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 (QueryBuilder table -> Text
forall (table :: Symbol). QueryBuilder table -> Text
queryBuilderTableName QueryBuilder table
queryBuilder) (forall (symbol :: Symbol). KnownSymbol symbol => Text
symbolToText @name)
{-# INLINE filterWhereNot #-}
filterWhereIn :: forall name table model value. (KnownSymbol name, DefaultParamEncoder [value], DefaultParamEncoder value, HasField name model value, model ~ GetModelByTableName table, EqOrIsOperator value) => (Proxy name, [value]) -> QueryBuilder table -> QueryBuilder table
filterWhereIn :: forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol name, DefaultParamEncoder [value],
DefaultParamEncoder value, HasField name model value,
model ~ GetModelByTableName table, EqOrIsOperator value) =>
(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 (QueryBuilder table -> Text
forall (table :: Symbol). QueryBuilder table -> Text
queryBuilderTableName QueryBuilder table
queryBuilder) (forall (symbol :: Symbol). KnownSymbol symbol => Text
symbolToText @name)
{-# INLINE filterWhereIn #-}
filterWhereInCaseInsensitive :: forall name table model value. (KnownSymbol name, DefaultParamEncoder value, HasField name model value, model ~ GetModelByTableName table, EqOrIsOperator value) => (Proxy name, [Text]) -> QueryBuilder table -> QueryBuilder table
filterWhereInCaseInsensitive :: forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol name, DefaultParamEncoder value,
HasField name model value, model ~ GetModelByTableName table,
EqOrIsOperator value) =>
(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 (QueryBuilder table -> Text
forall (table :: Symbol). QueryBuilder table -> Text
queryBuilderTableName QueryBuilder table
queryBuilder) (forall (symbol :: Symbol). KnownSymbol symbol => Text
symbolToText @name)
{-# INLINE filterWhereInCaseInsensitive #-}
filterWhereNotIn :: forall name table model value. (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 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 (QueryBuilder table -> Text
forall (table :: Symbol). QueryBuilder table -> Text
queryBuilderTableName QueryBuilder table
queryBuilder) (forall (symbol :: Symbol). KnownSymbol symbol => Text
symbolToText @name)
{-# INLINE filterWhereNotIn #-}
filterWhereLike :: forall name table model value. (KnownSymbol name, DefaultParamEncoder value, HasField name model value, model ~ GetModelByTableName table) => (Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereLike :: forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol name, DefaultParamEncoder value,
HasField name model value, model ~ GetModelByTableName table) =>
(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 (QueryBuilder table -> Text
forall (table :: Symbol). QueryBuilder table -> Text
queryBuilderTableName QueryBuilder table
queryBuilder) (forall (symbol :: Symbol). KnownSymbol symbol => Text
symbolToText @name)
{-# INLINE filterWhereLike #-}
filterWhereILike :: forall name table model value. (KnownSymbol name, DefaultParamEncoder value, HasField name model value, model ~ GetModelByTableName table) => (Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereILike :: forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol name, DefaultParamEncoder value,
HasField name model value, model ~ GetModelByTableName table) =>
(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 (QueryBuilder table -> Text
forall (table :: Symbol). QueryBuilder table -> Text
queryBuilderTableName QueryBuilder table
queryBuilder) (forall (symbol :: Symbol). KnownSymbol symbol => Text
symbolToText @name)
{-# INLINE filterWhereILike #-}
filterWhereMatches :: forall name table model value. (KnownSymbol name, DefaultParamEncoder value, HasField name model value, model ~ GetModelByTableName table) => (Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereMatches :: forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol name, DefaultParamEncoder value,
HasField name model value, model ~ GetModelByTableName table) =>
(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 (QueryBuilder table -> Text
forall (table :: Symbol). QueryBuilder table -> Text
queryBuilderTableName QueryBuilder table
queryBuilder) (forall (symbol :: Symbol). KnownSymbol symbol => Text
symbolToText @name)
{-# INLINE filterWhereMatches #-}
filterWhereIMatches :: forall name table model value. (KnownSymbol name, DefaultParamEncoder value, HasField name model value, model ~ GetModelByTableName table) => (Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereIMatches :: forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol name, DefaultParamEncoder value,
HasField name model value, model ~ GetModelByTableName table) =>
(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 (QueryBuilder table -> Text
forall (table :: Symbol). QueryBuilder table -> Text
queryBuilderTableName QueryBuilder table
queryBuilder) (forall (symbol :: Symbol). KnownSymbol symbol => Text
symbolToText @name)
{-# INLINE filterWhereIMatches #-}
filterWherePast
:: ( KnownSymbol name
, HasField name (GetModelByTableName table) value
)
=> Proxy name -> QueryBuilder table -> QueryBuilder table
filterWherePast :: forall (name :: Symbol) (table :: Symbol) value.
(KnownSymbol name,
HasField name (GetModelByTableName table) value) =>
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 name, HasField name model value,
model ~ GetModelByTableName table) =>
(Proxy name, Text) -> QueryBuilder table -> QueryBuilder table
filterWhereSql (Proxy name
name, Text
"<= NOW()")
{-# INLINE filterWherePast #-}
filterWhereFuture
:: ( KnownSymbol name
, HasField name (GetModelByTableName table) value
)
=> Proxy name -> QueryBuilder table -> QueryBuilder table
filterWhereFuture :: forall (name :: Symbol) (table :: Symbol) value.
(KnownSymbol name,
HasField name (GetModelByTableName table) value) =>
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 name, HasField name model value,
model ~ GetModelByTableName table) =>
(Proxy name, Text) -> QueryBuilder table -> QueryBuilder table
filterWhereSql (Proxy name
name, Text
"> NOW()")
{-# INLINE filterWhereFuture #-}
filterWhereGreaterThan :: forall name table model value. (KnownSymbol name, DefaultParamEncoder value, HasField name model value, model ~ GetModelByTableName table) => (Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereGreaterThan :: forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol name, DefaultParamEncoder value,
HasField name model value, model ~ GetModelByTableName table) =>
(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 (QueryBuilder table -> Text
forall (table :: Symbol). QueryBuilder table -> Text
queryBuilderTableName QueryBuilder table
queryBuilder) (forall (symbol :: Symbol). KnownSymbol symbol => Text
symbolToText @name)
{-# INLINE filterWhereGreaterThan #-}
filterWhereLarger :: forall name table model value. (KnownSymbol name, DefaultParamEncoder value, HasField name model value, model ~ GetModelByTableName table) => (Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereLarger :: forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol name, DefaultParamEncoder value,
HasField name model value, model ~ GetModelByTableName table) =>
(Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereLarger = (Proxy name, value) -> QueryBuilder table -> QueryBuilder table
forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol name, DefaultParamEncoder value,
HasField name model value, model ~ GetModelByTableName table) =>
(Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereGreaterThan
{-# INLINE filterWhereLarger #-}
filterWhereGreaterThanOrEqualTo :: forall name table model value. (KnownSymbol name, DefaultParamEncoder value, HasField name model value, model ~ GetModelByTableName table) => (Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereGreaterThanOrEqualTo :: forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol name, DefaultParamEncoder value,
HasField name model value, model ~ GetModelByTableName table) =>
(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 (QueryBuilder table -> Text
forall (table :: Symbol). QueryBuilder table -> Text
queryBuilderTableName QueryBuilder table
queryBuilder) (forall (symbol :: Symbol). KnownSymbol symbol => Text
symbolToText @name)
{-# INLINE filterWhereGreaterThanOrEqualTo #-}
filterWhereAtLeast :: forall name table model value. (KnownSymbol name, DefaultParamEncoder value, HasField name model value, model ~ GetModelByTableName table) => (Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereAtLeast :: forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol name, DefaultParamEncoder value,
HasField name model value, model ~ GetModelByTableName table) =>
(Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereAtLeast = (Proxy name, value) -> QueryBuilder table -> QueryBuilder table
forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol name, DefaultParamEncoder value,
HasField name model value, model ~ GetModelByTableName table) =>
(Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereGreaterThanOrEqualTo
{-# INLINE filterWhereAtLeast #-}
filterWhereLessThan :: forall name table model value. (KnownSymbol name, DefaultParamEncoder value, HasField name model value, model ~ GetModelByTableName table) => (Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereLessThan :: forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol name, DefaultParamEncoder value,
HasField name model value, model ~ GetModelByTableName table) =>
(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 (QueryBuilder table -> Text
forall (table :: Symbol). QueryBuilder table -> Text
queryBuilderTableName QueryBuilder table
queryBuilder) (forall (symbol :: Symbol). KnownSymbol symbol => Text
symbolToText @name)
{-# INLINE filterWhereLessThan #-}
filterWhereSmaller :: forall name table model value. (KnownSymbol name, DefaultParamEncoder value, HasField name model value, model ~ GetModelByTableName table) => (Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereSmaller :: forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol name, DefaultParamEncoder value,
HasField name model value, model ~ GetModelByTableName table) =>
(Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereSmaller = (Proxy name, value) -> QueryBuilder table -> QueryBuilder table
forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol name, DefaultParamEncoder value,
HasField name model value, model ~ GetModelByTableName table) =>
(Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereLessThan
{-# INLINE filterWhereSmaller #-}
filterWhereLessThanOrEqualTo :: forall name table model value. (KnownSymbol name, DefaultParamEncoder value, HasField name model value, model ~ GetModelByTableName table) => (Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereLessThanOrEqualTo :: forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol name, DefaultParamEncoder value,
HasField name model value, model ~ GetModelByTableName table) =>
(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 (QueryBuilder table -> Text
forall (table :: Symbol). QueryBuilder table -> Text
queryBuilderTableName QueryBuilder table
queryBuilder) (forall (symbol :: Symbol). KnownSymbol symbol => Text
symbolToText @name)
{-# INLINE filterWhereLessThanOrEqualTo #-}
filterWhereAtMost :: forall name table model value. (KnownSymbol name, DefaultParamEncoder value, HasField name model value, model ~ GetModelByTableName table) => (Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereAtMost :: forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol name, DefaultParamEncoder value,
HasField name model value, model ~ GetModelByTableName table) =>
(Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereAtMost = (Proxy name, value) -> QueryBuilder table -> QueryBuilder table
forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol name, DefaultParamEncoder value,
HasField name model value, model ~ GetModelByTableName table) =>
(Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereLessThanOrEqualTo
{-# INLINE filterWhereAtMost #-}
filterWhereSql :: forall name table model value. (KnownSymbol name, HasField name model value, model ~ GetModelByTableName table) => (Proxy name, Text) -> QueryBuilder table -> QueryBuilder table
filterWhereSql :: forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol name, HasField name model value,
model ~ GetModelByTableName table) =>
(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 (QueryBuilder table -> Text
forall (table :: Symbol). QueryBuilder table -> Text
queryBuilderTableName QueryBuilder table
queryBuilder) (forall (symbol :: Symbol). KnownSymbol symbol => Text
symbolToText @name)
{-# INLINE filterWhereSql #-}
filterWhereCaseInsensitive :: forall name table model value. (KnownSymbol name, DefaultParamEncoder value, HasField name model value, EqOrIsOperator value, model ~ GetModelByTableName table) => (Proxy name, value) -> QueryBuilder table -> QueryBuilder table
filterWhereCaseInsensitive :: forall (name :: Symbol) (table :: Symbol) model value.
(KnownSymbol name, DefaultParamEncoder value,
HasField name model value, EqOrIsOperator value,
model ~ GetModelByTableName table) =>
(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 (QueryBuilder table -> Text
forall (table :: Symbol). QueryBuilder table -> Text
queryBuilderTableName QueryBuilder table
queryBuilder) (forall (symbol :: Symbol). KnownSymbol symbol => Text
symbolToText @name)
{-# INLINE filterWhereCaseInsensitive #-}
filterWhereIdIn :: forall table model. (Table model, model ~ GetModelByTableName table, DefaultParamEncoder [PrimaryKey table]) => [Id' table] -> QueryBuilder table -> QueryBuilder table
filterWhereIdIn :: forall (table :: Symbol) model.
(Table model, model ~ GetModelByTableName table,
DefaultParamEncoder [PrimaryKey table]) =>
[Id' table] -> QueryBuilder table -> QueryBuilder table
filterWhereIdIn [Id' table]
values QueryBuilder table
queryBuilder =
let
rawPrimaryKeys :: [PrimaryKey table]
rawPrimaryKeys = (Id' table -> PrimaryKey table)
-> [Id' table] -> [PrimaryKey table]
forall a b. (a -> b) -> [a] -> [b]
map (\(Id PrimaryKey table
pk) -> PrimaryKey table
pk) [Id' table]
values
condition :: Condition
condition = Text
-> FilterOperator
-> ConditionValue
-> Maybe Text
-> Maybe Text
-> Condition
ColumnCondition Text
primaryKeySelector FilterOperator
InOp ([PrimaryKey table] -> ConditionValue
forall a. DefaultParamEncoder a => a -> ConditionValue
paramValue [PrimaryKey table]
rawPrimaryKeys) Maybe Text
forall a. Maybe a
Nothing Maybe Text
forall a. Maybe a
Nothing
table :: Text
table = QueryBuilder table -> Text
forall (table :: Symbol). QueryBuilder table -> Text
queryBuilderTableName QueryBuilder table
queryBuilder
qualifyColumnName :: Text -> Text
qualifyColumnName Text
column = Text
table Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"." Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
column
primaryKeySelector :: Text
primaryKeySelector = case forall record. Table record => [Text]
primaryKeyColumnNames @model of
[] -> Text -> Text
forall a. Text -> a
error (Text -> Text) -> (Text -> Text) -> Text -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Text -> Text
forall a b. ConvertibleStrings a b => a -> b
cs (Text -> Text) -> Text -> Text
forall a b. (a -> b) -> a -> b
$ Text
"Impossible happened in filterWhereIdIn. No primary keys found for table " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
table Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
". At least one primary key is required."
[Text
column] -> Text -> Text
qualifyColumnName Text
column
[Text]
columns -> Text
"(" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text -> [Text] -> Text
Text.intercalate Text
", " ((Text -> Text) -> [Text] -> [Text]
forall a b. (a -> b) -> [a] -> [b]
map Text -> Text
qualifyColumnName [Text]
columns) Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
")"
in
Condition -> QueryBuilder table -> QueryBuilder table
forall (table :: Symbol).
Condition -> QueryBuilder table -> QueryBuilder table
addCondition Condition
condition QueryBuilder table
queryBuilder
{-# INLINE filterWhereIdIn #-}