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