class OData::AbstractQuery::Options::OrderbyOption

Attributes

pairs[R]

Public Class Methods

applies_to?(query) click to toggle source
# File lib/o_data/abstract_query/options/orderby_option.rb, line 17
def self.applies_to?(query)
  return false if query.segments.empty?
  (query.segments.last.is_a?(OData::AbstractQuery::Segments::CollectionSegment) || query.segments.last.is_a?(OData::AbstractQuery::Segments::NavigationPropertySegment))
end
new(query, pairs = []) click to toggle source
Calls superclass method OData::AbstractQuery::Option::new
# File lib/o_data/abstract_query/options/orderby_option.rb, line 11
def initialize(query, pairs = [])
  @pairs = pairs
  
  super(query, self.class.option_name)
end
option_name() click to toggle source
# File lib/o_data/abstract_query/options/orderby_option.rb, line 5
def self.option_name
  '$orderby'
end
parse!(query, key, value = nil) click to toggle source
# File lib/o_data/abstract_query/options/orderby_option.rb, line 22
def self.parse!(query, key, value = nil)
  return nil unless key == self.option_name
  
  if query.segments.last.respond_to?(:navigation_property)
    navigation_property = query.segments.last.navigation_property
    
    raise OData::AbstractQuery::Errors::InvalidOptionValue.new(query, self.option_name) if navigation_property.to_end.polymorphic?
  end
  
  raise OData::AbstractQuery::Errors::InvalidOptionContext.new(query, self) unless query.segments.last.respond_to?(:countable?) && query.segments.last.countable?
  
  if query.segments.last.respond_to?(:entity_type)
    entity_type = query.segments.last.entity_type
    
    pairs = value.to_s.split(/\s*,\s*/).collect { |path|
      if md = path.match(/^([A-Za-z_]+(?:\/[A-Za-z_]+)*)(?:\s+(asc|desc))?$/)
        property_name = md[1]
        order = md[2].blank? ? :asc : md[2].to_sym

        property = entity_type.properties.find { |p| p.name == property_name }
        raise OData::AbstractQuery::Errors::PropertyNotFound.new(query, property_name) if property.blank?

        [property, order]
      else
        raise OData::AbstractQuery::Errors::PropertyNotFound.new(query, path)
      end
    }
    
    query.Option(self, pairs.empty? ? [[entity_type.key_property, :asc]] : pairs)
  else
    raise OData::AbstractQuery::Errors::InvalidOptionContext.new(query, self.option_name) unless value.blank?
  end
end

Public Instance Methods

entity_type() click to toggle source
# File lib/o_data/abstract_query/options/orderby_option.rb, line 56
def entity_type
  return nil if self.query.segments.empty?
  return nil unless self.query.segments.last.respond_to?(:entity_type)
  @entity_type ||= self.query.segments.last.entity_type
end
valid?() click to toggle source
# File lib/o_data/abstract_query/options/orderby_option.rb, line 62
def valid?
  entity_type = self.entity_type
  return false if entity_type.blank?
  
  @pairs.is_a?(Array) && @pairs.all? { |pair|
    property, value = pair
    
    property.is_a?(OData::AbstractSchema::Property) && !!entity_type.properties.find { |p| p.name == property.name }
  }
end
value() click to toggle source
# File lib/o_data/abstract_query/options/orderby_option.rb, line 73
def value
  "'" + @pairs.collect { |p| "#{p.first.name} #{p.last}" }.join(',') + "'"
end