From d9fe4048f38812b887edf2614052d2116f0a8741 Mon Sep 17 00:00:00 2001 From: Marc Scholten Date: Sat, 22 Jun 2024 15:36:18 -0700 Subject: [PATCH] Added queryUnionList --- IHP/QueryBuilder.hs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/IHP/QueryBuilder.hs b/IHP/QueryBuilder.hs index 845e51e53..81bd9c7d5 100644 --- a/IHP/QueryBuilder.hs +++ b/IHP/QueryBuilder.hs @@ -1030,6 +1030,26 @@ queryUnion firstQueryBuilderProvider secondQueryBuilderProvider = NoJoinQueryBui {-# INLINE queryUnion #-} +-- | Like 'queryUnion', but applied on all the elements on the list +-- +-- > action ProjectsAction = do +-- > let values :: [(ProjectType, Int)] = [(ProjectTypeOngoing, 3), (ProjectTypeNotStarted, 2)] +-- > +-- > valuePairToCondition :: (ProjectType, Int) -> QueryBuilder "projects" +-- > valuePairToCondition (projectType, participants) = +-- > query @Project +-- > |> filterWhere (#projectType, projectType) +-- > |> filterWhere (#participants, participants) +-- > +-- > theQuery = queryOrList (map valuePairToCondition values) +-- > +-- > projects <- fetch theQuery +-- > render IndexView { .. } +queryUnionList :: forall table. (Table (GetModelByTableName table), KnownSymbol table, GetTableName (GetModelByTableName table) ~ table) => [QueryBuilder table] -> QueryBuilder table +queryUnionList [] = FilterByQueryBuilder { queryBuilder = query @(GetModelByTableName table) @table, queryFilter = ("id", NotEqOp, Plain "id"), applyLeft = Nothing, applyRight = Nothing } +queryUnionList (firstQueryBuilder:secondQueryBuilder:[]) = UnionQueryBuilder { firstQueryBuilder, secondQueryBuilder } +queryUnionList (firstQueryBuilder:rest) = UnionQueryBuilder { firstQueryBuilder, secondQueryBuilder = queryUnionList @table rest } + -- | Adds an @a OR b@ condition --