Class: BazaModels::Query
- Inherits:
-
Object
show all
- Defined in:
- lib/baza_models/query.rb
Defined Under Namespace
Classes: Inspector, Not, SqlGenerator
Instance Attribute Summary collapse
Instance Method Summary
collapse
Constructor Details
#initialize(args) ⇒ Query
Returns a new instance of Query.
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
# File 'lib/baza_models/query.rb', line 8
def initialize(args)
@args = args
@model = @args[:model]
@db = @model.db
raise "No database?" unless @db
@selects = args[:selects] || []
@wheres = args[:wheres] || []
@includes = args[:includes] || []
@joins = args[:joins] || []
@groups = args[:groups] || []
@orders = args[:orders] || []
@limit = args[:limit]
@joins_tracker = {}
end
|
Instance Attribute Details
#_previous_model ⇒ Object
Returns the value of attribute _previous_model.
6
7
8
|
# File 'lib/baza_models/query.rb', line 6
def _previous_model
@_previous_model
end
|
#_relation ⇒ Object
Returns the value of attribute _relation.
6
7
8
|
# File 'lib/baza_models/query.rb', line 6
def _relation
@_relation
end
|
Instance Method Details
#<<(model) ⇒ Object
312
313
314
315
316
317
318
319
320
321
322
323
|
# File 'lib/baza_models/query.rb', line 312
def <<(model)
raise "No previous model set" unless @_previous_model
raise "No relation" unless @_relation
if model.persisted?
model.update_attributes!(@_relation.fetch(:foreign_key) => @_previous_model.id)
else
autoloaded_cache_or_create << model
end
self
end
|
#<=(_other) ⇒ Object
330
331
332
|
# File 'lib/baza_models/query.rb', line 330
def <=(_other)
false
end
|
#accessible_by(ability, action = :index) ⇒ Object
326
327
328
|
# File 'lib/baza_models/query.rb', line 326
def accessible_by(ability, action = :index)
ability.model_adapter(self, action).database_records
end
|
#all ⇒ Object
26
27
28
|
# File 'lib/baza_models/query.rb', line 26
def all
self
end
|
#any? ⇒ Boolean
30
31
32
33
34
35
36
|
# File 'lib/baza_models/query.rb', line 30
def any?
if @db.query(clone.select(:id).limit(1).to_sql).fetch
return true
else
return false
end
end
|
#count ⇒ Object
46
47
48
49
50
51
52
53
54
55
56
57
|
# File 'lib/baza_models/query.rb', line 46
def count
if @_previous_model && @_previous_model.new_record?
return autoloaded_cache_or_create.length
else
query = clone
query.instance_variable_set(:@selects, [])
query = clone.select("COUNT(*) AS count")
@db.query(query.to_sql).fetch.fetch(:count)
end
end
|
#destroy_all ⇒ Object
300
301
302
|
# File 'lib/baza_models/query.rb', line 300
def destroy_all
each(&:destroy!)
end
|
#each ⇒ Object
260
261
262
263
264
|
# File 'lib/baza_models/query.rb', line 260
def each
to_enum.each do |model|
yield model
end
end
|
#empty? ⇒ Boolean
38
39
40
|
# File 'lib/baza_models/query.rb', line 38
def empty?
!any?
end
|
#find(id) ⇒ Object
83
84
85
86
87
88
89
90
91
92
93
|
# File 'lib/baza_models/query.rb', line 83
def find(id)
model = clone.where(id: id).limit(1).to_enum.first
if model
model.__send__(:fire_callbacks, :after_find)
else
raise BazaModels::Errors::RecordNotFound
end
model
end
|
#find_by(args) ⇒ Object
95
96
97
|
# File 'lib/baza_models/query.rb', line 95
def find_by(args)
clone.where(args).limit(1).to_enum.first
end
|
#find_each ⇒ Object
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
|
# File 'lib/baza_models/query.rb', line 266
def find_each
query = clone
query.instance_variable_set(:@order, [])
query.instance_variable_set(:@limit, nil)
query = query.order(:id)
offset = 0
loop do
query = query.offset(offset, 1000)
offset += 1000
count = 0
query.each do |model|
yield model
count += 1
end
break if count == 0
end
end
|
#find_first(args) ⇒ Object
288
289
290
|
# File 'lib/baza_models/query.rb', line 288
def find_first(args)
clone.where(args).first
end
|
#first ⇒ Object
99
100
101
102
103
104
105
106
107
108
|
# File 'lib/baza_models/query.rb', line 99
def first
return autoloaded_cache.first if should_use_autoload?
query = clone.limit(1)
orders = query.instance_variable_get(:@orders)
query = query.order(:id) if orders.empty?
query.to_enum.first
end
|
#group(name) ⇒ Object
200
201
202
203
204
205
206
207
208
209
210
|
# File 'lib/baza_models/query.rb', line 200
def group(name)
if name.is_a?(Symbol)
@groups << "`#{@model.table_name}`.`#{name}`"
elsif name.is_a?(String)
@groups << name
else
raise "Didn't know how to group by that argument: #{name}"
end
self
end
|
#includes(name) ⇒ Object
145
146
147
148
|
# File 'lib/baza_models/query.rb', line 145
def includes(name)
@includes << name
self
end
|
#inspect ⇒ Object
308
309
310
|
# File 'lib/baza_models/query.rb', line 308
def inspect
to_s
end
|
#joins(*arguments) ⇒ Object
188
189
190
191
192
193
194
195
196
197
198
|
# File 'lib/baza_models/query.rb', line 188
def joins(*arguments)
BazaModels::Query::Inspector.new(
query: self,
model: @model,
argument: arguments,
joins: @joins,
joins_tracker: @joins_tracker
).execute
self
end
|
#last ⇒ Object
110
111
112
113
114
115
116
117
118
119
|
# File 'lib/baza_models/query.rb', line 110
def last
return autoloaded_cache.last if should_use_autoload?
query = clone.limit(1)
orders = query.instance_variable_get(:@orders)
query = query.order(:id) if orders.empty?
query.reverse_order.to_enum.first
end
|
#length ⇒ Object
59
60
61
62
63
64
65
|
# File 'lib/baza_models/query.rb', line 59
def length
if @_previous_model && !any_wheres_other_than_relation? && @_previous_model.autoloads[@_relation.fetch(:relation_name)]
@_previous_model.autoloads[@_relation.fetch(:relation_name)].length
else
count
end
end
|
#limit(limit) ⇒ Object
140
141
142
143
|
# File 'lib/baza_models/query.rb', line 140
def limit(limit)
@limit = limit
self
end
|
#map(&blk) ⇒ Object
229
230
231
|
# File 'lib/baza_models/query.rb', line 229
def map(&blk)
to_enum.map(&blk)
end
|
#new(attributes) ⇒ Object
72
73
74
75
76
77
78
79
80
81
|
# File 'lib/baza_models/query.rb', line 72
def new(attributes)
raise "No previous model" unless @_previous_model
raise "No relation" unless @_relation
new_sub_model = @model.new(@_relation.fetch(:foreign_key) => @_previous_model.id)
new_sub_model.assign_attributes(attributes)
autoloaded_cache_or_create << new_sub_model
new_sub_model
end
|
#none? ⇒ Boolean
42
43
44
|
# File 'lib/baza_models/query.rb', line 42
def none?
!any?
end
|
#offset(offset) ⇒ Object
135
136
137
138
|
# File 'lib/baza_models/query.rb', line 135
def offset(offset)
@offset = offset
self
end
|
#order(name) ⇒ Object
212
213
214
215
216
217
218
219
220
221
222
|
# File 'lib/baza_models/query.rb', line 212
def order(name)
if name.is_a?(Symbol)
@orders << "`#{@model.table_name}`.`#{name}`"
elsif name.is_a?(String)
@orders << name
else
raise "Didn't know how to order by that argument: #{name}"
end
self
end
|
#page(some_page) ⇒ Object
339
340
341
342
343
344
|
# File 'lib/baza_models/query.rb', line 339
def page(some_page)
some_page ||= 1
offset = (some_page.to_i - 1) * per
clone.offset(offset).limit(30)
end
|
#per ⇒ Object
346
347
348
|
# File 'lib/baza_models/query.rb', line 346
def per
@per ||= 30
end
|
#ransack(params) ⇒ Object
358
359
360
|
# File 'lib/baza_models/query.rb', line 358
def ransack(params)
BazaModels::Ransacker.new(class: @model, params: params, query: self)
end
|
#reverse_order ⇒ Object
224
225
226
227
|
# File 'lib/baza_models/query.rb', line 224
def reverse_order
@reverse_order = true
self
end
|
#sanitize_sql(value) ⇒ Object
334
335
336
337
|
# File 'lib/baza_models/query.rb', line 334
def sanitize_sql(value)
return value if value.is_a?(Array) || value.is_a?(Integer) || value.is_a?(Integer)
"'#{@db.esc(value)}'"
end
|
#select(select = nil, &blk) ⇒ Object
121
122
123
124
125
126
127
128
129
130
131
132
133
|
# File 'lib/baza_models/query.rb', line 121
def select(select = nil, &blk)
if !select && blk
to_enum.select(&blk)
else
if select.is_a?(Symbol)
@selects << "`#{@model.table_name}`.`#{select}`"
else
@selects << select
end
self
end
end
|
#size ⇒ Object
67
68
69
70
|
# File 'lib/baza_models/query.rb', line 67
def size
length
end
|
#to_a ⇒ Object
292
293
294
|
# File 'lib/baza_models/query.rb', line 292
def to_a
to_enum.to_a
end
|
#to_enum ⇒ Object
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
|
# File 'lib/baza_models/query.rb', line 233
def to_enum
return autoloaded_cache if should_use_autoload?
array_enum = ArrayEnumerator.new do |yielder|
@db.query(to_sql).each do |data|
yielder << @model.new(data, init: true)
end
end
if @includes.empty?
return array_enum
else
array = array_enum.to_a
if @includes.any? && array.any?
autoloader = BazaModels::Autoloader.new(
models: array,
autoloads: @includes,
db: @db
)
autoloader.autoload
end
return array
end
end
|
#to_s ⇒ Object
304
305
306
|
# File 'lib/baza_models/query.rb', line 304
def to_s
"#<BazaModels::Query class=#{@model.name} wheres=#{@wheres}>"
end
|
#total_pages ⇒ Object
350
351
352
353
354
355
356
|
# File 'lib/baza_models/query.rb', line 350
def total_pages
pages_count = (count.to_f / @per.to_f)
pages_count = 1 if pages_count.nan? || pages_count == Float::INFINITY
pages_count = pages_count.to_i
pages_count = 1 if pages_count == 0
pages_count
end
|
#where(args = nil) ⇒ Object
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
|
# File 'lib/baza_models/query.rb', line 150
def where(args = nil)
if args.is_a?(String)
@wheres << "(#{args})"
elsif args.is_a?(Array)
str = args.shift
args.each do |arg|
if arg.is_a?(Symbol)
arg = "`#{@model.table_name}`.`#{@db.escape_column(arg)}`"
elsif arg.is_a?(FalseClass)
arg = "0"
elsif arg.is_a?(TrueClass)
arg = "1"
else
arg = @db.sqlval(arg)
end
str.sub!("?", arg)
end
@wheres << "(#{str})"
elsif args == nil
return Not.new(query: self)
else
args.each do |key, value|
if value.is_a?(Hash)
value.each do |hash_key, hash_value|
@wheres << "`#{key}`.`#{key_convert(hash_key, hash_value)}` #{value_with_mode(value_convert(hash_value))}"
end
else
@wheres << "`#{@model.table_name}`.`#{key_convert(key, value)}` #{value_with_mode(value_convert(value))}"
end
end
end
self
end
|