Skip to content

Instantly share code, notes, and snippets.

@rhys-vdw
Last active March 8, 2016 16:07
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rhys-vdw/d4b403969eda377c0eef to your computer and use it in GitHub Desktop.
Save rhys-vdw/d4b403969eda377c0eef to your computer and use it in GitHub Desktop.
Poor man's knex/bookshelf pagination
Promise = require 'bluebird'
defaultPageSize = 20
paginate = (knex) -> (query, paginationOptions, options) ->
if query.fetchAll?
model = query
query = model.query()
# Store original query.
totalQuery = knex.count().from query.clone().as 'inner'
totalPromise = totalQuery.then (rows) -> rows[0].count
# Extract options
{ page, pageSize, offset, limit } = paginationOptions
# Set defaults
pageSize ?= defaultPageSize
offset ?= 0
page = 1 if not page? or page < 1
# Update vars based on interplay between limit/offset and pagination.
page += offset // pageSize
# Calculate actual limit and offset to be used in query. (Note that the
# natural concept of a page starts from 1 rather than 0.)
limit = limit ? pageSize
offset += (page - 1) * pageSize
query.offset offset
query.limit limit if limit > 0
return Promise.all([
model?.fetchAll(options) or query
totalPromise
]).spread (data, total) -> {
pagination: {
total, pageSize, offset, limit, page,
pageCount: Math.ceil(total / pageSize)
},
data
}
module.exports = paginate
@jamesdixon
Copy link

Is this still your preferred pagination method? Looking into implementing something on my side.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment