Generic contains SQL filter for generic user column

This commit is contained in:
SJost 2019-03-09 14:35:47 +01:00
parent 2ddda4578e
commit c4d77d665a
3 changed files with 34 additions and 17 deletions

View File

@ -5,7 +5,7 @@ module Database.Esqueleto.Utils
, isInfixOf, hasInfix
, any, all
, SqlIn(..)
, mkInFilter
, mkExactFilter, mkContainsFilter
) where
import ClassyPrelude.Yesod hiding (isInfixOf, any, all)
@ -52,23 +52,31 @@ all :: Foldable f =>
(a -> E.SqlExpr (E.Value Bool)) -> f a -> E.SqlExpr (E.Value Bool)
all test = F.foldr (\needle acc -> acc E.&&. test needle) true
$(sqlInTuples [2..16])
-- | generic filter creation for dbTable
-- Given a lens-like function, make filter
-- What I thought:
-- mkFilter :: (Foldable f, E.From query expr backend a)
-- => (a -> E.SqlExpr (E.Value b))
-- -> a
-- -> f b
-- -> E.SqlExpr (E.Value Bool)
-- What is inferred:
mkInFilter :: (PersistField a)
=> (t -> E.SqlExpr (E.Value a))
-> t
-> Set.Set a
-- Given a lens-like function, make filter for exact matches in a collection
-- (Generalizing from Set to Foldable ok here, but gives ambigouus types elsewhere)
mkExactFilter :: (PersistField a)
=> (t -> E.SqlExpr (E.Value a)) -- ^ getter from query to searched element
-> t -- ^ query row
-> Set.Set a -- ^ needle collection
-> E.SqlExpr (E.Value Bool)
mkInFilter lenslike row criterias
mkExactFilter lenslike row criterias
| Set.null criterias = true
| otherwise = (lenslike row) `E.in_` E.valList (Set.toList criterias)
| otherwise = (lenslike row) `E.in_` E.valList (Set.toList criterias)
-- | generic filter creation for dbTable
-- Given a lens-like function, make filter searching for needles in String-like elements
-- (Generalizing from Set to Foldable ok here, but gives ambigouus types elsewhere)
mkContainsFilter :: (E.SqlString a)
=> (t -> E.SqlExpr (E.Value a)) -- ^ getter from query to searched element
-> t -- ^ query row
-> Set.Set Text -- ^ needle collection
-> E.SqlExpr (E.Value Bool)
mkContainsFilter lenslike row criterias
| Set.null criterias = true
| otherwise = any (hasInfix $ lenslike row) criterias

View File

@ -767,7 +767,7 @@ makeCourseUserTable cid colChoices psValidator =
]
dbtFilter = Map.fromList
[ filterUserName queryUser
, ( "course-user-semesternr", FilterColumn $ mkInFilter queryUserSemester)
, ( "course-user-semesternr", FilterColumn $ mkExactFilter queryUserSemester)
-- TODO
]
dbtFilterUI = mempty -- TODO

View File

@ -65,10 +65,19 @@ defaultSortingByName = defaultSorting [SortAscBy "user-surname", SortAscBy "user
filterUserName :: (IsFilterColumn t (a2 -> Set Text -> E.SqlExpr (E.Value Bool)), IsString a1)
=> (a2 -> E.SqlExpr (Entity User))
-> (a1, FilterColumn t)
filterUserName queryUser = ( "user-surname", FilterColumn $ mkInFilter queryName )
filterUserName queryUser = ( "user-surname", FilterColumn $ mkContainsFilter queryName )
where
queryName = compose queryUser (E.^. UserSurname)
filterUserNameExact :: (IsFilterColumn t (a2 -> Set Text -> E.SqlExpr (E.Value Bool)), IsString a1)
=> (a2 -> E.SqlExpr (Entity User))
-> (a1, FilterColumn t)
filterUserNameExact queryUser = ( "user-surname", FilterColumn $ mkExactFilter queryName )
where
queryName = compose queryUser (E.^. UserSurname)
-------------------
-- Matriclenumber