Class: ActiveSet::Sorting::EnumerableStrategy

Inherits:
Object
  • Object
show all
Defined in:
lib/active_set/sorting/enumerable_strategy.rb

Instance Method Summary collapse

Constructor Details

#initialize(set, attribute_instructions) ⇒ EnumerableStrategy

Returns a new instance of EnumerableStrategy.



8
9
10
11
# File 'lib/active_set/sorting/enumerable_strategy.rb', line 8

def initialize(set, attribute_instructions)
  @set = set
  @attribute_instructions = attribute_instructions
end

Instance Method Details

#case_insensitive?(instruction, _value) ⇒ Boolean

Returns:

  • (Boolean)


45
46
47
# File 'lib/active_set/sorting/enumerable_strategy.rb', line 45

def case_insensitive?(instruction, _value)
  instruction.operator.to_s.casecmp('i').zero?
end

#direction_multiplier(direction) ⇒ Object



49
50
51
52
53
# File 'lib/active_set/sorting/enumerable_strategy.rb', line 49

def direction_multiplier(direction)
  return -1 if direction.to_s.downcase.start_with? 'desc'

  1
end

#executeObject



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/active_set/sorting/enumerable_strategy.rb', line 13

def execute
  # http://brandon.dimcheff.com/2009/11/18/rubys-sort-vs-sort-by/
  @set.sort_by do |item|
    @attribute_instructions.map do |instruction|
      value_for_comparison = sortable_numeric_for(instruction, item)
      direction_multiplier = direction_multiplier(instruction.value)

      # Force null values to be sorted as if larger than any non-null value
      # ASC => [-2, -1, 1, 2, nil]
      # DESC => [nil, 2, 1, -1, -2]
      if value_for_comparison.nil?
        [direction_multiplier, 0]
      else
        [0, value_for_comparison * direction_multiplier]
      end
    end
  end
end

#sortable_numeric_for(instruction, item) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/active_set/sorting/enumerable_strategy.rb', line 32

def sortable_numeric_for(instruction, item)
  value = instruction.value_for(item: item)
  if value.is_a?(String) || value.is_a?(Symbol)
    value = if case_insensitive?(instruction, value)
              value.to_s.downcase
            else
              value.to_s
            end
  end

  transform_to_sortable_numeric(value)
end