Class: OrderQuery::OrderSpace

Inherits:
Object
  • Object
show all
Defined in:
lib/order_query/order_space.rb

Overview

Combine order specification with a scope

Constant Summary collapse

SORT_DIRECTIONS =
[:asc, :desc].freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(scope, order_spec) ⇒ OrderSpace

Returns a new instance of OrderSpace.

Parameters:

  • scope (ActiveRecord::Relation)
  • order_spec (Array<Array<Symbol,String>>)


9
10
11
12
# File 'lib/order_query/order_space.rb', line 9

def initialize(scope, order_spec)
  @scope = scope
  @conditions = order_spec.map { |spec| OrderCondition.new(scope, spec) }
end

Instance Attribute Details

#conditionsObject (readonly)

Returns the value of attribute conditions.



5
6
7
# File 'lib/order_query/order_space.rb', line 5

def conditions
  @conditions
end

Instance Method Details

#join_order_by_clauses(clauses) ⇒ Object

Parameters:

  • clauses (Array<String>)


70
71
72
# File 'lib/order_query/order_space.rb', line 70

def join_order_by_clauses(clauses)
  clauses.join(', ').freeze
end

#order_by_reverse_sqlString

Returns:

  • (String)


60
61
62
# File 'lib/order_query/order_space.rb', line 60

def order_by_reverse_sql
  join_order_by_clauses order_by_reverse_sql_clauses
end

#order_by_reverse_sql_clausesArray<String>

Returns:

  • (Array<String>)


52
53
54
55
56
57
# File 'lib/order_query/order_space.rb', line 52

def order_by_reverse_sql_clauses
  swap = {'DESC' => 'ASC', 'ASC' => 'DESC'}
  order_by_sql_clauses.map { |s|
    s.gsub(/DESC|ASC/) { |m| swap[m] }
  }
end

#order_by_sqlString

Returns:

  • (String)


65
66
67
# File 'lib/order_query/order_space.rb', line 65

def order_by_sql
  join_order_by_clauses order_by_sql_clauses
end

#order_by_sql_clausesArray<String>

Returns:

  • (Array<String>)


36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/order_query/order_space.rb', line 36

def order_by_sql_clauses
  conditions.map { |cond|
    case order_spec = cond.order
      when Symbol
        "#{cond.col_name_sql} #{sort_direction_sql order_spec}".freeze
      when Enumerable
        order_spec.map { |v|
          "#{cond.col_name_sql}=#{@scope.connection.quote v} #{cond.order_order.to_s.upcase}"
        }.join(', ').freeze
      else
        raise ArgumentError.new("Invalid order #{order_spec.inspect} (#{cond.inspect})")
    end
  }
end

#reverse_scopeActiveRecord::Relation

Returns:

  • (ActiveRecord::Relation)


20
21
22
# File 'lib/order_query/order_space.rb', line 20

def reverse_scope
  @scope.order(order_by_reverse_sql)
end

#scopeActiveRecord::Relation

Returns:

  • (ActiveRecord::Relation)


15
16
17
# File 'lib/order_query/order_space.rb', line 15

def scope
  @scope.order(order_by_sql)
end

#sort_direction_sql(direction) ⇒ String

Returns:

  • (String)


27
28
29
30
31
32
33
# File 'lib/order_query/order_space.rb', line 27

def sort_direction_sql(direction)
  if SORT_DIRECTIONS.include?(direction)
    direction.to_s.upcase.freeze
  else
    raise ArgumentError.new("sort direction must be in #{SORT_DIRECTIONS.map(&:inspect).join(', ')}, is #{direction.inspect}")
  end
end