class CursorPager::LimitRelation

Applies first and last limits to a relation.

Attributes

base_relation[R]
first[R]
last[R]

Public Class Methods

new(base_relation, first, last) click to toggle source
# File lib/cursor_pager/limit_relation.rb, line 8
def initialize(base_relation, first, last)
  @base_relation = base_relation
  @first = first
  @last = last
end

Public Instance Methods

call() click to toggle source
# File lib/cursor_pager/limit_relation.rb, line 14
def call
  relation = base_relation

  relation = apply_first(relation) if first.present?
  relation = apply_last(relation) if last.present?

  relation
end

Private Instance Methods

apply_first(relation) click to toggle source

Apply first if it sets a stricter limit than the one already applied

# File lib/cursor_pager/limit_relation.rb, line 26
def apply_first(relation)
  previous_limit = relation.limit_value

  if previous_limit.nil? || previous_limit > first
    relation.limit(first)
  else
    relation
  end
end
apply_last(relation) click to toggle source

Apply last if it's a smaller slice than the previous limit

# File lib/cursor_pager/limit_relation.rb, line 37
def apply_last(relation)
  previous_limit = relation.limit_value

  if previous_limit.present?
    if last <= previous_limit
      relation = apply_stricter_last(relation, previous_limit)
    end
  else
    relation = apply_last_withouth_previous_limit(relation)
  end

  relation
end
apply_last_withouth_previous_limit(relation) click to toggle source
# File lib/cursor_pager/limit_relation.rb, line 57
def apply_last_withouth_previous_limit(relation)
  count = base_relation.size
  previous_offset = relation.offset_value || 0
  offset = previous_offset + count - [last, count].min

  relation.offset(offset).limit(last)
end
apply_stricter_last(relation, previous_limit) click to toggle source
# File lib/cursor_pager/limit_relation.rb, line 51
def apply_stricter_last(relation, previous_limit)
  offset = (relation.offset_value || 0) + (previous_limit - last)

  relation.offset(offset).limit(last)
end