class OData::AbstractQuery::Segments::EntityTypeAndKeyValuesSegment

Attributes

key_values[R]

Public Class Methods

extract_schema_object_name_and_key_values_and_keys(str) click to toggle source
# File lib/o_data/abstract_query/segments/entity_type_and_key_values_segment.rb, line 9
def self.extract_schema_object_name_and_key_values_and_keys(str)
  if md1 = str.to_s.match(/^([^\(]+)(?:\(([^\)]+)\)|\(\s*\))?$/)
    schema_object_name = md1[1]
    key_values = {}
    keys = []

    if key_values_string = md1[2]
      key_values_string.split(/\s*,\s*/).each do |key_value_pair|
        key, value = key_value_pair.split('=', 2)

        if value
          key_values[key.to_sym] = remove_quotes(value)
        else
          keys << remove_quotes(key)
        end
      end
    end

    [schema_object_name, key_values, keys]
  else
    nil
  end
end
key?(entity_type, key_values = {}) click to toggle source
# File lib/o_data/abstract_query/segments/entity_type_and_key_values_segment.rb, line 98
def self.key?(entity_type, key_values = {})
  !!key_property_value_for(entity_type, key_values)
end
key_property_value_for(entity_type, key_values = {}) click to toggle source
# File lib/o_data/abstract_query/segments/entity_type_and_key_values_segment.rb, line 102
def self.key_property_value_for(entity_type, key_values = {})
  return nil if entity_type.blank?

  return nil if key_values.blank?
  return nil unless key_values.size == 1

  key_property = entity_type.key_property
  return nil if key_property.blank?

  key_values[key_property.name.to_sym]
end
new(query, entity_type, key_values = {}) click to toggle source
Calls superclass method
# File lib/o_data/abstract_query/segments/entity_type_and_key_values_segment.rb, line 58
def initialize(query, entity_type, key_values = {})
  @key_values = key_values

  super(query, entity_type)
end
remove_quotes(str) click to toggle source
# File lib/o_data/abstract_query/segments/entity_type_and_key_values_segment.rb, line 5
def self.remove_quotes(str)
  str.to_s.sub(/^\'(.*?)\'$/, '\1')
end
sanitize_key_values_and_keys_for!(query, entity_type, key_values = {}, keys = []) click to toggle source
# File lib/o_data/abstract_query/segments/entity_type_and_key_values_segment.rb, line 33
def self.sanitize_key_values_and_keys_for!(query, entity_type, key_values = {}, keys = [])
  key_property_name = entity_type.key_property.name

  sanitized_key_values = key_values.inject({}) { |acc, key_value_pair|
    key, value = key_value_pair

    property = entity_type.properties.find { |p| p.name == key.to_s }
    raise OData::AbstractQuery::Errors::PropertyNotFound.new(query, key) if property.blank?
    
    raise OData::AbstractQuery::Errors::AbstractQueryKeyValueException.new(query, key, value) unless acc[key.to_sym].blank?

    acc[property.name.to_sym] = value
    acc
  }

  keys.inject(sanitized_key_values) { |acc, key_value| 
    raise OData::AbstractQuery::Errors::AbstractQueryKeyValueException.new(query, key_property_name, key_value) unless acc[key_property_name.to_sym].blank?
    
    acc[key_property_name.to_sym] = key_value
    acc
  }
end

Public Instance Methods

countable?() click to toggle source
# File lib/o_data/abstract_query/segments/entity_type_and_key_values_segment.rb, line 64
def countable?
  !key?
end
execute!(acc) click to toggle source
# File lib/o_data/abstract_query/segments/entity_type_and_key_values_segment.rb, line 68
def execute!(acc)
  return [] if self.entity_type.blank?

  if key?
    self.entity_type.find_one(key_property_value)
  else
    self.entity_type.find_all(@key_values)
  end
end
key?() click to toggle source
# File lib/o_data/abstract_query/segments/entity_type_and_key_values_segment.rb, line 78
def key?
  !self.entity_type.blank? && self.class.key?(self.entity_type, @key_values)
end
key_property_value() click to toggle source
# File lib/o_data/abstract_query/segments/entity_type_and_key_values_segment.rb, line 82
def key_property_value
  return nil if self.entity_type.blank?

  self.class.key_property_value_for(self.entity_type, @key_values)
end
value() click to toggle source
Calls superclass method
# File lib/o_data/abstract_query/segments/entity_type_and_key_values_segment.rb, line 88
def value
  if @key_values.blank?
    super
  elsif key?
    super + '(' + key_property_value.to_s + ')'
  else
    super + '(' + @key_values.collect { |key, value| "#{key}=#{value}" }.join(',') + ')'
  end
end