Class: Bodhi::Query

Inherits:
Object
  • Object
show all
Defined in:
lib/bodhi-slam/queries.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(klass, controller = "resources") ⇒ Query

Returns a new instance of Query.



5
6
7
8
9
10
11
12
# File 'lib/bodhi-slam/queries.rb', line 5

def initialize(klass, controller="resources")
  @controller = controller
  @klass = Object.const_get(klass.to_s)
  @criteria = {}
  @fields = []
  @paging = {}
  @sorting = {}
end

Instance Attribute Details

#contextObject (readonly)

Returns the value of attribute context.



3
4
5
# File 'lib/bodhi-slam/queries.rb', line 3

def context
  @context
end

#controllerObject (readonly)

Returns the value of attribute controller.



3
4
5
# File 'lib/bodhi-slam/queries.rb', line 3

def controller
  @controller
end

#criteriaObject (readonly)

Returns the value of attribute criteria.



3
4
5
# File 'lib/bodhi-slam/queries.rb', line 3

def criteria
  @criteria
end

#fieldsObject (readonly)

Returns the value of attribute fields.



3
4
5
# File 'lib/bodhi-slam/queries.rb', line 3

def fields
  @fields
end

#klassObject (readonly)

Returns the value of attribute klass.



3
4
5
# File 'lib/bodhi-slam/queries.rb', line 3

def klass
  @klass
end

#pagingObject (readonly)

Returns the value of attribute paging.



3
4
5
# File 'lib/bodhi-slam/queries.rb', line 3

def paging
  @paging
end

#sortingObject (readonly)

Returns the value of attribute sorting.



3
4
5
# File 'lib/bodhi-slam/queries.rb', line 3

def sorting
  @sorting
end

#urlObject (readonly)

Returns the value of attribute url.



3
4
5
# File 'lib/bodhi-slam/queries.rb', line 3

def url
  @url
end

Instance Method Details

#allObject



116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# File 'lib/bodhi-slam/queries.rb', line 116

def all
  if context.nil?
    raise ArgumentError.new("a Bodhi::Context is required to query the API")
  end

  if context.invalid?
    raise Bodhi::ContextErrors.new(context.errors.messages), context.errors.to_a.to_s
  end

  result = context.connection.get do |request|
    request.url self.url
    request.headers[context.credentials_header] = context.credentials
  end

  if result.status != 200
    raise Bodhi::ApiErrors.new(body: result.body, status: result.status), "status: #{result.status}, body: #{result.body}"
  end

  result.body.map{ |attributes| klass.new(attributes.merge(bodhi_context: context)) }
end

#clear!Object



14
15
16
17
18
19
20
# File 'lib/bodhi-slam/queries.rb', line 14

def clear!
  @context = nil
  @criteria = {}
  @fields.clear
  @paging.clear
  @sorting.clear
end

#countObject



74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/bodhi-slam/queries.rb', line 74

def count
  if context.nil?
    raise ArgumentError.new("a Bodhi::Context is required to query the API")
  end

  if context.invalid?
    raise Bodhi::ContextErrors.new(context.errors.messages), context.errors.to_a.to_s
  end

  result = context.connection.get do |request|
    request.url self.url.gsub(klass.name, "#{klass}/count")
    request.headers[context.credentials_header] = context.credentials
  end

  if result.status != 200
    raise Bodhi::ApiErrors.new(body: result.body, status: result.status), "status: #{result.status}, body: #{result.body}"
  end

  result.body["count"]
end

#deleteObject



95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/bodhi-slam/queries.rb', line 95

def delete
  if context.nil?
    raise ArgumentError.new("a Bodhi::Context is required to query the API")
  end

  if context.invalid?
    raise Bodhi::ContextErrors.new(context.errors.messages), context.errors.to_a.to_s
  end

  result = context.connection.delete do |request|
    request.url self.url
    request.headers[context.credentials_header] = context.credentials
  end

  if result.status != 200
    raise Bodhi::ApiErrors.new(body: result.body, status: result.status), "status: #{result.status}, body: #{result.body}"
  end

  result.body
end

#firstObject



137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
# File 'lib/bodhi-slam/queries.rb', line 137

def first
  if context.nil?
    raise ArgumentError.new("a Bodhi::Context is required to query the API")
  end

  if context.invalid?
    raise Bodhi::ContextErrors.new(context.errors.messages), context.errors.to_a.to_s
  end

  result = context.connection.get do |request|
    request.url self.url
    request.headers[context.credentials_header] = context.credentials
  end

  if result.status != 200
    raise Bodhi::ApiErrors.new(body: result.body, status: result.status), "status: #{result.status}, body: #{result.body}"
  end

  result.body.map{ |attributes| klass.new(attributes.merge(bodhi_context: context)) }.first
end

#from(context) ⇒ Object



179
180
181
182
183
184
185
186
# File 'lib/bodhi-slam/queries.rb', line 179

def from(context)
  unless context.is_a? Bodhi::Context
    raise ArgumentError.new("Expected Bodhi::Context but received #{context.class}")
  end

  @context = context
  self
end

#lastObject



158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
# File 'lib/bodhi-slam/queries.rb', line 158

def last
  if context.nil?
    raise ArgumentError.new("a Bodhi::Context is required to query the API")
  end

  if context.invalid?
    raise Bodhi::ContextErrors.new(context.errors.messages), context.errors.to_a.to_s
  end

  result = context.connection.get do |request|
    request.url self.url
    request.headers[context.credentials_header] = context.credentials
  end

  if result.status != 200
    raise Bodhi::ApiErrors.new(body: result.body, status: result.status), "status: #{result.status}, body: #{result.body}"
  end

  result.body.map{ |attributes| klass.new(attributes.merge(bodhi_context: context)) }.last
end

#limit(number) ⇒ Object



213
214
215
216
217
218
219
220
221
222
223
224
# File 'lib/bodhi-slam/queries.rb', line 213

def limit(number)
  unless number.is_a? Integer
    raise ArgumentError.new("Expected Integer but received #{number.class}")
  end

  unless number <= 100
    raise ArgumentError.new("Expected limit to be less than or equal to 100 but received #{number}")
  end

  @paging[:limit] = number
  self
end

#page(number) ⇒ Object



226
227
228
229
230
231
232
233
# File 'lib/bodhi-slam/queries.rb', line 226

def page(number)
  unless number.is_a? Integer
    raise ArgumentError.new("Expected Integer but received #{number.class}")
  end

  @paging[:page] = number
  self
end

#select(field_names) ⇒ Object



201
202
203
204
205
206
207
208
209
210
211
# File 'lib/bodhi-slam/queries.rb', line 201

def select(field_names)
  unless field_names.is_a? String
    raise ArgumentError.new("Expected String but received #{field_names.class}")
  end

  fields_array = field_names.split(',')
  @fields << fields_array
  @fields.flatten!
  @fields.uniq!
  self
end

#sort(field, order = nil) ⇒ Object



235
236
237
238
239
240
241
242
243
244
245
246
# File 'lib/bodhi-slam/queries.rb', line 235

def sort(field, order=nil)
  unless field.is_a? String
    raise ArgumentError.new("Expected String but received #{field.class}")
  end

  unless order.nil?
    @sorting[:order] = order
  end

  @sorting[:field] = field
  self
end

#where(query) ⇒ Object Also known as: and



188
189
190
191
192
193
194
195
196
197
198
# File 'lib/bodhi-slam/queries.rb', line 188

def where(query)
  if query.is_a?(String)
    json = JSON.parse(query)
    query = Bodhi::Support.symbolize_keys(json)
  else
    query = Bodhi::Support.symbolize_keys(query)
  end

  @criteria.merge!(query)
  self
end