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