diff --git a/IHP/Pagination/ControllerFunctions.hs b/IHP/Pagination/ControllerFunctions.hs index 49baf275b..83e92b668 100644 --- a/IHP/Pagination/ControllerFunctions.hs +++ b/IHP/Pagination/ControllerFunctions.hs @@ -15,18 +15,12 @@ module IHP.Pagination.ControllerFunctions import IHP.Prelude import IHP.Controller.Context import IHP.Controller.Param ( paramOrDefault, paramOrNothing ) - -import IHP.Pagination.Types - ( Options(..), Pagination(..) ) - -import IHP.QueryBuilder - ( HasQueryBuilder, filterWhereILike, limit, offset ) +import IHP.Pagination.Types ( Options(..), Pagination(..) ) +import IHP.QueryBuilder ( HasQueryBuilder, filterWhereILike, limit, offset ) import IHP.Fetch (fetchCount) - import IHP.ModelSupport (GetModelByTableName, sqlQuery, sqlQueryScalar, Table) -import Database.PostgreSQL.Simple.ToField (toField, Action) -import Database.PostgreSQL.Simple.Types (Query(Query)) +import Database.PostgreSQL.Simple (FromRow, ToRow, Query(..), Only(Only), (:.)(..)) -- | Paginate a query, with the following default options: -- @@ -179,12 +173,13 @@ defaultPaginationOptions = -- -- *AutoRefresh:* When using 'paginatedSqlQuery' with AutoRefresh, you need to use 'trackTableRead' to let AutoRefresh know that you have accessed a certain table. Otherwise AutoRefresh will not watch table of your custom sql query. paginatedSqlQuery - :: forall model - . ( FromRow model + :: forall r q + . ( FromRow r + , ToRow q , ?context :: ControllerContext , ?modelContext :: ModelContext ) - => ByteString -> [Action] -> IO ([model], Pagination) + => Query -> q -> IO ([r], Pagination) paginatedSqlQuery = paginatedSqlQueryWithOptions defaultPaginationOptions -- | Runs a raw sql query and adds pagination to it. @@ -202,14 +197,15 @@ paginatedSqlQuery = paginatedSqlQueryWithOptions defaultPaginationOptions -- -- *AutoRefresh:* When using 'paginatedSqlQuery' with AutoRefresh, you need to use 'trackTableRead' to let AutoRefresh know that you have accessed a certain table. Otherwise AutoRefresh will not watch table of your custom sql query. paginatedSqlQueryWithOptions - :: forall model - . ( FromRow model + :: forall r q + . ( FromRow r + , ToRow q , ?context :: ControllerContext , ?modelContext :: ModelContext ) - => Options -> ByteString -> [Action] -> IO ([model], Pagination) + => Options -> Query -> q -> IO ([r], Pagination) paginatedSqlQueryWithOptions options sql placeholders = do - count :: Int <- sqlQueryScalar (Query $ "SELECT count(subquery.*) FROM (" <> sql <> ") as subquery") placeholders + count :: Int <- sqlQueryScalar ("SELECT count(subquery.*) FROM (" <> sql <> ") as subquery") placeholders let pageSize = pageSize' options pagination = Pagination @@ -219,9 +215,9 @@ paginatedSqlQueryWithOptions options sql placeholders = do , window = windowSize options } - results :: [model] <- sqlQuery - (Query $ "SELECT subquery.* FROM (" <> sql <> ") as subquery LIMIT ? OFFSET ?") - (placeholders ++ map toField [pageSize, offset' pageSize page]) + results :: [r] <- sqlQuery + ("SELECT subquery.* FROM (" <> sql <> ") as subquery LIMIT ? OFFSET ?") + (placeholders :. Only pageSize :. Only (offset' pageSize page)) pure (results, pagination)