class Roaster::Query

Query represents the operation performed on the target, and its parameters

Constants

DEFAULT_PAGE_SIZE

TODO: Move in config class

OPERATIONS

Attributes

fields[RW]

TODO: This is not validating includes it seems (HARD VALIDATE EVERYTHING, raise is your FRIEND)

filters[RW]

TODO: This is not validating includes it seems (HARD VALIDATE EVERYTHING, raise is your FRIEND)

includes[RW]

TODO: This is not validating includes it seems (HARD VALIDATE EVERYTHING, raise is your FRIEND)

operation[RW]

TODO: This is not validating includes it seems (HARD VALIDATE EVERYTHING, raise is your FRIEND)

page[RW]

TODO: This is not validating includes it seems (HARD VALIDATE EVERYTHING, raise is your FRIEND)

page_size[RW]

TODO: This is not validating includes it seems (HARD VALIDATE EVERYTHING, raise is your FRIEND)

sorting[RW]

TODO: This is not validating includes it seems (HARD VALIDATE EVERYTHING, raise is your FRIEND)

target[RW]

TODO: This is not validating includes it seems (HARD VALIDATE EVERYTHING, raise is your FRIEND)

Public Class Methods

new(operation, target, mapping, params = {}) click to toggle source
# File lib/roaster/query.rb, line 33
def initialize(operation, target, mapping, params = {})
  raise "Invalid operation: #{operation}" unless OPERATIONS.include?(operation)
  params.symbolize_keys! if params.respond_to?(:symbolize_keys!)

  @operation = operation
  @target = target
  @page = params[:page] ? params[:page].to_i : 1
  @page_size = params[:page_size] ? params[:page_size].to_i : DEFAULT_PAGE_SIZE
  @includes = includes_from_params(params, mapping)
  @fields = fields_from_params(params, mapping)
  @filters = filters_from_params(params, mapping)
  @sorting = sorting_from_params(params, mapping)
  #VALIDATE THIS (TARGET) ! omgz =D
  @mapping = mapping
end

Public Instance Methods

default_page_size?() click to toggle source
# File lib/roaster/query.rb, line 49
def default_page_size?
  @page_size == DEFAULT_PAGE_SIZE
end
filters_as_url_params() click to toggle source
# File lib/roaster/query.rb, line 53
def filters_as_url_params
  @filters.sort.map { |k,v| map_filter_ids(k,v) }.join('&')
end
sorting_as_url_params() click to toggle source
# File lib/roaster/query.rb, line 57
def sorting_as_url_params
  sorting_values = sorting.map { |k, v| v == :asc ? k : "-#{k}" }.join(',')
  "sort=#{sorting_values}"
end

Private Instance Methods

fields_from_params(params, mapping) click to toggle source
# File lib/roaster/query.rb, line 78
def fields_from_params(params, mapping)
  return {} if params[:fields].blank?
  if params[:fields].class == Hash
    Hash[params[:fields].collect do |resource_name, fieldset|
        [resource_name.downcase.to_sym, parse_fieldset(fieldset)]
      end
    ]
  else
    {@target.resource_name => parse_fieldset(params[:fields])}
  end
end
filters_from_params(params, mapping) click to toggle source
# File lib/roaster/query.rb, line 90
def filters_from_params(params, mapping)
  filters = {}
  mapping.filterable_attributes.each do |filter|
    filters[filter] = params[filter] if params[filter]
  end
  filters
end
includes_from_params(params, mapping) click to toggle source
# File lib/roaster/query.rb, line 64
def includes_from_params(params, mapping)
  return [] unless params[:include] && params[:include].respond_to?(:split)
  includes = params[:include].split(',').map(&:to_sym)
  includes.select do |i|
    mapping.includeable_attributes.include?(i)
  end
end
map_filter_ids(key,value) click to toggle source
# File lib/roaster/query.rb, line 124
def map_filter_ids(key,value)
  case value
  when Hash
    value.map { |k,v| map_filter_ids(k,v) }
  else
     "#{key}=#{value.join(',')}"
  end
end
parse_fieldset(fields) click to toggle source
# File lib/roaster/query.rb, line 72
def parse_fieldset(fields)
  fields.to_s.split(',').collect do |field|
    field.downcase.to_sym
  end
end
parse_sort_criteria(criteria) click to toggle source
# File lib/roaster/query.rb, line 98
def parse_sort_criteria(criteria)
  sorting_parameters = {}
  criteria.to_s.split(',').each do |sort_value|
    sort_order = sort_value[0] == '-' ? :desc : :asc
    sort_value = sort_value.gsub(/\A\-/, '').downcase.to_sym
    sorting_parameters[sort_value] = sort_order
  end
  sorting_parameters
end
query_to_array(value) click to toggle source
# File lib/roaster/query.rb, line 133
def query_to_array(value)
  case value
    when String
      value.split(',')
    when Hash
      value.each { |k, v| value[k] = query_to_array(v) }
    else
      value
  end
end
sorting_from_params(params, mapping) click to toggle source
# File lib/roaster/query.rb, line 111
def sorting_from_params(params, mapping)
  return {} if params[:sort].blank? || mapping.sortable_attributes.blank?
  if params[:sort].class == Hash
    sorting_parameters = {}
    params[:sort].each do |sorting_resource|
      sorting_parameters[sorting_resource[0].to_sym] = parse_sort_criteria sorting_resource[1]
    end
    sorting_parameters
  else
    {@target.resource_name => parse_sort_criteria(params[:sort])}
  end
end
validate_sorting_parameters(sort, mapping) click to toggle source
# File lib/roaster/query.rb, line 108
def validate_sorting_parameters(sort, mapping)
end