class QueryInterface::Server::Transformations::SequelTransformer

Attributes

model[RW]
result[RW]

Public Class Methods

new(dataset) click to toggle source
# File lib/query-interface-server/transformations/sequel_transformer.rb, line 7
def initialize(dataset)
  if !dataset.instance_variable_get(:@opts)[:select]
    dataset = dataset.select_all(dataset.model.table_name)
  end
  self.result = dataset
end

Public Instance Methods

context(param) click to toggle source
# File lib/query-interface-server/transformations/sequel_transformer.rb, line 86
def context(param)
  name = "#{param}_dataset"
  if self.result.respond_to?(name)
    result = self.result.send(name)
  else
    raise Exception, "method #{name} not found"
  end
  result.select_all(result.model.table_name)
end
count(param) click to toggle source
# File lib/query-interface-server/transformations/sequel_transformer.rb, line 100
def count(param)
  {count: self.result.count}
end
default_order() click to toggle source
# File lib/query-interface-server/transformations/sequel_transformer.rb, line 48
def default_order
  self.order(self.result.model.primary_key.to_s)
end
exclude(param) click to toggle source
# File lib/query-interface-server/transformations/sequel_transformer.rb, line 57
def exclude(param)
  self.result.query_transformation(:exclude, param['field'].to_sym, param['value'])
end
filter(param) click to toggle source
# File lib/query-interface-server/transformations/sequel_transformer.rb, line 61
def filter(param)
  self.result.query_transformation(:filter, param['field'].to_sym, param['value'])
end
first(param) click to toggle source
# File lib/query-interface-server/transformations/sequel_transformer.rb, line 124
def first(param)
  self.default_order.first
end
id_selector() click to toggle source
# File lib/query-interface-server/transformations/sequel_transformer.rb, line 52
def id_selector
  primary_key = self.result.model.primary_key ? self.result.model.primary_key : :id
  Sequel.qualify(self.result.model.table_name, primary_key)
end
instance(param) click to toggle source
# File lib/query-interface-server/transformations/sequel_transformer.rb, line 82
def instance(param)
  self.result.filter(self.id_selector => param).first
end
last(param) click to toggle source
# File lib/query-interface-server/transformations/sequel_transformer.rb, line 128
def last(param)
  self.default_order.last
end
map_ids(param) click to toggle source
# File lib/query-interface-server/transformations/sequel_transformer.rb, line 96
def map_ids(param)
  self.default_order.select_map(self.id_selector)
end
order(param) click to toggle source
# File lib/query-interface-server/transformations/sequel_transformer.rb, line 73
def order(param)
  direction = :asc
  if param.starts_with?('-')
    param = param[1..-1]
    direction = :desc
  end
  self.result.query_transformation(:order, param.to_sym, direction)
end
paginate(param) click to toggle source
# File lib/query-interface-server/transformations/sequel_transformer.rb, line 119
def paginate(param)
  context = self.default_order
  {total: context.count, objects: context.paginate(param['page'].to_i, param['per_page'].to_i)}
end
result_type() click to toggle source
# File lib/query-interface-server/transformations/sequel_transformer.rb, line 22
def result_type
  if self.result.is_a?(Sequel::Dataset)
    :collection
  elsif self.result.is_a?(Sequel::Model)
    :instance
  else
    :atomic
  end
end
run(transformations, add_default_order=true) click to toggle source
# File lib/query-interface-server/transformations/sequel_transformer.rb, line 14
def run(transformations, add_default_order=true)
  transformations.each do |transformation|
    method, param = self.validate(transformation)
    self.result = self.send(method, param)
  end
  (add_default_order && self.result_type == :collection ? self.default_order : self.result)
end
schema() click to toggle source
# File lib/query-interface-server/transformations/sequel_transformer.rb, line 104
def schema
  Hash[self.result.db.schema(self.result.model.table_name)]
end
update(param) click to toggle source
# File lib/query-interface-server/transformations/sequel_transformer.rb, line 108
def update(param)
  data = Hash[param.map do |field, value|
    field = field.to_sym
    [field, self.result.query_transformation(:update, field, value)]
  end]
  if not data.include?(:updated_at) and self.schema.include?(:updated_at)
    data[:updated_at] = DateTime.now
  end
  {updated_count: self.result.update(data)}
end
validate(transformation) click to toggle source
# File lib/query-interface-server/transformations/sequel_transformer.rb, line 32
def validate(transformation)
  constraints = {
    exclude: :collection, filter: :collection, with: :collection, order: :collection,
    instance: :collection, context: :instance, map_ids: :collection,
    paginate: :collection, first: :collection, last: :collection, count: :collection,
    update: :collection,
  }
  method = transformation['transformation'].to_sym
  raise Exception, "#{method}" unless constraints.has_key?(method)
  param = transformation['parameter']
  unless self.result_type == constraints[method]
    raise Exception, "expected: #{description[:accepts]}, got: #{self.result_type}"
  end
  return [method, param]
end
with(param) click to toggle source
# File lib/query-interface-server/transformations/sequel_transformer.rb, line 65
def with(param)
  args = []
  if param.has_key?('param')
    args << param['param']
  end
  self.result.query_transformation(:with, param['field'].to_sym, *args)
end