class OData::AbstractQuery::Base

Attributes

options[R]
schema[R]
segments[R]

Public Class Methods

new(schema, segments = [], options = []) click to toggle source
# File lib/o_data/abstract_query/base.rb, line 7
def initialize(schema, segments = [], options = [])
  @schema = schema
  
  @segments = segments
  @options = options
end

Public Instance Methods

Option(*args) click to toggle source
# File lib/o_data/abstract_query/base.rb, line 33
def Option(*args)
  option_class = begin
    if args.first.is_a?(Symbol) || args.first.is_a?(String)
      "OData::AbstractQuery::Options::#{args.shift.to_s}Option".constantize
    else
      args.shift
    end
  end
  
  option = option_class.new(self, *args)
  
  @options << option
  option
end
Segment(*args) click to toggle source
# File lib/o_data/abstract_query/base.rb, line 18
def Segment(*args)
  segment_class = begin
    if args.first.is_a?(Symbol) || args.first.is_a?(String)
      "OData::AbstractQuery::Segments::#{args.shift.to_s}Segment".constantize
    else
      args.shift
    end
  end
  
  segment = segment_class.new(self, *args)
  
  @segments << segment
  segment
end
execute!() click to toggle source
# File lib/o_data/abstract_query/base.rb, line 60
def execute!
  _execute!
end
inspect() click to toggle source
# File lib/o_data/abstract_query/base.rb, line 14
def inspect
  "#<< #{@schema.namespace.to_s}(#{self.to_uri.inspect}) >>"
end
query_string() click to toggle source
# File lib/o_data/abstract_query/base.rb, line 52
def query_string
  @options.collect { |o| "#{o.key.to_s}=#{o.value.to_s}" }.join('&')
end
resource_path() click to toggle source
# File lib/o_data/abstract_query/base.rb, line 48
def resource_path
  @segments.collect(&:value).join('/')
end
to_uri() click to toggle source
# File lib/o_data/abstract_query/base.rb, line 56
def to_uri
  [resource_path, query_string].reject(&:blank?).join('?')
end

Protected Instance Methods

__execute!(seen, acc, head, rest) click to toggle source
# File lib/o_data/abstract_query/base.rb, line 81
def __execute!(seen, acc, head, rest)
  return acc if head.blank?
  raise Errors::InvalidSegmentContext.new(self, head) unless seen.empty? || head.can_follow?(seen.last)
  
  results = head.execute!(acc)
  raise Errors::ExecutionOfSegmentFailedValidation.new(self, head) unless head.valid?(results)

  seen << head
  __execute!(seen, results, rest.shift, rest)
end
_execute!() click to toggle source

def entity_type

return nil if @segments.empty?
return nil unless @segments.last.respond_to?(:entity_type)
@segments.last.entity_type

end

# File lib/o_data/abstract_query/base.rb, line 72
def _execute!
  _segments = [@segments].flatten.compact
  results = __execute!([], nil, _segments.shift, _segments)
  
  results = with_skip_and_top_options(with_orderby_option(results))
  
  results
end

Private Instance Methods

with_orderby_option(results) click to toggle source
# File lib/o_data/abstract_query/base.rb, line 94
def with_orderby_option(results)
  orderby_option = @options.find { |o| o.option_name == Options::OrderbyOption.option_name }
  
  orderby = orderby_option.blank? ? nil : orderby_option.pairs
  
  if orderby && (entity_type = orderby_option.entity_type)
    results = entity_type.sort(results, orderby)
  else
    results
  end
end
with_skip_and_top_options(results) click to toggle source
# File lib/o_data/abstract_query/base.rb, line 106
def with_skip_and_top_options(results)
  skip_option = @options.find { |o| o.option_name == Options::SkipOption.option_name }
  top_option = @options.find { |o| o.option_name == Options::TopOption.option_name }
  
  skip = skip_option.blank? ? nil : skip_option.value.to_i
  top = top_option.blank? ? nil : top_option.value.to_i
  
  if skip && top
    results = results.slice(skip, top)
  elsif skip
    results = results.slice(skip..-1)
  elsif top
    results = results.slice(0, top)
  else
    results
  end
end