class Sequel::SeekPagination::OrderedColumnSet

Attributes

include_exact_match[R]
not_null[R]
orders[R]

Public Class Methods

new(order_values, include_exact_match:, not_null:) click to toggle source
# File lib/sequel/extensions/seek_pagination.rb, line 111
def initialize(order_values, include_exact_match:, not_null:)
  @not_null = not_null
  @include_exact_match = include_exact_match
  @orders = order_values.map { |order, value| OrderedColumn.new(self, order, value) }
end

Public Instance Methods

build_conditions() click to toggle source
# File lib/sequel/extensions/seek_pagination.rb, line 117
def build_conditions
  length = orders.length

  # Handle the common case where we can do a simpler (and faster)
  # WHERE (non_nullable_1, non_nullable_2) > (1, 2) clause.
  if length > 1 && orders.all?(&:not_null) && has_uniform_order_direction?
    Sequel.virtual_row do |o|
      o.__send__(
        orders.first.inequality_method(include_exact_match),
        orders.map(&:name),
        orders.map(&:value)
      )
    end
  else
    Sequel.&(
      *length.times.map { |i|
        allow_equal = include_exact_match || i != (length - 1)
        conditions = orders[0..i]

        if i.zero?
          conditions[0].inequality_condition(allow_equal: allow_equal)
        else
          c = conditions[-2]

          list = if filter = conditions[-1].inequality_condition(allow_equal: allow_equal)
                   [Sequel.&(c.eq_filter, filter)]
                 else
                   [c.eq_filter]
                 end

          list += conditions[0..-2].map { |c| c.inequality_condition(allow_equal: false) }

          Sequel.|(*list.compact)
        end
      }.compact
    )
  end
end

Private Instance Methods

has_uniform_order_direction?() click to toggle source
# File lib/sequel/extensions/seek_pagination.rb, line 158
def has_uniform_order_direction?
  direction = nil
  orders.each do |order|
    direction ||= order.direction
    return false unless direction == order.direction
  end
  true
end