module OData::AbstractSchema::Comparable

Public Instance Methods

compare(a, b, property_order_pairs = []) click to toggle source
# File lib/o_data/abstract_schema/comparable.rb, line 4
def compare(a, b, property_order_pairs = [])
  _pairs = [] + property_order_pairs
  _compare(a, b, _pairs.shift, _pairs)
end
sort(many, property_order_pairs = []) click to toggle source
# File lib/o_data/abstract_schema/comparable.rb, line 9
def sort(many, property_order_pairs = [])
  [many].compact.flatten.sort { |a, b| compare(a, b, property_order_pairs) }
end

Protected Instance Methods

_compare(a, b, head, rest) click to toggle source
# File lib/o_data/abstract_schema/comparable.rb, line 15
def _compare(a, b, head, rest)
  return 0 if head.blank?

  property, asc_or_desc = head
  asc_or_desc ||= :asc

  if b.blank?
    (asc_or_desc == :asc) ? 1 : -1
  else
    a_value = property.value_for(a)
    b_value = property.value_for(b)

    if a_value.blank?
      (asc_or_desc == :asc) ? -1 : 1
    elsif b_value.blank?
      (asc_or_desc == :asc) ? 1 : -1
    elsif (c = a_value <=> b_value) != 0
      (asc_or_desc == :asc) ? c : c * -1
    else
      _compare(a, b, rest.shift, rest)
    end
  end
end