class OData::AbstractQuery::Segments::NavigationPropertySegment

Attributes

navigation_property[R]

Public Class Methods

can_follow?(anOtherSegment) click to toggle source
# File lib/o_data/abstract_query/segments/navigation_property_segment.rb, line 44
def self.can_follow?(anOtherSegment)
  if anOtherSegment.is_a?(Class)
    anOtherSegment == CollectionSegment || anOtherSegment == NavigationPropertySegment
  else
    (anOtherSegment.is_a?(CollectionSegment) || anOtherSegment.is_a?(NavigationPropertySegment)) && !anOtherSegment.countable?
  end
end
new(query, from_entity_type, to_entity_type, navigation_property, key_values = {}) click to toggle source
# File lib/o_data/abstract_query/segments/navigation_property_segment.rb, line 37
def initialize(query, from_entity_type, to_entity_type, navigation_property, key_values = {})
  @from_entity_type = from_entity_type
  @navigation_property = navigation_property

  super(query, to_entity_type, key_values)
end
parse!(query, str) click to toggle source
# File lib/o_data/abstract_query/segments/navigation_property_segment.rb, line 5
def self.parse!(query, str)
  return nil if query.segments.empty?
  return nil unless query.segments.last.respond_to?(:entity_type)
  entity_type = query.segments.last.entity_type
  return nil if entity_type.blank?

  schema_object_name, key_values, keys = extract_schema_object_name_and_key_values_and_keys(str)
  return nil if schema_object_name.blank?

  navigation_property = entity_type.navigation_properties.find { |np| np.name == schema_object_name }
  return nil if navigation_property.blank?

  if navigation_property.to_end.polymorphic?
    raise OData::AbstractQuery::Errors::AbstractQueryKeyValueException.new(query, key_values.keys.first, key_values.values.first) unless key_values.empty?
    raise OData::AbstractQuery::Errors::AbstractQueryKeyValueException.new(query, '$polymorphic#Key', keys.first) unless keys.empty?

    query.Segment(self, entity_type, navigation_property.to_end.return_type, navigation_property, {})
  else
    sanitized_key_values = sanitize_key_values_and_keys_for!(query, navigation_property.to_end.entity_type, key_values, keys)
    
    unless sanitized_key_values.empty?
      raise OData::AbstractQuery::Errors::AbstractQueryKeyValueException.new(query, sanitized_key_values.keys.first, sanitized_key_values.values.first) unless navigation_property.to_end.multiple?
    end

    query.Segment(self, entity_type, navigation_property.to_end.entity_type, navigation_property, sanitized_key_values)
  end
end

Public Instance Methods

countable?() click to toggle source
# File lib/o_data/abstract_query/segments/navigation_property_segment.rb, line 52
def countable?
  multiple? && super
end
execute!(acc) click to toggle source
# File lib/o_data/abstract_query/segments/navigation_property_segment.rb, line 56
def execute!(acc)
  [acc].flatten.compact.collect { |one|
    if key?
      @navigation_property.find_one(one, key_property_value)
    else
      @navigation_property.find_all(one, @key_values)
    end
  }.first
end
multiple?() click to toggle source
# File lib/o_data/abstract_query/segments/navigation_property_segment.rb, line 66
def multiple?
  @navigation_property.to_end.multiple?
end
value() click to toggle source
# File lib/o_data/abstract_query/segments/navigation_property_segment.rb, line 70
def value
  if self.key_values.blank? || !multiple?
    @navigation_property.name
  elsif key?
    @navigation_property.name + '(' + key_property_value.to_s + ')'
  else
    @navigation_property.name + '(' + self.key_values.collect { |key, value| "#{key}=#{value}" }.join(',') + ')'
  end
end