class Sequel::SeekPagination::OrderedColumn

Attributes

direction[R]
name[R]
not_null[R]
nulls[R]
value[R]

Public Class Methods

new(set, order, value) click to toggle source
# File lib/sequel/extensions/seek_pagination.rb, line 171
def initialize(set, order, value)
  @set = set
  @value = value
  @name, @direction, @nulls =
    case order
    when Sequel::SQL::OrderedExpression
      direction = order.descending ? :desc : :asc
      nulls = order.nulls || default_nulls_option(direction)
      [order.expression, direction, nulls]
    else
      [order, :asc, :last]
    end

  @not_null = set.not_null.include?(@name)
end

Public Instance Methods

eq_filter() click to toggle source
# File lib/sequel/extensions/seek_pagination.rb, line 191
def eq_filter
  {name => value}
end
inequality_condition(allow_equal:) click to toggle source
# File lib/sequel/extensions/seek_pagination.rb, line 199
def inequality_condition(allow_equal:)
  nulls_upcoming = !not_null && nulls == :last

  if value.nil?
    if nulls_upcoming && allow_equal
      null_filter
    elsif !nulls_upcoming && !allow_equal
      Sequel.~(null_filter)
    else
      # No condition necessary.
      nil
    end
  else
    # Value is not null.
    filter = Sequel.virtual_row { |o| o.__send__(inequality_method(allow_equal), name, value) }

    if nulls_upcoming
      Sequel.|(filter, null_filter)
    else
      filter
    end
  end
end
inequality_method(allow_equal) click to toggle source
# File lib/sequel/extensions/seek_pagination.rb, line 223
def inequality_method(allow_equal)
  case direction
  when :asc  then allow_equal ? :>= : :>
  when :desc then allow_equal ? :<= : :<
  else raise "Bad direction: #{direction.inspect}"
  end
end
null_filter() click to toggle source
# File lib/sequel/extensions/seek_pagination.rb, line 195
def null_filter
  {name => nil}
end
nulls_option_is_default?() click to toggle source
# File lib/sequel/extensions/seek_pagination.rb, line 187
def nulls_option_is_default?
  nulls == default_nulls_option(direction)
end

Private Instance Methods

default_nulls_option(direction) click to toggle source

By default, Postgres sorts NULLs as higher than any other value. So we can treat a plain column ASC as column ASC NULLS LAST, and a plain column DESC as column DESC NULLS FIRST.

# File lib/sequel/extensions/seek_pagination.rb, line 236
def default_nulls_option(direction)
  case direction
  when :asc  then :last
  when :desc then :first
  else raise "Bad direction: #{direction.inspect}"
  end
end