From 4fe8b56e5a8c5dcb394a16b0dfb5eb2d6f77b18f Mon Sep 17 00:00:00 2001 From: Marc Scholten Date: Fri, 21 Jun 2024 22:39:40 -0700 Subject: [PATCH 1/2] Added inline annotations for getQueryBuilder --- IHP/QueryBuilder.hs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/IHP/QueryBuilder.hs b/IHP/QueryBuilder.hs index f74e366e4..845e51e53 100644 --- a/IHP/QueryBuilder.hs +++ b/IHP/QueryBuilder.hs @@ -163,7 +163,8 @@ class HasQueryBuilder queryBuilderProvider joinRegister | queryBuilderProvider - getQueryBuilder :: queryBuilderProvider table -> QueryBuilder table injectQueryBuilder :: QueryBuilder table -> queryBuilderProvider table getQueryIndex :: queryBuilderProvider table -> Maybe ByteString - getQueryIndex _ = Nothing + getQueryIndex _ = Nothing + {-# INLINE getQueryIndex #-} -- Wrapper for QueryBuilders resulting from joins. Associates a joinRegister type. newtype JoinQueryBuilderWrapper joinRegister table = JoinQueryBuilderWrapper (QueryBuilder table) @@ -177,22 +178,31 @@ newtype LabeledQueryBuilderWrapper foreignTable indexColumn indexValue table = L -- QueryBuilders have query builders and the join register is empty. instance HasQueryBuilder QueryBuilder EmptyModelList where getQueryBuilder = id + {-# INLINE getQueryBuilder #-} injectQueryBuilder = id + {-# INLINE injectQueryBuilder #-} -- JoinQueryBuilderWrappers have query builders instance HasQueryBuilder (JoinQueryBuilderWrapper joinRegister) joinRegister where getQueryBuilder (JoinQueryBuilderWrapper queryBuilder) = queryBuilder + {-# INLINE getQueryBuilder #-} injectQueryBuilder = JoinQueryBuilderWrapper + {-# INLINE injectQueryBuilder #-} -- NoJoinQueryBuilderWrapper have query builders and the join register does not allow any joins instance HasQueryBuilder NoJoinQueryBuilderWrapper NoJoins where getQueryBuilder (NoJoinQueryBuilderWrapper queryBuilder) = queryBuilder + {-# INLINE getQueryBuilder #-} injectQueryBuilder = NoJoinQueryBuilderWrapper + {-# INLINE injectQueryBuilder #-} instance (KnownSymbol foreignTable, foreignModel ~ GetModelByTableName foreignTable , KnownSymbol indexColumn, HasField indexColumn foreignModel indexValue) => HasQueryBuilder (LabeledQueryBuilderWrapper foreignTable indexColumn indexValue) NoJoins where getQueryBuilder (LabeledQueryBuilderWrapper queryBuilder) = queryBuilder + {-# INLINE getQueryBuilder #-} injectQueryBuilder = LabeledQueryBuilderWrapper + {-# INLINE injectQueryBuilder #-} getQueryIndex _ = Just $ symbolToByteString @foreignTable <> "." <> (Text.encodeUtf8 . fieldNameToColumnName) (symbolToText @indexColumn) + {-# INLINE getQueryIndex #-} data QueryBuilder (table :: Symbol) = From d9fe4048f38812b887edf2614052d2116f0a8741 Mon Sep 17 00:00:00 2001 From: Marc Scholten Date: Sat, 22 Jun 2024 15:36:18 -0700 Subject: [PATCH 2/2] 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 --