diff --git a/Sources/FluentKit/Database/Database.swift b/Sources/FluentKit/Database/Database.swift index b49585ac..323920d5 100644 --- a/Sources/FluentKit/Database/Database.swift +++ b/Sources/FluentKit/Database/Database.swift @@ -45,6 +45,10 @@ extension Database { public var history: QueryHistory? { self.context.history } + + public var pageSizeLimit: Int? { + self.context.pageSizeLimit + } } public protocol DatabaseDriver { @@ -62,17 +66,20 @@ public struct DatabaseContext { public let logger: Logger public let eventLoop: EventLoop public let history: QueryHistory? + public let pageSizeLimit: Int? public init( configuration: DatabaseConfiguration, logger: Logger, eventLoop: EventLoop, - history: QueryHistory? = nil + history: QueryHistory? = nil, + pageSizeLimit: Int? = nil ) { self.configuration = configuration self.logger = logger self.eventLoop = eventLoop self.history = history + self.pageSizeLimit = pageSizeLimit } } diff --git a/Sources/FluentKit/Database/Databases.swift b/Sources/FluentKit/Database/Databases.swift index cab7dcfb..7f814714 100644 --- a/Sources/FluentKit/Database/Databases.swift +++ b/Sources/FluentKit/Database/Databases.swift @@ -98,7 +98,8 @@ public final class Databases { _ id: DatabaseID? = nil, logger: Logger, on eventLoop: EventLoop, - history: QueryHistory? = nil + history: QueryHistory? = nil, + pageSizeLimit: Int? = nil ) -> Database? { self.lock.lock() defer { self.lock.unlock() } @@ -110,7 +111,8 @@ public final class Databases { configuration: configuration, logger: logger, eventLoop: eventLoop, - history: history + history: history, + pageSizeLimit: pageSizeLimit ) let driver: DatabaseDriver if let existing = self.drivers[id] { diff --git a/Sources/FluentKit/Query/Builder/QueryBuilder+Paginate.swift b/Sources/FluentKit/Query/Builder/QueryBuilder+Paginate.swift index 0d5d744b..944110ce 100644 --- a/Sources/FluentKit/Query/Builder/QueryBuilder+Paginate.swift +++ b/Sources/FluentKit/Query/Builder/QueryBuilder+Paginate.swift @@ -2,20 +2,28 @@ extension QueryBuilder { /// Returns a single `Page` out of the complete result set according to the supplied `PageRequest`. /// /// This method will first `count()` the result set, then request a subset of the results using `range()` and `all()`. + /// /// - Parameters: /// - request: Describes which page should be fetched. /// - Returns: A single `Page` of the result set containing the requested items and page metadata. public func paginate( _ request: PageRequest ) -> EventLoopFuture> { + let trimmedRequest: PageRequest = { + guard let pageSizeLimit = database.context.pageSizeLimit else { return request } + return .init( + page: request.page, + per: Swift.min(request.per, pageSizeLimit) + ) + }() let count = self.count() - let items = self.copy().range(request.start..