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