class JSONAPI::Consumer::Query::Builder

Attributes

klass[R]
requestor[R]

Public Class Methods

new(klass, requestor = nil) click to toggle source
# File lib/jsonapi/consumer/query/builder.rb, line 8
def initialize(klass, requestor = nil)
  @klass = klass
  @requestor = requestor || klass.requestor
  @primary_key = nil
  @pagination_params = {}
  @path_params = {}
  @additional_params = {}
  @filters = {}
  @includes = []
  @orders = []
  @fields = []
end

Public Instance Methods

all()
Alias for: to_a
build() click to toggle source
# File lib/jsonapi/consumer/query/builder.rb, line 73
def build
  klass.new(params)
end
find(args = {}) click to toggle source
# File lib/jsonapi/consumer/query/builder.rb, line 93
def find(args = {})
  case args
  when Hash
    where(args)
  else
    @primary_key = args
  end

  requestor.get(params)
end
first() click to toggle source
# File lib/jsonapi/consumer/query/builder.rb, line 65
def first
  paginate(page: 1, per_page: 1).to_a.first
end
includes(*tables) click to toggle source
# File lib/jsonapi/consumer/query/builder.rb, line 33
def includes(*tables)
  @includes += parse_related_links(*tables)
  self
end
last() click to toggle source
# File lib/jsonapi/consumer/query/builder.rb, line 69
def last
  paginate(page: 1, per_page: 1).pages.last.to_a.last
end
method_missing(method_name, *args, &block) click to toggle source
# File lib/jsonapi/consumer/query/builder.rb, line 104
def method_missing(method_name, *args, &block)
  to_a.send(method_name, *args, &block)
end
order(*args) click to toggle source
# File lib/jsonapi/consumer/query/builder.rb, line 28
def order(*args)
  @orders += parse_orders(*args)
  self
end
page(number) click to toggle source
# File lib/jsonapi/consumer/query/builder.rb, line 50
def page(number)
  @pagination_params[ klass.paginator.page_param ] = number
  self
end
paginate(conditions = {}) click to toggle source
# File lib/jsonapi/consumer/query/builder.rb, line 43
def paginate(conditions = {})
  scope = self
  scope = scope.page(conditions[:page]) if conditions[:page]
  scope = scope.per(conditions[:per_page]) if conditions[:per_page]
  scope
end
params() click to toggle source
# File lib/jsonapi/consumer/query/builder.rb, line 77
def params
  filter_params
    .merge(pagination_params)
    .merge(includes_params)
    .merge(order_params)
    .merge(select_params)
    .merge(primary_key_params)
    .merge(path_params)
    .merge(additional_params)
end
per(size) click to toggle source
# File lib/jsonapi/consumer/query/builder.rb, line 55
def per(size)
  @pagination_params[ klass.paginator.per_page_param ] = size
  self
end
select(*fields) click to toggle source
# File lib/jsonapi/consumer/query/builder.rb, line 38
def select(*fields)
  @fields += parse_fields(*fields)
  self
end
to_a() click to toggle source
# File lib/jsonapi/consumer/query/builder.rb, line 88
def to_a
  @to_a ||= find
end
Also aliased as: all
where(conditions = {}) click to toggle source
# File lib/jsonapi/consumer/query/builder.rb, line 21
def where(conditions = {})
  # pull out any path params here
  @path_params.merge!(conditions.slice(*klass.prefix_params))
  @filters.merge!(conditions.except(*klass.prefix_params))
  self
end
with_params(more_params) click to toggle source
# File lib/jsonapi/consumer/query/builder.rb, line 60
def with_params(more_params)
  @additional_params.merge!(more_params)
  self
end

Private Instance Methods

additional_params() click to toggle source
# File lib/jsonapi/consumer/query/builder.rb, line 114
def additional_params
  @additional_params
end
filter_params() click to toggle source
# File lib/jsonapi/consumer/query/builder.rb, line 134
def filter_params
  @filters.empty? ? {} : {filter: @filters}
end
includes_params() click to toggle source
# File lib/jsonapi/consumer/query/builder.rb, line 130
def includes_params
  @includes.empty? ? {} : {include: @includes.join(",")}
end
order_params() click to toggle source
# File lib/jsonapi/consumer/query/builder.rb, line 138
def order_params
  @orders.empty? ? {} : {sort: @orders.join(",")}
end
pagination_params() click to toggle source
# File lib/jsonapi/consumer/query/builder.rb, line 126
def pagination_params
  @pagination_params.empty? ? {} : {page: @pagination_params}
end
parse_fields(*fields) click to toggle source
# File lib/jsonapi/consumer/query/builder.rb, line 195
def parse_fields(*fields)
  fields = fields.split(',') if fields.is_a? String
  fields.map do |field|
    case field
    when Hash
      field.each do |k,v|
        field[k] = parse_fields(v)
      end
      field
    else
      Array(field).flatten.map { |i| i.to_s.split(",") }.flatten.map(&:strip)
    end
  end.flatten
end
parse_orders(*args) click to toggle source
# File lib/jsonapi/consumer/query/builder.rb, line 181
def parse_orders(*args)
  args.map do |arg|
    case arg
    when Hash
      arg.map do |k, v|
        operator = (v == :desc ? "-" : "")
        "#{operator}#{k}"
      end
    else
      "#{arg}"
    end
  end.flatten
end
path_params() click to toggle source
# File lib/jsonapi/consumer/query/builder.rb, line 110
def path_params
  @path_params.empty? ? {} : {path: @path_params}
end
primary_key_params() click to toggle source
# File lib/jsonapi/consumer/query/builder.rb, line 118
def primary_key_params
  return {} unless @primary_key

  @primary_key.is_a?(Array) ?
    {klass.primary_key.to_s.pluralize.to_sym => @primary_key.join(",")} :
    {klass.primary_key => @primary_key}
end
select_params() click to toggle source
# File lib/jsonapi/consumer/query/builder.rb, line 142
def select_params
  if @fields.empty?
    {}
  else
    field_result = Hash.new { |h,k| h[k] = [] }
    @fields.each do |field|
      if field.is_a? Hash
        field.each do |k,v|
          field_result[k.to_s] << v
          field_result[k.to_s] = field_result[k.to_s].flatten
        end
      else
        field_result[klass.table_name] << field
      end
    end
    field_result.each { |k,v| field_result[k] = v.join(',') }
    {fields: field_result}
  end
end