class OrderQuery::Space

Order specification and a scope

Attributes

columns[R]

@return [Array<OrderQuery::Column>]

Public Class Methods

new(base_scope, order_spec) click to toggle source

@param [ActiveRecord::Relation] base_scope @param [Array<Array<Symbol,String>>] order_spec @see Column#initialize for the order_spec element format.

# File lib/order_query/space.rb, line 15
def initialize(base_scope, order_spec)
  @base_scope = base_scope
  @columns = order_spec.map(&:clone)
  @columns.map! do |cond_spec|
    build_column(base_scope, cond_spec)
  end
  # add primary key if columns are not unique
  unless @columns.last.unique?
    if @columns.detect(&:unique?)
      fail ArgumentError, 'Unique column must be last'
    end

    @columns << Column.new(base_scope, base_scope.primary_key)
  end
  @order_by_sql = SQL::OrderBy.new(@columns)
end

Public Instance Methods

at(record) click to toggle source

@return [Point]

# File lib/order_query/space.rb, line 33
def at(record)
  Point.new(record, self)
end
first() click to toggle source

@return [ActiveRecord::Base]

# File lib/order_query/space.rb, line 49
def first
  scope.first
end
inspect() click to toggle source
# File lib/order_query/space.rb, line 58
def inspect
  "#<OrderQuery::Space @columns=#{@columns.inspect} "\
  "@base_scope=#{@base_scope.inspect}>"
end
last() click to toggle source

@return [ActiveRecord::Base]

# File lib/order_query/space.rb, line 54
def last
  scope_reverse.first
end
scope() click to toggle source

@return [ActiveRecord::Relation] scope ordered by columns

# File lib/order_query/space.rb, line 38
def scope
  @scope ||= @base_scope.order(Arel.sql(@order_by_sql.build))
end
scope_reverse() click to toggle source

@return [ActiveRecord::Relation] scope ordered by columns in reverse

# File lib/order_query/space.rb, line 43
def scope_reverse
  @scope_reverse ||= @base_scope
                     .order(Arel.sql(@order_by_sql.build_reverse))
end

Private Instance Methods

build_column(base_scope, cond_spec) click to toggle source
# File lib/order_query/space.rb, line 65
def build_column(base_scope, cond_spec)
  column_spec = cond_spec.last.is_a?(Hash) ? cond_spec : cond_spec.push({})
  attr_name, *vals_and_or_dir, options = column_spec
  Column.new(base_scope, attr_name, *vals_and_or_dir, **options)
end