Class: QueryInterface::Server::Transformations::SequelTransformer

Inherits:
Object
  • Object
show all
Defined in:
lib/query-interface-server/transformations/sequel_transformer.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(dataset) ⇒ SequelTransformer

Returns a new instance of SequelTransformer.



7
8
9
# File 'lib/query-interface-server/transformations/sequel_transformer.rb', line 7

def initialize(dataset)
  self.result = dataset.select_all(dataset.model.table_name)
end

Instance Attribute Details

#modelObject

Returns the value of attribute model.



5
6
7
# File 'lib/query-interface-server/transformations/sequel_transformer.rb', line 5

def model
  @model
end

#resultObject

Returns the value of attribute result.



5
6
7
# File 'lib/query-interface-server/transformations/sequel_transformer.rb', line 5

def result
  @result
end

Instance Method Details

#context(param) ⇒ Object



82
83
84
85
86
87
88
89
90
# File 'lib/query-interface-server/transformations/sequel_transformer.rb', line 82

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) ⇒ Object



96
97
98
# File 'lib/query-interface-server/transformations/sequel_transformer.rb', line 96

def count(param)
  {count: self.result.count}
end

#default_orderObject



48
49
50
# File 'lib/query-interface-server/transformations/sequel_transformer.rb', line 48

def default_order
  self.order(self.result.model.primary_key.to_s)
end

#filter(param) ⇒ Object



57
58
59
# File 'lib/query-interface-server/transformations/sequel_transformer.rb', line 57

def filter(param)
  self.result.query_transformation(:filter, param['field'].to_sym, param['value'])
end

#first(param) ⇒ Object



105
106
107
# File 'lib/query-interface-server/transformations/sequel_transformer.rb', line 105

def first(param)
  self.default_order.first
end

#id_selectorObject



52
53
54
55
# 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
  "#{self.result.model.table_name}__#{primary_key}".to_sym
end

#instance(param) ⇒ Object



78
79
80
# File 'lib/query-interface-server/transformations/sequel_transformer.rb', line 78

def instance(param)
  self.result.filter(self.id_selector => param).first
end

#last(param) ⇒ Object



109
110
111
# File 'lib/query-interface-server/transformations/sequel_transformer.rb', line 109

def last(param)
  self.default_order.last
end

#map_ids(param) ⇒ Object



92
93
94
# File 'lib/query-interface-server/transformations/sequel_transformer.rb', line 92

def map_ids(param)
  self.default_order.select(self.id_selector).map(&:id)
end

#order(param) ⇒ Object



69
70
71
72
73
74
75
76
# File 'lib/query-interface-server/transformations/sequel_transformer.rb', line 69

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) ⇒ Object



100
101
102
103
# File 'lib/query-interface-server/transformations/sequel_transformer.rb', line 100

def paginate(param)
  context = self.default_order
  {total: context.count, objects: context.paginate(param['page'].to_i, param['per_page'].to_i)}
end

#result_typeObject



19
20
21
22
23
24
25
26
27
# File 'lib/query-interface-server/transformations/sequel_transformer.rb', line 19

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) ⇒ Object



11
12
13
14
15
16
17
# File 'lib/query-interface-server/transformations/sequel_transformer.rb', line 11

def run(transformations)
  transformations.each do |transformation|
    method, param = self.validate(transformation)
    self.result = self.send(method, param)
  end
  (self.result_type == :collection ? self.default_order : self.result)
end

#tableObject



44
45
46
# File 'lib/query-interface-server/transformations/sequel_transformer.rb', line 44

def table
  self.result.model.table_name
end

#validate(transformation) ⇒ Object

Raises:

  • (UnknownTransformation)


29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/query-interface-server/transformations/sequel_transformer.rb', line 29

def validate(transformation)
  contraints = {
    filter: :collection, with: :collection,order: :collection,
    instance: :collection, context: :instance, map_ids: :collection,
    paginate: :collection, first: :collection, last: :collection, count: :collection
  }
  method = transformation['transformation'].to_sym
  raise UnknownTransformation, "#{method}" unless contraints.has_key?(method)
  param = transformation['parameter']
  unless self.result_type == contraints[method]
    raise InvalidContextException, "expected: #{description[:accepts]}, got: #{self.result_type}"
  end
  return [method, param]
end

#with(param) ⇒ Object



61
62
63
64
65
66
67
# File 'lib/query-interface-server/transformations/sequel_transformer.rb', line 61

def with(param)
  args = []
  if param.has_key?('param')
    args << param['param']
  end
  self.result.query_transformation(:with, param['field'].to_sym, *args)
end