class MongoidPagingToken::PagingToken

Attributes

criteria[R]

Public Class Methods

new(criteria) click to toggle source
# File lib/mongoid_paging_token/paging_token.rb, line 5
def initialize(criteria)
  @criteria = criteria
end

Public Instance Methods

can_page?() click to toggle source
# File lib/mongoid_paging_token/paging_token.rb, line 21
def can_page?
  !!(sorts && limit) && limit > 0 && limit == entries.size
end
next_page_criteria() click to toggle source
# File lib/mongoid_paging_token/paging_token.rb, line 9
def next_page_criteria
  if sorts.keys.size > 2
    raise NotImplementedError, 'paging not supported for more than two sorted fields'
  end
  
  if one_field_sort?
    one_field_sort_criteria
  else
    two_field_sort_criteria
  end
end
to_s() click to toggle source
# File lib/mongoid_paging_token/paging_token.rb, line 25
def to_s
  return nil unless can_page?
  CGI.escape(Base64.encode64(Marshal.dump(next_page_criteria)))
end

Private Instance Methods

entries() click to toggle source
# File lib/mongoid_paging_token/paging_token.rb, line 71
def entries
  criteria.options[:cache] = true unless criteria.options[:cache]
  criteria.entries
end
first_condition() click to toggle source
# File lib/mongoid_paging_token/paging_token.rb, line 88
def first_condition
  first_condition_value.nil? ?
    { first_condition => { first_field  => { '$ne' => first_value } } } :
    { first_condition_field => { first_condition_operator => first_condition_value } }
end
first_condition_field() click to toggle source
# File lib/mongoid_paging_token/paging_token.rb, line 76
def first_condition_field
  sorts.keys.first
end
first_condition_operator() click to toggle source
# File lib/mongoid_paging_token/paging_token.rb, line 80
def first_condition_operator
  sorts.values.first == 1 ? '$gt' : '$lt'
end
first_condition_value() click to toggle source
# File lib/mongoid_paging_token/paging_token.rb, line 84
def first_condition_value
  entries.last[first_condition_field]
end
last_condition() click to toggle source
# File lib/mongoid_paging_token/paging_token.rb, line 106
def last_condition
  { first_condition_field => first_condition_value,
    last_condition_field  => { last_condition_operator => last_condition_value } }
end
last_condition_field() click to toggle source
# File lib/mongoid_paging_token/paging_token.rb, line 94
def last_condition_field
  sorts.keys.last
end
last_condition_operator() click to toggle source
# File lib/mongoid_paging_token/paging_token.rb, line 98
def last_condition_operator
  sorts.values.last == 1 ? '$gt' : '$lt'
end
last_condition_value() click to toggle source
# File lib/mongoid_paging_token/paging_token.rb, line 102
def last_condition_value
  entries.last[last_condition_field]
end
limit() click to toggle source
# File lib/mongoid_paging_token/paging_token.rb, line 67
def limit
  criteria.options[:limit]
end
one_field_sort?() click to toggle source
# File lib/mongoid_paging_token/paging_token.rb, line 111
def one_field_sort?
  sorts.keys.size == 1
end
one_field_sort_criteria() click to toggle source
# File lib/mongoid_paging_token/paging_token.rb, line 32
def one_field_sort_criteria
  if criteria.selector[first_condition_field]
    if criteria.selector[first_condition_field].keys.size > 1
      criteria.selector[first_condition_field].delete(first_condition_operator)
    else
      criteria.selector.delete(first_condition_field)
    end
  end

  criteria.where(first_condition)
end
sorts() click to toggle source
# File lib/mongoid_paging_token/paging_token.rb, line 63
def sorts
  criteria.options[:sort]
end
two_field_sort_criteria() click to toggle source
# File lib/mongoid_paging_token/paging_token.rb, line 44
def two_field_sort_criteria
  while (conditions = criteria.selector['$or'])
    match = conditions.any? do |c| 
      c[first_condition_field] && 
        c[first_condition_field].is_a?(Hash) &&
        c[first_condition_field].keys.first == first_condition[first_condition_field].keys.first
    end

    if match
      if conditions.any? { |c| c.keys == last_condition.keys }
        criteria.selector.delete('$or')
        break
      end
    end
  end

  criteria.any_of(first_condition, last_condition)
end