module Fog::VcloudDirector::Query

Public Instance Methods

find_by_query(options={}) click to toggle source
# File lib/fog/vcloud_director/query.rb, line 6
def find_by_query(options={})
  type = options.fetch(:type) { self.query_type }

  results = get_all_results(type, options)
  data = results.map do |query_record|
    model_data = {}
    model_data[:id] = query_record[:href].split('/').last
    model_data[:name] = query_record.fetch(:name) if query_record.key?(:name)
    if self.methods.include?(:populate_model_from_query_record)
      model_data.merge(self.populate_model_from_query_record(query_record))
    else
      model_data
    end
  end
  load(data)
end

Private Instance Methods

get_all_results(type, options) click to toggle source
# File lib/fog/vcloud_director/query.rb, line 25
def get_all_results(type, options)
  results = []
  if options.key?(:page)
    page_range = [ Integer(options[:page]) ]
  else
    page_range = (1..get_num_pages(type, options))
  end
  page_range.each do |page|
    results += get_results_page(page, type, options) || []
  end
  results
end
get_num_pages(type, options) click to toggle source
# File lib/fog/vcloud_director/query.rb, line 38
def get_num_pages(type, options)
  body = service.get_execute_query(type, options)
  last_page = body[:lastPage] || 1
  raise "Invalid lastPage (#{last_page}) in query results" unless last_page.is_a? Integer
  last_page.to_i
end
get_results_page(page, type, options) click to toggle source
# File lib/fog/vcloud_director/query.rb, line 45
def get_results_page(page, type, options)
  body = service.get_execute_query(type, options.merge({:page=>page})).body

  record_key = key_of_first_record_or_reference(body)
  body[record_key] = [body[record_key]] if body[record_key].is_a?(Hash)
  body[record_key]
end
key_of_first_record_or_reference(body) click to toggle source
# File lib/fog/vcloud_director/query.rb, line 53
def key_of_first_record_or_reference(body)
  body.keys.detect { |key| key.to_s =~ /Record|Reference$/ }
end